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 2016/08/01 00:07:50 UTC

[01/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Repository: incubator-juneau
Updated Branches:
  refs/heads/master [created] 7e4f63e6d


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/package.html
new file mode 100755
index 0000000..7a23cc7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/package.html
@@ -0,0 +1,2321 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>XML serialization and parsing support</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>XML support overview</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#OverviewExample'>Example</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#XmlSerializer'>XmlSerializer class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#XmlAnnotation'>@Xml annotations</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#XmlChildName'>@Xml.childName()</a></p>
+			<li><p><a class='doclink' href='#XmlFormat'>@Xml.format()</a></p>
+			<li><p><a class='doclink' href='#XmlContentHandler'>@Xml.contentHandler()</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Namespaces'>Namespaces</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#AutoDetectNamespaces'>Auto-detection of namespaces</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#UriProperties'>URI properties</a></p>
+		<li><p><a class='doclink' href='#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
+		<li><p><a class='doclink' href='#Collections'>Collections</a></p>
+		<li><p><a class='doclink' href='#XmlSchemaSupport'>XML-Schema support</a></p>
+		<li><p><a class='doclink' href='#Recursion'> Non-tree models and recursion detection</a></p>
+		<li><p><a class='doclink' href='#SerializerConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#SerializerOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#XmlParser'>XmlParser class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#GenericParsing'>Parsing into generic POJO models</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#AddJsonTypeAttr'>Serializing with JSON-type attributes</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#ParserConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#ParserOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#RestApiSupport'>REST API support</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#RestServerSupport'>REST server support</a></p>
+		<ol>
+		<li><p><a class='doclink' href='#RestServletDefault'>Using RestServletDefault</a></p>
+		<li><p><a class='doclink' href='#RestServlet'>Using RestServlet with annotations</a></p>
+		<li><p><a class='doclink' href='#DefaultProvider'>Using JAX-RS DefaultProvider</a></p>
+		<li><p><a class='doclink' href='#BaseProvider'>Using JAX-RS BaseProvider with annotations</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#RestClientSupport'>REST client support</a></p>
+	</ol>	
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - XML support overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports converting arbitrary POJOs to and from XML using ultra-efficient serializers and parsers.<br>
+		The XML serializer converts POJOs directly to XML without the need for intermediate DOM objects.<br>
+		Likewise, the XML parser uses a STaX parser and creates POJOs directly without intermediate DOM objects. 
+	</p>
+	<p>
+		Unlike frameworks such as JAXB, Juno does not require POJO classes to be annotated to produce
+			and consume XML.<br>
+		For example, it can serialize and parse instances of any of the following POJO types:
+	</p>
+	<ul>
+		<li>Java primitive objects (e.g. <code>String</code>, <code>Integer</code>, <code>Boolean</code>, <code>Float</code>).
+		<li>Java collections framework objects (e.g. <code>HashSet</code>, <code>TreeMap</code>) containing anything on this list.
+		<li>Multi-dimensional arrays of any type on this list.
+		<li>Java Beans with properties of any type on this list.
+		<li>Classes with standard transformations to and from <code>Strings</code> (e.g. classes containing <code>toString()</code>, <code>fromString()</code>, <code>valueOf()</code>, <code>constructor(String)</code>).
+	</ul>
+	<p>
+		In addition to the types shown above, Juno includes the ability to define filters to transform non-standard object and 
+			property types to serializable forms (e.g. to transform <code>Calendars</code> to and from <code>ISO8601</code> strings, 
+			or <code>byte[]</code> arrays to and from base-64 encoded strings).<br>
+		These filters can be associated with serializers/parsers, or can be associated with classes or bean properties through type and method annotations.
+	</p>
+	<p>
+		Refer to <a href='../package-summary.html#PojoCategories' class='doclink'>POJO Categories</a> for a complete definition of supported POJOs.
+	</p>
+	<p>
+		While annotations are not required to produce or consume XML, several XML annotations are provided 
+			for handling namespaces and fine-tuning the format of the XML produced.
+	</p>
+	<h6 class='topic'>Prerequisites</h6>
+	<p>
+		The Juno XML serialization and parsing support does not require any external prerequisites.  
+		It only requires Java 1.6 or above.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="OverviewExample"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - XML support overview - example</h3>
+	<div class='topic'>
+		<p>
+			The example shown here is from the Address Book resource located in the <code>com.ibm.juno.sample.war</code> application.<br>
+			The POJO model consists of a <code>List</code> of <code>Person</code> beans, with each <code>Person</code> containing
+				zero or more <code>Address</code> beans.
+		</p>
+		<p>
+			When you point a browser at <code>/sample/addressBook</code>, the POJO is rendered as HTML:
+		</p>
+		<img class='bordered' src="doc-files/Example_HTML.png">
+		<p>
+			By appending <code>?Accept=<i>mediaType</i>&plainText=true</code> to the URL, you can view the data in the various supported XML formats:
+		</p>
+		
+		<h6 class='figure'>Normal XML</h6>
+		<img class='bordered' src="doc-files/Example_XML.png">
+		
+		<h6 class='figure'>Simplified XML</h6>
+		<img class='bordered' src="doc-files/Example_XMLSimple.png">
+
+		<p>
+			In addition to serializing POJOs to XML, Juno includes support for serializing the POJO metamodel to XML Schema, with 
+				support for multiple namespaces.
+		</p>
+		
+		<h6 class='figure'>XML Schema</h6>
+		<img class='bordered' src="doc-files/Example_XMLSchema.png">
+
+	</div>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="XmlSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - XmlSerializer class</h2>
+<div class='topic'>
+	<p>
+		{@link com.ibm.juno.core.xml.XmlSerializer} is the class used to convert POJOs to XML.<br>
+		{@link com.ibm.juno.core.xml.XmlDocSerializer} is a subclass that adds an XML declaration element to the output before the POJO is serialized.
+	</p>	
+	<p>
+		The XML serializer includes many configurable settings.<br>
+		Static reusable instances of XML serializers are provided with commonly-used settings:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT} - All default settings.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_SQ} - Use single quotes on attributes.  Typically useful for testing since it makes string comparison simpler.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_SQ_READABLE} - Use single quotes on attributes and add whitespace for readability.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_XMLJSON} - Add JSON attribute tags on non-String values for full JSON equivalency.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_XMLJSON_SQ} - Same as DEFAULT_XMLJSON, but use single quotes on attributes.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_SIMPLE} - Don't serialize XML namespaces.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_SIMPLE_SQ} - Same as DEFAULT_SIMPLE, but use single quotes on attributes.
+		<li>{@link com.ibm.juno.core.xml.XmlSerializer#DEFAULT_SIMPLE_XMLJSON_SQ} - Same as DEFAULT_XMLJSON, but ignore XML namespaces and use single quotes on attributes.
+	</ul>
+	<p>
+		In addition, DTO beans are provided that use the XML serializer and parser for the following languages:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.dto.atom} - ATOM beans.
+		<li>{@link com.ibm.juno.core.dto.cognos} - Cognos beans.
+	</ul>
+	<p>
+		Refer to the package-level Javadocs for more information about those formats.
+	</p>
+	<h6 class='topic'>Notes about examples</h6>
+	<p>
+		The examples shown in this document will use single-quote, readable settings.<br>
+		For brevity, the examples will use public fields instead of getters/setters to reduce the size of the examples.<br>
+		In the real world, you'll typically want to use standard bean getters and setters.
+	</p>
+	<p>
+		To start off simple, we'll begin with the following simplified bean and build upon it.
+	</p>
+	<p class='bcode'>
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name) {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+		}
+	}
+	</p>
+	<p>
+		The following code shows how to convert this to simple XML (no namespaces):
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new serializer with readable output, no namespaces yet.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_enableNamespaces</jsf>, <jk>false</jk>);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+
+	<jc>// Serialize the bean to XML.</jc>
+	String xml = s.serialize(p);
+	</p>
+	<p>
+		<i>Side note:</i>  Serializers can also be created by cloning existing serializers:
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new serializer with readable output, no namespaces yet, but use cloning method.</jc>
+	XmlSerializer s = XmlSerializer.<jsf>DEFAULT_SQ_READABLE</jsf>.clone()
+		.setProperty(XmlSerializerProperties.<jsf>XML_enableNamespaces</jsf>, <jk>false</jk>);
+	</p>
+	<p>
+		The code above produces the following output:
+	</p>
+	<p class='bcode'>
+	<xt>&lt;object&gt;</xt>
+		<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+	</p>
+	<p>
+		The first thing you may notice is how the bean instance is represented by the element <xt>&lt;object&gt;</xt>.<br>
+		When objects have no name associated with them, Juno provides a default generalized name that maps to the equivalent JSON data type.<br>
+		Some cases when objects do not have names:
+	</p>
+	<ul>
+		<li>Root element
+		<li>Object in an array, collection, or map.
+	</ul>
+	<p>
+		The generalized name reflects the JSON-equivalent data type.<br>
+		The full list of generalized element names are:
+	</p>
+	<ul>
+		<li><xt>&lt;object&gt;</xt> - A bean or <code>Map</code> element.
+		<li><xt>&lt;array&gt;</xt> - An array or <code>Collection</code> element.
+		<li><xt>&lt;string&gt;</xt> - A string value.
+		<li><xt>&lt;number&gt;</xt> - An int or float value.
+		<li><xt>&lt;boolean&gt;</xt> - A boolean value.
+		<li><xt>&lt;null/&gt;</xt> - A null value.
+	</ul>
+	<p>
+		Juno produces JSON-equivalent XML, meaning any valid JSON document can be losslessly converted into an XML equivalent.<br>  
+		In fact, all of the Juno serializers and parsers are built upon this JSON-equivalency.
+	</p>
+	
+	<!-- ======================================================================================================== -->
+	<a id="XmlAnnotation"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.1 - @Xml annotations</h3>
+	<div class='topic'>
+		<p>
+			Just because Juno allows you to serialize ordinary POJOs to XML doesn't mean you are limited to just JSON-equivalent XML.<br>
+			Several annotations are provided in the {@link com.ibm.juno.core.xml.annotation} package for customizing the output.
+		</p>
+
+		<!-- ======================================================================================================== -->
+		<a id="XmlName"></a>
+		<h4 class='topic' onclick='toggle(this)'>2.1.1 - @Xml.name()</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.xml.annotation.Xml#name()} annotation can be used to override the Juno default name on unnamed objects. 
+			</p>
+			<h6 class='figure'>Example</h6>
+			<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"person"</js>)
+	<jk>public class</jk> Person {
+		...
+			</p>
+			<h6 class='figure'>Result</h6>
+			<p class='bcode'>
+	<xt>&lt;person&gt;</xt>
+		<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+	<xt>&lt;/person&gt;</xt>
+			</p>
+		</div>
+		
+
+		<!-- ======================================================================================================== -->
+		<a id="XmlChildName"></a>
+		<h4 class='topic' onclick='toggle(this)'>2.1.2 - @Xml.childName()</h4>
+		<div class='topic'>		
+			<p>
+				The {@link com.ibm.juno.core.xml.annotation.Xml#childName()} annotation can be used to specify the name of XML 
+					child elements for bean properties of type collection or array.
+			</p>
+			<h6 class='figure'>Example</h6>
+			<p class='bcode'>
+	<jk>public class</jk> MyBean {
+		<ja>@Xml</ja>(childName=<js>"child"</js>}
+		<jk>public</jk> String[] <jf>children</jf> = {<js>"foo"</js>,<js>"bar"</js>};
+	}
+			</p>
+			<h6 class='figure'>Results without annotation</h6>
+			<p class='bcode'>
+	<xt>&lt;object&gt;</xt>
+		<xt>&lt;children&gt;</xt>
+			<xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt>
+			<xt>&lt;string&gt;</xt>bar<xt>&lt;/string&gt;</xt>
+		<xt>&lt;/children&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+			</p>
+			<h6 class='figure'>Results with annotation</h6>
+			<p class='bcode'>
+	<xt>&lt;object&gt;</xt>
+		<xt>&lt;children&gt;</xt>
+			<xt>&lt;child&gt;</xt>foo<xt>&lt;/child&gt;</xt>
+			<xt>&lt;child&gt;</xt>bar<xt>&lt;/child&gt;</xt>
+		<xt>&lt;/children&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+			</p>
+		</div>
+			
+
+		<!-- ======================================================================================================== -->
+		<a id="XmlFormat"></a>
+		<h4 class='topic' onclick='toggle(this)'>2.1.3 - @Xml.format()</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.xml.annotation.Xml#format()} annotation can be used to tweak the XML format of a POJO.<br>
+				The value is set to an enum value of type {@link com.ibm.juno.core.xml.annotation.XmlFormat}.<br>
+				This annotation can be applied to both classes and bean properties.
+			</p>
+			<h6 class='figure'>Possible values</h6>
+			<ul>
+				<li>{@link com.ibm.juno.core.xml.annotation.XmlFormat#NORMAL} - Normal formatting (default).<br><br>
+				<li>{@link com.ibm.juno.core.xml.annotation.XmlFormat#ATTR} - Render as an XML attribute when it would normally be rendered as an element.<br>
+					Can be applied to classes and properties that serialize to simple types (e.g. <code>String</code>, <code>Number</code>).<br><br>
+				<li>{@link com.ibm.juno.core.xml.annotation.XmlFormat#ELEMENT} - Render as an XML element when it would normally be rendered as an attribute.<br>
+					Can be applied to URL and ID bean properties that would normally be rendered as attributes.<br><br>
+				<li>{@link com.ibm.juno.core.xml.annotation.XmlFormat#COLLAPSED} - Prevents collections and arrays from being enclosed in an <xt>&lt;array&gt;</xt> (or named equivalent) element.<br>
+					Can be applied to properties of type collection or array, or to classes that subclass from <code>Collection</code>.<br><br>
+				<li>{@link com.ibm.juno.core.xml.annotation.XmlFormat#CONTENT} - Render property value directly as content of element.<br>
+					Can be used in combination with {@link com.ibm.juno.core.xml.annotation.Xml#contentHandler()} to produce something other than plain text, such as embedded XML.
+			</ul>
+			<h6 class='figure'>Example</h6>
+			<p class='bcode'>
+	<jk>public class</jk> MyBean {
+
+ 		<jc>// Normally, bean properties would be rendered as child elements of the bean element.</jc>
+		<jc>// Override so that it's rendered as a "f1='123'" attribute on the bean element instead.</jc>
+		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>}
+		<jk>public int</jk> f1 = 123;
+
+ 		<jc>// Normally, bean URL properties would be rendered as XML attributes on the bean element.</jc>
+		<jc>// Override so that it's rendered as an &lt;href&gt;http://foo&lt;/href&gt; child element instead.</jc>
+		<ja>@BeanProperty</ja>(uri=<jk>true</jk>)
+		<ja>@Xml</ja>(format=XmlFormat.<jsf>ELEMENT</jsf>}
+		<jk>public</jk> URL <jf>href</jf> = <jk>new</jk> URL(<js>"http://foo"</js>);
+
+		<jc>// Normally, collection properties would be grouped under a single &lt;children&gt; child element on the bean element.</jc>
+		<jc>// Override so that entries are directly children of the bean element with each entry having an element name of &lt;child&gt;.</jc>
+		<ja>@Xml</ja>(format=XmlFormat.<jsf>COLLAPSED</jsf>, childName=<js>"child"</js>}
+		<jk>public</jk> String[] <jf>children</jf> = <js>"foo"</js>,<js>"bar"</js>};
+	}
+			</p>
+			<h6 class='figure'>Results without annotation</h6>
+			<p class='bcode'>
+	<xt>&lt;object</xt> <xa>href</xa>=<js>'http://foo'</js><xt>&gt;</xt>
+		<xt>&lt;f1&gt;</xt>123<xt>&lt;/f1&gt;</xt>
+		<xt>&lt;children&gt;</xt>
+			<xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt>
+			<xt>&lt;string&gt;</xt>bar<xt>&lt;/string&gt;</xt>
+		<xt>&lt;/children&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+			</p>
+			<h6 class='figure'>Results with annotation</h6>
+			<p class='bcode'>
+	<xt>&lt;object</xt> <xa>f1</xa>=<js>'123'</js><xt>&gt;</xt>
+		<xt>&lt;href&gt;</xt>http://foo<xt>&lt;/href&gt;</xt>
+		<xt>&lt;child&gt;</xt>foo<xt>&lt;/child&gt;</xt>
+		<xt>&lt;child&gt;</xt>bar<xt>&lt;/child&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+			</p>
+			<p>
+				The {@link com.ibm.juno.core.xml.annotation.XmlFormat#CONTENT} annotation can be used to serialize a bean 
+					straight to text without any child elements.
+			</p>
+			<h6 class='figure'>Example</h6>
+			<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"MyBean"</js>)
+	<jk>public class</jk> MyBean {
+
+		<ja>@Xml</ja>(format=XmlFormat.<jsf>CONTENT</jsf>)
+		<jk>public</jk> String beanContents = <js>"This is my bean"</js>;
+	}
+			</p>	
+			<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	<xt>&lt;MyBean&gt;</xt>
+		This is my bean
+	<xt>&lt;/MyBean&gt;</xt>
+			</p>
+			<p>
+				There are some restrictions when using the <jsf>CONTENT</jsf> format:
+			</p>
+			<ul>
+				<li>A bean class can only have one property denoted with <jsf>CONTENT</jsf> format.
+				<li>A bean class cannot have any other properties that would serialize to an element (attributes are okay).
+			</ul>
+			<p>
+				The class type on the property can be anything that serializes to a simple value, like a <code>String</code> or <code>Number</code>.<br>
+				Note that filters can usually be used to convert more complex class types to simple types.
+			</p>
+		</div>
+
+
+		<!-- ======================================================================================================== -->
+		<a id="XmlContentHandler"></a>
+		<h4 class='topic' onclick='toggle(this)'>2.1.4 - @Xml.contentHandler()</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.xml.annotation.Xml#contentHandler()} annotation is an advanced feature that allows you to 
+					define your own code for serializing and parsing the contents of a serialized bean.
+			</p>
+			<p>
+				For example, the ATOM specification allows for the media type of <code>Text</code> elements to be specified via a <xa>type</xa> attribute:
+			</p>
+			<p class='bcode'>
+	<xt>&lt;feed&gt;</xt>
+		<xt>&lt;entry&gt;</xt>
+			<xt>&lt;title</xt> <xa>type</xa>=<xs>'text'</xs>&gt;</xt>
+				A &amp;lt;em&amp;gt;lot&amp;lt;/em&amp;gt; of effort went into making this effortless
+			<xt>&lt;/title&gt;</xt>
+			<xt>&lt;content</xt> <xa>type</xa>=<xs>'xhtml'</xs>&gt;</xt>
+				<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs><xt>&gt;</xt><xt>&lt;p&gt;</xt><xt>&lt;i&gt;</xt>This is the contents of this entry.<xt>&lt;/i&gt;</xt><xt>&lt;/p&gt;</xt><xt>&lt;/div&gt;</xt>
+			<xt>&lt;/content&gt;</xt>
+		<xt>&lt;/entry&gt;</xt>
+	<xt>&lt;/feed&gt;</xt>
+			</p>
+			<p>
+				To accomplish this, the {@link com.ibm.juno.core.dto.atom.Text} class uses a content handler that serializes and parses the value by inspecting the <xa>type</xa> value and then handling the content accordingly: 
+			</p>
+			<p class='bcode'>
+	<jk>public class</jk> Text <jk>extends</jk> Common {
+	
+		<jk>private</jk> String <jf>type</jf>;
+		<jk>private</jk> String <jf>text</jf>;
+	
+		<ja>@Xml</ja>(format=<jsf>ATTR</jsf>)
+		<jk>public</jk> String getType() {
+			<jk>return</jk> <jf>type</jf>;
+		}
+	
+		<jk>public</jk> Text setType(String type) {
+			<jk>this</jk>.<jf>type</jf> = type;
+			<jk>return this</jk>;
+		}
+	
+		<ja>@Xml</ja>(format=<jsf>CONTENT</jsf>, contentHandler=TextContentHandler.<jk>class</jk>)
+		<jk>public</jk> String getText() {
+			<jk>return</jk> text;
+		}
+	
+		<jk>public</jk> Text setText(String text) {
+			<jk>this</jk>.<jf>text</jf> = text;
+			<jk>return this</jk>;
+		}
+
+		<jc>// Converts the text to and from the appropriate media type.</jc>
+		<jk>public class</jk> TextContentHandler <jk>implements</jk> XmlContentHandler&ltText&gt; {
+	
+			<ja>@Override</ja>
+			<jk>public void</jk> parse(XMLStreamReader r, Text text) <jk>throws</jk> Exception {
+				String type = text.<jf>type</jf>;
+				<jk>if</jk> (type != <jk>null</jk> && type.equals(<js>"xhtml"</js>))
+					text.<jf>text</jf> = <jsm>decode</jsm>(readXmlContents(r).trim());
+				<jk>else</jk>
+					text.<jf>text</jf> = <jsm>decode</jsm>(r.getElementText().trim());
+			}
+	
+			<ja>@Override</ja>
+			<jk>public void</jk> serialize(XmlSerializerWriter w, Text text) <jk>throws</jk> Exception {
+				String type = text.<jf>type</jf>;
+				String content = text.<jf>text</jf>;
+				<jk>if</jk> (type != <jk>null</jk> && type.equals(<js>"xhtml"</js>))
+					w.encodeTextInvalidChars(content);
+				<jk>else</jk>
+					w.encodeText(content);
+			}
+		}
+	}
+			</p>
+			<p>
+				Refer to {@link com.ibm.juno.core.xml.XmlContentHandler} for more information.
+			</p>
+		</div>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Namespaces"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.2 - Namespaces</h3>
+	<div class='topic'>
+		<p>
+			Let's go back to the example of our original <code>Person</code> bean class:
+		</p>
+		<p class='bcode'>
+		<jk>public class</jk> Person {
+			<jc>// Bean properties</jc>
+			<jk>public int</jk> <jf>id</jf>;
+			<jk>public</jk> String <jf>name</jf>;
+	
+			<jc>// Bean constructor (needed by parser)</jc>
+			<jk>public</jk> Person() {}
+	
+			<jc>// Normal constructor</jc>
+			<jk>public</jk> Person(<jk>int</jk> id, String name) {
+				<jk>this</jk>.<jf>id</jf> = id;
+				<jk>this</jk>.<jf>name</jf> = name;
+			}
+		}
+		</p>
+		<p>
+			However, this time we'll leave namespaces enabled on the serializer:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+
+	<jc>// Serialize the bean to XML.</jc>
+	String xml = s.serialize(p);
+		</p>
+		<p>
+			Now when we run this code, we'll see namespaces added to our output:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;object</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs><xt>&gt;</xt>
+		<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+	<xt>&lt;/object&gt;</xt>
+		</p>
+		<p>
+			This isn't too exciting yet since we haven't specified any namespaces yet.<br>  
+			Therefore, everything is defined under the default <code>Juno</code> namespace.<br>
+			The <code>xsi</code> namespace is always present and is used to mark null property values with <code><xa>nil</xa>=<xs>'true'</xs></code>.
+		</p>
+		<p>
+			Namespaces can be defined at the following levels:
+		</p>
+		<ul>
+			<li>At the package level by using the {@link com.ibm.juno.core.xml.annotation.XmlSchema @XmlSchema} annotation.
+			<li>At the class level by using the {@link com.ibm.juno.core.xml.annotation.Xml @Xml} annotation.
+			<li>At the bean property level by using the {@link com.ibm.juno.core.xml.annotation.Xml @Xml} annotation.
+		</ul>
+		<p>
+			It's typically best to specify the namespaces used at the package level.<br> 
+			We'll do that here for the package containing our test code.
+		</p>
+		<p class='bcode'>
+	<jc>// XML namespaces used in this package</jc>
+	<ja>@XmlSchema</ja>(
+		prefix=<js>"ab"</js>,
+		xmlNs={
+			<ja>@XmlNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.ibm.com/addressBook/"</js>),
+			<ja>@XmlNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.ibm.com/person/"</js>),
+			<ja>@XmlNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.ibm.com/address/"</js>),
+			<ja>@XmlNs</ja>(prefix=<js>"mail"</js>, namespaceURI=<js>"http://www.ibm.com/mail/"</js>)
+		}
+	)
+	<jk>package</jk> com.ibm.sample.addressbook;
+	<jk>import</jk> com.ibm.juno.core.xml.annotation.*;
+		</p>
+		<p>
+			We're defining four namespaces in this package and designating <js>"http://www.ibm.com/addressBook/"</js> as the default
+				namespace for all classes and properties within this package.
+		</p>
+		<p>
+			Take special note that the <ja>@XmlSchema</ja> is modelled after the equivalent JAXB annotation, but is
+				defined in the {@link com.ibm.juno.core.xml.annotation} package.<br>
+			Other XML annotations are also modelled after JAXB. 
+			However, since many of the features of JAXB are already implemented for all serializers and parsers
+				at a higher level through various general annotations such as {@link com.ibm.juno.core.annotation.Bean} and {@link com.ibm.juno.core.annotation.BeanProperty}
+				it was decided to maintain separate Juno XML annotations instead of reusing JAXB annotations.<br>
+			This may change in some future implementation, but for now it was decided that having separate Juno XML annotations was less confusing.
+		</p>
+		<p>
+			On our bean class, we'll specify to use the <js>"http://www.ibm.com/person/"</js> namespace:
+		</p>
+		<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"person"</js>, prefix=<js>"per"</js>)
+	<jk>public class</jk> Person {
+		...
+		</p>
+		<p>
+			Now when we serialize the bean, we get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+		<p>
+			We can simplify the output by setting the default namespace on the serializer so that
+				all the elements do not need to be prefixed:
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_defaultNamespaceUri</jsf>, <js>"http://www.ibm.com/person/"</js>);
+		</p>
+		<p>
+			This produces the following equivalent where the elements don't need prefixes since they're already in the default document namespace:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/person/'</xs>
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs>
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs><xt>&gt;</xt>
+		<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+	<xt>&lt;/person&gt;</xt>		
+		</p>
+
+
+		<!-- ======================================================================================================== -->
+		<a id="AutoDetectNamespaces"></a>
+		<h4 class='topic' onclick='toggle(this)'>2.2.1 - Auto-detection of namespaces</h4>
+		<div class='topic'>
+			<p>
+				One important property on the XML serializer class is {@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_autoDetectNamespaces XML_autoDetectNamespaces}.<br>
+				This property tells the serializer to make a first-pass over the data structure to look for namespaces defined on classes and bean properties.<br>
+				In high-performance environments, you may want to consider disabling auto-detection and providing your own explicit list of namespaces to the serializer
+					to avoid this scanning step.
+			</p>
+			<p>
+				The following code will produce the same output as before, but will perform slightly better since it avoids this prescan step.
+			</p>
+			<p class='bcode'>
+	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_autoDetectNamespaces</jsf>, <jk>false</jk>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_namespaces</jsf>, <js>"{per:'http://www.ibm.com/person/'}"</js>);
+			</p>
+		</div>
+		
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="UriProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.3 - URI properties</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.annotation.BeanProperty#beanUri} annotation is used to identify the URI 
+				of a bean.<br>
+			Typically, this property will have a class type of {@link java.net.URI} or {@link java.net.URL}, although
+				it can essentially be any type that resolves to a simple serializable type.
+		</p>
+		<p>
+			In the following code, we're adding 2 new properties.<br>
+			The first property is annotated with <ja>@BeanProperty</ja> to identify that this property is the
+				resource identifier for this bean.<br>
+			The second unannotated property is interpreted as a normal property.
+		</p>
+		<p class='bcode'>	
+	<ja>@Xml</ja>(name=<js>"person"</js>, prefix=<js>"per"</js>)
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) 
+		<jk>public</jk> URI <jf>uri</jf>;
+		
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+	
+		...
+		
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri) <jk>throws</jk> URISyntaxException {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+		}
+	}
+		</p>
+		<p>
+			We alter our code to pass in values for these new properties.
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>);
+		</p>
+		<p>
+			Now when we run the sample code, we get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs>
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+		<p>
+			Notice how the bean URI property is serialized as an XML attribute while the normal URI property is
+				serialized normally as an element.
+		</p>
+		<p>
+			Bean properties that resolve as XML attributes can also be assigned namespaces.<br>
+			For example, let's assign our bean URI to another namespace.
+		</p>
+		<p class='bcode'>
+	<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>)
+	<ja>@Xml</ja>(prefix=<js>"ab"</js>)
+	<jk>public</jk> URI <jf>uri</jf>;
+		</p>
+		<p>
+			Now when we run the sample code, we see that our <xa>uri</xa> attribute is assigned that namespace prefix.		
+		</p>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:ab</xa>=<xs>'http://www.ibm.com/addressBook/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>ab:uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>		
+		</p>
+		<p>
+			The {@link com.ibm.juno.core.annotation.URI} annotation can also be used on classes and properties 
+				to identify them as URLs when they're not instances of <code>java.net.URI</code> or <code>java.net.URL</code> 
+				(not needed if <code><ja>@BeanProperty</ja>(beanUri=<jk>true</jk>)</code> is already specified).
+		</p>
+		<p>
+			The following properties would have produced the same output as before. 
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> String <jf>uri</jf>;
+		</p>
+		<p>
+			Also take note of the {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase SERIALIZER_absolutePathUriBase} and 
+				{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase SERIALIZER_relativeUriBase}
+				settings that can be specified on the serializer to resolve relative and context-root-relative URIs to fully-qualfied URIs.
+		</p>
+		<p>
+			This can be useful if you want to keep the URI authority and context root information out of the bean logic layer.
+		</p>
+		<p>
+			The following code produces the same output as before, but the URIs on the beans are relative.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_relativeUriBase</jsf>, <js>"http://myhost/sample"</js>);
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_absolutePathUriBase</jsf>, <js>"http://myhost"</js>);
+		
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"person/1"</js>, <js>"/"</js>);
+
+	<jc>// Serialize the bean to RDF/XML.</jc>
+	String rdfXml = s.serialize(p);
+		</p>		
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="BeanAnnotations"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.4 - @Bean and @BeanProperty annotations</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.annotation.Bean @Bean} and {@link com.ibm.juno.core.annotation.BeanProperty @BeanProperty} annotations
+				are used to customize the behavior of beans across the entire framework.<br>
+			In addition to using them to identify the resource URI for the bean shown above, they have various other uses:
+		</p>
+		<ul>
+			<li>Hiding bean properties.
+			<li>Specifying the ordering of bean properties.
+			<li>Overriding the names of bean properties.
+			<li>Associating filters at both the class and property level (to convert non-serializable POJOs to serializable forms).
+		</ul>
+		<p>
+			For example, we now add a <code>birthDate</code> property, and associate a filter with it to transform
+				it to an ISO8601 date-time string in GMT time.<br>
+			By default, <code>Calendars</code> are treated as beans by the framework, which is usually not how you want them serialized.<br>
+			Using filters, we can convert them to standardized string forms.
+		</p>
+		<p class='bcode'>	
+	<ja>@Xml</ja>(name=<js>"person"</js>, prefix=<js>"per"</js>)
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar birthDate;
+		...
+		
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			...
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+		</p>
+		<p>
+			Next, we alter our code to pass in the birthdate:
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+		</p>
+		<p>
+			Now when we rerun the sample code, we'll get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T00:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+		<p>
+			Another useful feature is the {@link com.ibm.juno.core.annotation.Bean#propertyNamer()} annotation that allows you to plug in your own
+				logic for determining bean property names.<br>
+			The {@link com.ibm.juno.core.PropertyNamerDashedLC} is an example of an alternate property namer.
+			It converts bean property names to lowercase-dashed format.
+		</p>
+		<h6 class='figure'>Example</h6>
+		<p class='bcode'>	
+	<ja>@Xml</ja>(name=<js>"person"</js>, prefix=<js>"per"</js>)
+	<ja>@Bean</ja>(propertyNamer=PropertyNamerDashedLC.<jk>class</jk>)
+	<jk>public class</jk> Person {
+		...
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:address-book-uri&gt;</xt>http://sample/addressBook<xt>&lt;/per:address-book-uri&gt;</xt>
+		<xt>&lt;per:birth-date&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birth-date&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+	</div>
+	
+		
+	<!-- ======================================================================================================== -->
+	<a id="Collections"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.5 - Collections</h3>
+	<div class='topic'>
+		<p>
+			In our example, let's add a list-of-beans property to our sample class:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+		...
+	}
+		</p>
+		<p>
+			The <code>Address</code> class has the following properties defined:
+		</p>
+		<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"address"</js>, prefix=<js>"addr"</js>)
+	<jk>public class</jk> Address {
+
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		<jk>public int</jk> <jf>id</jf>;
+		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			Next, add some quick-and-dirty code to add an address to our person bean:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+		</p>
+		<p>
+			Now when we run the sample code, we get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs>
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+		<xt>&lt;per:addresses&gt;</xt>
+			<xt>&lt;addr:address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;addr:personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/addr:personUri&gt;</xt>
+				<xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+			<xt>&lt;/addr:address&gt;</xt>
+		<xt>&lt;/per:addresses&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="XmlSchemaSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.6 - XML-Schema support</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the {@link com.ibm.juno.core.xml.XmlSchemaSerializer} class for generating XML-Schema documents
+				that describe the output generated by the {@link com.ibm.juno.core.xml.XmlSerializer} class.<br>
+			This class shares the same properties as <code>XmlSerializer</code>.<br>
+			Since the XML output differs based on settings on the XML serializer class, the XML-Schema serializer
+				class must have the same property values as the XML serializer class it's describing.<br>
+			To help facilitate creating an XML Schema serializer with the same properties as the corresponding 
+				XML serializer, the {@link com.ibm.juno.core.xml.XmlSerializer#getSchemaSerializer()} method 
+				has been added.
+		</p>
+		<p>
+			XML-Schema requires a separate file for each namespace.<br>  
+			Unfortunately, does not mesh well with the Juno serializer architecture which serializes to single writers.<br>
+			To get around this limitation, the schema serializer will produce a single output, but with multiple
+				schema documents separated by the null character (<js>'\u0000'</js>) to make it simple to split apart.
+		</p>
+		<p>
+			Lets start with an example where everything is in the same namespace.<br>
+			We'll use the classes from before, but remove the references to namespaces.<br>
+			Since we have not defined a default namespace, everything is defined under the default Juno namespace.
+		</p>
+		<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"person"</js>)
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.getDateInstance(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+
+	<ja>@Xml</ja>(name=<js>"address"</js>)
+	<jk>public class</jk> Address {
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			The code for creating our POJO model and generating XML Schema is shown below:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_enableNamespaces</jsf>, <jk>true</jk>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_addNamespaceUrisToRoot</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+
+	<jc>// Create the equivalent schema serializer.</jc>
+	XmlSchemaSerializer ss = s.getSchemaSerializer();
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);
+
+	<jc>// Serialize the bean to XML.</jc>
+	String xml = s.serialize(p);
+	
+	<jc>// Get the XML Schema corresponding to the XML generated above.</jc>
+	String xmlSchema = ss.serialize(p);
+		</p>
+		<h6 class='figure'>XML results</h6>
+		<p class='bcode'>
+	<xt>&lt;person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+		<xt>&lt;addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/addressBookUri&gt;</xt>
+		<xt>&lt;birthDate&gt;</xt>1946-08-12T00:00:00Z<xt>&lt;/birthDate&gt;</xt>
+		<xt>&lt;addresses&gt;</xt>
+			<xt>&lt;address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/personUri&gt;</xt>
+				<xt>&lt;id&gt;</xt>1<xt>&lt;/id&gt;</xt>
+				<xt>&lt;street&gt;</xt>100 Main Street<xt>&lt;/street&gt;</xt>
+				<xt>&lt;city&gt;</xt>Anywhereville<xt>&lt;/city&gt;</xt>
+				<xt>&lt;state&gt;</xt>NY<xt>&lt;/state&gt;</xt>
+				<xt>&lt;zip&gt;</xt>12345<xt>&lt;/zip&gt;</xt>
+				<xt>&lt;isCurrent&gt;</xt>true<xt>&lt;/isCurrent&gt;</xt>
+			<xt>&lt;/address&gt;</xt>
+		<xt>&lt;/addresses&gt;</xt>
+	<xt>&lt;/person&gt;</xt>				
+		</p>
+		<h6 class='figure'>XML-Schema results</h6>
+		<p class='bcode'>
+	<xt>&lt;schema</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
+			<xa>targetNamespace</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs><xt>&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'person'</xs> <xa>type</xa>=<xs>'juno:com.ibm.sample.Person'</xs><xt>/&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'com.ibm.sample.Person'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'id'</xs> <xa>type</xa>=<xs>'integer'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'name'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'addressBookUri'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'birthDate'</xs> <xa>type</xa>=<xs>'juno:java.util.Calendar'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'addresses'</xs> <xa>type</xa>=<xs>'juno:java.util.LinkedList_x003C_com.ibm.sample.Address_x003E_'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+			<xt>&lt;attribute</xt> <xa>name</xa>=<xs>'uri'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.Calendar'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;any</xt> <xa>processContents</xa>=<xs>'skip'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.LinkedList_x003C_com.ibm.sample.Address_x003E_'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;choice</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>&gt;</xt>
+					<xt>&lt;element</xt> <xa>name</xa>=<xs>'address'</xs> <xa>type</xa>=<xs>'juno:com.ibm.sample.Address'</xs><xt>/&gt;</xt>
+					<xt>&lt;element</xt> <xa>name</xa>=<xs>'null'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+				<xt>&lt;/choice&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'com.ibm.sample.Address'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'personUri'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'id'</xs> <xa>type</xa>=<xs>'integer'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'street'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'city'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'state'</xs> <xa>type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'zip'</xs> <xa>type</xa>=<xs>'integer'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+				<xt>&lt;element</xt> <xa>name</xa>=<xs>'isCurrent'</xs> <xa>type</xa>=<xs>'boolean'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+			<xt>&lt;attribute</xt> <xa>name</xa>=<xs>'uri'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+	<xt>&lt;/schema&gt;</xt>
+		</p>
+		<p>
+			Now if we add in some namespaces, we'll see how multiple namespaces are handled.
+		</p>
+		<p class='bcode'>
+	<ja>@Xml</ja></ja>(name=<js>"person"</js>, prefix=<js>"per"</js>)
+	<jk>public class</jk> Person {
+	...
+	}
+
+	<ja>@Xml</ja>(name=<js>"address"</js>, prefix=<js>"addr"</js>)
+	<jk>public class</jk> Address {
+		...
+		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public int</jk> <jf>zip</jf>;
+		...
+	}
+		</p>
+		<h6 class='figure'>XML results</h6>
+		<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs> 
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T00:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+		<xt>&lt;per:addresses&gt;</xt>
+			<xt>&lt;addr:address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;addr:personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/addr:personUri&gt;</xt>
+				<xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+			<xt>&lt;/addr:address&gt;</xt>
+		<xt>&lt;/per:addresses&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+		</p>
+		<p>
+			The schema consists of 4 documents separated by a <js>'\u0000'</js> character.
+		</p>
+		<h6 class='figure'>XML-Schema results</h6>
+		<p class='bcode'>
+	<xt>&lt;schema</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
+			<xa>targetNamespace</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs><xt>&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'int'</xs><xt>&gt;</xt>
+			<xt>&lt;simpleContent&gt;</xt>
+				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'integer'</xs><xt>/&gt;</xt>
+			<xt>&lt;/simpleContent&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.lang.String'</xs><xt>&gt;</xt>
+			<xt>&lt;simpleContent&gt;</xt>
+				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+			<xt>&lt;/simpleContent&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.net.URI'</xs><xt>&gt;</xt>
+			<xt>&lt;simpleContent&gt;</xt>
+				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+			<xt>&lt;/simpleContent&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.Calendar'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;any</xt> <xa>processContents</xa>=<xs>'skip'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.LinkedList_x003C_com.ibm.sample.Address_x003E_'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;choice</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>&gt;</xt>
+					<xt>&lt;element</xt> <xa>name</xa>=<xs>'address'</xs> <xa>type</xa>=<xs>'addr:com.ibm.sample.Address'</xs><xt>/&gt;</xt>
+					<xt>&lt;element</xt> <xa>name</xa>=<xs>'null'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+				<xt>&lt;/choice&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'boolean'</xs><xt>&gt;</xt>
+			<xt>&lt;simpleContent&gt;</xt>
+				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'boolean'</xs><xt>/&gt;</xt>
+			<xt>&lt;/simpleContent&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+	<xt>&lt;/schema&gt;</xt>
+	[\u0000]
+	<xt>&lt;schema</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
+			<xa>targetNamespace</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs><xt>&gt;</xt>
+		<xt>&lt;impor</xt>t <xa>namespace</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> <xa>schemaLocation</xa>=<xs>'juno.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'person'</xs> <xa>type</xa>=<xs>'per:com.ibm.sample.Person'</xs><xt>/&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'com.ibm.sample.Person'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;any</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+			<xt>&lt;attribute</xt> <xa>name</xa>=<xs>'uri'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'id'</xs> <xa>type</xa>=<xs>'juno:int'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'name'</xs> <xa>type</xa>=<xs>'juno:java.lang.String'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'addressBookUri'</xs> <xa>type</xa>=<xs>'juno:java.net.URI'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'birthDate'</xs> <xa>type</xa>=<xs>'juno:java.util.Calendar'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'addresses'</xs> <xa>type</xa>=<xs>'juno:java.util.LinkedList_x003C_com.ibm.sample.Address_x003E_'</xs><xt>/&gt;</xt>
+	<xt>&lt;/schema&gt;</xt>
+	[\u0000]
+	<xt>&lt;schema</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
+			<xa>targetNamespace</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs><xt>&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> <xa>schemaLocation</xa>=<xs>'juno.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'com.ibm.sample.Address'</xs><xt>&gt;</xt>
+			<xt>&lt;sequence&gt;</xt>
+				<xt>&lt;any</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>/&gt;</xt>
+			<xt>&lt;/sequence&gt;</xt>
+			<xt>&lt;attribute</xt> <xa>name</xa>=<xs>'uri'</xs> <xa>type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
+		<xt>&lt;/complexType&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'personUri'</xs> <xa>type</xa>=<xs>'juno:java.net.URI'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'id'</xs> <xa>type</xa>=<xs>'juno:int'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'isCurrent'</xs> <xa>type</xa>=<xs>'juno:boolean'</xs><xt>/&gt;</xt>
+	<xt>&lt;/schema&gt;</xt>
+	[\u0000]
+	<xt>&lt;schema</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
+			<xa>targetNamespace</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
+			<xa>xmlns:juno</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs><xt>&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> <xa>schemaLocation</xa>=<xs>'juno.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.ibm.com/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'street'</xs> <xa>type</xa>=<xs>'juno:java.lang.String'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'city'</xs> <xa>type</xa>=<xs>'juno:java.lang.String'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'state'</xs> <xa>type</xa>=<xs>'juno:java.lang.String'</xs><xt>/&gt;</xt>
+		<xt>&lt;element</xt> <xa>name</xa>=<xs>'zip'</xs> <xa>type</xa>=<xs>'juno:int'</xs><xt>/&gt;</xt>
+	<xt>&lt;/schema&gt;</xt>	
+		</p>
+		<p>
+			For convenience, the {@link com.ibm.juno.core.xml.XmlSchemaSerializer#getValidator(Object, SerializerContext)} method is provided
+				to create a {@link javax.xml.validation.Validator} using the input from the serialize method.
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Recursion"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.7 - Non-tree models and recursion detection</h3>
+	<div class='topic'>
+		<p>
+			The XML serializer is designed to be used against POJO tree structures. <br> 
+			It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).<br>
+			If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
+				be thrown (if {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth} is not reached first).
+		</p>
+		<p>
+			If you still want to use the XML serializer on such models, Juno provides the 
+				{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions} setting.<br>
+			It tells the serializer to look for instances of an object in the current branch of the tree and
+				skip serialization when a duplicate is encountered.
+		</p>
+		<p>
+			For example, let's make a POJO model out of the following classes:
+		</p>
+		<p class='bcode'>
+	<ja>@Xml</ja>(name=<js>"a"</js>)
+	<jk>public class</jk> A {
+		<jk>public</jk> B b;
+	}
+	
+	<jk>public class</jk> B {
+		<jk>public</jk> C c;
+	}
+	
+	<jk>public class</jk> C {
+		<jk>public</jk> A a;
+	}
+		</p>
+		<p>
+			Now we create a model with a loop and serialize the results.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_enableNamespaces</jsf>, <jk>false</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>);
+
+	<jc>// Create a recursive loop.</jc>
+	A a = <jk>new</jk> A();
+	a.<jf>b</jf> = <jk>new</jk> B();
+	a.<jf>b</jf>.<jf>c</jf> = <jk>new</jk> C();
+	a.<jf>b</jf>.<jf>c</jf>.<jf>a</jf> = a;
+	
+	<jc>// Serialize to XML.</jc>
+	String xml = s.serialize(a);
+		</p>
+		<p>
+			What we end up with is the following, which does not serialize the contents of the <code>c</code> field:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;a&gt;</xt>
+		<xt>&lt;b&gt;</xt>
+			<xt>&lt;c/&gt;</xt>
+		<xt>&lt;/b&gt;</xt>
+	<xt>&lt;/a&gt;</xt>		
+		</p>
+		<p>
+			Without recursion detection enabled, this would cause a stack-overflow error.
+		</p>
+		<p>
+			Recursion detection introduces a performance penalty of around 20%.<br>
+			For this reason the setting is disabled by default.
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.8 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>XmlSerializer</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_addJsonTypeAttrs}</td>
+				<td>Add JSON type attributes to output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_addJsonStringTypeAttrs}</td>
+				<td>Add JSON type attributes for strings to output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_enableNamespaces}</td>
+				<td>Enable support for XML namespaces</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_autoDetectNamespaces}</td>
+				<td>Auto-detect namespace usage</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_addNamespaceUrisToRoot}</td>
+				<td>Add namespace URLs to the root element</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_defaultNamespaceUri}</td>
+				<td>Default namespace URI</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_xsNamespace}</td>
+				<td>XMLSchema namespace</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_xsiNamespace}</td>
+				<td>XMLSchema-Instance namespace</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_namespaces}</td>
+				<td>Default namespaces</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth}</td>
+				<td>Maximum serialization depth</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions}</td>
+				<td>Automatically detect POJO recursions</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_useIndentation}</td>
+				<td>Use indentation in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_quoteChar}</td>
+				<td>Quote character</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimNullProperties}</td>
+				<td>Trim null bean property values from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyLists}</td>
+				<td>Trim empty lists and arrays from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyMaps}</td>
+				<td>Trim empty maps from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase}</td>
+				<td>URI context root for relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase}</td>
+				<td>URI authority for absolute path relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireDefaultConstructor}</td>
+				<td>Beans require no-arg constructors</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSerializable}</td>
+				<td>Beans require <code>Serializable</code> interface</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSettersForGetters}</td>
+				<td>Beans require setters for getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSomeProperties}</td>
+				<td>Beans require some properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanConstructorVisibility}</td>
+				<td>Look for bean constructors with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanClassVisibility}</td>
+				<td>Look for bean classes with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanFieldVisibility}</td>
+				<td>Look for bean fields with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_methodVisibility}</td>
+				<td>Look for bean methods with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useJavaBeanIntrospector}</td>
+				<td>Use Java bean Introspector for determining bean properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useInterfaceProxies}</td>
+				<td>Use interface proxies</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties}</td>
+				<td>Ignore unknown properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownNullBeanProperties}</td>
+				<td>Ignore unknown properties with null values</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignorePropertiesWithoutSetters}</td>
+				<td>Ignore properties without setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnGetters}</td>
+				<td>Ignore invocation errors when calling getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnSetters}</td>
+				<td>Ignore invocation errors when calling setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_addNotBeanPackages}</td>
+				<td>Add to the list of packages whose classes should not be considered beans</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_removeNotBeanPackages}</td>
+				<td>Remove from the list of packages whose classes should not be considered beans</td>
+			</tr>	
+		</table>	
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.9 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno serializers, the XML serializer is thread safe and maintains an internal cache of bean classes encountered.<br>
+				For performance reasons, it's recommended that serializers be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="XmlParser"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - XmlParser class</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.xml.XmlParser} class is the class used to parse Juno-generated XML back into POJOs.
+	</p>	
+	<p>
+		A static reusable instance of <code>XmlParser</code> is also provided for convenience:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.xml.XmlParser#DEFAULT}
+	</ul>
+	<p>
+		Let's build upon the previous example and parse the generated XML back into the original bean.<br>
+		We start with the XML that was generated.
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+
+	<jc>// Serialize the bean to XML.</jc>
+	String xml = s.serialize(p);
+	</p>
+	<p>
+		This code produced the following:
+	</p>
+	<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs>
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+		<xt>&lt;per:addresses&gt;</xt>
+			<xt>&lt;addr:address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;addr:personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/addr:personUri&gt;</xt>
+				<xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+			<xt>&lt;/addr:address&gt;</xt>
+		<xt>&lt;/per:addresses&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+	</p>
+	<p>
+		The code to convert this back into a bean is:
+	</p>
+	<p class='bcode'>
+	<jc>// Parse it back into a bean using the reusable XML parser.</jc>
+	Person p = XmlParser.<jsf>DEFAULT</jsf>.parse(xml, Person.<jk>class</jk>);
+
+	<jc>// Render it as JSON.</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(p);
+	</p>
+	<p>
+		We print it out to JSON to show that all the data has been preserved:
+	</p>
+	<p class='bcode'>
+	{
+		id: 1, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: 1, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: 12345, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}	
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="GenericParsing"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.1 - Parsing into generic POJO models</h3>
+	<div class='topic'>
+		<p>
+			The XML parser is not limited to parsing back into the original bean classes.<br>  
+			If the bean classes are not available on the parsing side, the parser can also be used to 
+				parse into a generic model consisting of <code>Maps</code>, <code>Collections</code>, and primitive
+				objects.
+		</p>
+		<p>
+			You can parse into any <code>Map</code> type (e.g. <code>HashMap</code>, <code>TreeMap</code>), but
+				using {@link com.ibm.juno.core.ObjectMap} is recommended since it has many convenience methods
+				for converting values to various types.<br> 
+			The same is true when parsing collections.  You can use any Collection (e.g. <code>HashSet</code>, <code>LinkedList</code>)
+				or array (e.g. <code>Object[]</code>, <code>String[]</code>, <code>String[][]</code>), but using 
+				{@link com.ibm.juno.core.ObjectList} is recommended.
+		</p>
+		<p>
+			When the map or list type is not specified, or is the abstract <code>Map</code>, <code>Collection</code>, or <code>List</code> types, 
+				the parser will use <code>ObjectMap</code> and <code>ObjectList</code> by default.
+		</p>
+	
+	
+		<!-- ======================================================================================================== -->
+		<a id="AddJsonTypeAttr"></a>
+		<h3 class='topic' onclick='toggle(this)'>3.1.1 - Serializing with JSON-type attributes</h3>
+		<div class='topic'>
+			<p>
+				In some circumstances, the XML parser needs additional information to recreate the original 
+					data structure when various annotations (e.g. {@link com.ibm.juno.core.xml.annotation.Xml#childName()}, {@link com.ibm.juno.core.xml.annotation.Xml#format()})
+					are used.  
+			</p>
+			<p>
+				For example, starting with this XML:
+			</p>
+			<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs>
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+		<xt>&lt;per:addresses&gt;</xt>
+			<xt>&lt;addr:address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;addr:personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/addr:personUri&gt;</xt>
+				<xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+			<xt>&lt;/addr:address&gt;</xt>
+		<xt>&lt;/per:addresses&gt;</xt>
+	<xt>&lt;/per:person&gt;</xt>
+			</p>
+			<p>
+				Let's try to parse this into an <code>ObjectMap</code>.
+			</p>
+			<p class='bcode'>	
+	<jc>// Parse XML into a generic POJO model.</jc>
+	ObjectMap m = XmlParser.<jsf>DEFAULT</jsf>.parse(xml, ObjectMap.<jk>class</jk>);
+
+	<jc>// Convert it to JSON.</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(m);
+			</p>
+			<p>
+				What we end up with is the following:
+			</p>
+			<p class='bcode'>
+	{
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		id: <js>'1'</js>, 
+		name: <js>'John Smith'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T04:00:00Z'</js>, 
+		addresses: {
+			address: {
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <js>'1'</js>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <js>'12345'</js>, 
+				isCurrent: <js>'true'</js>
+			}
+		}
+	}			
+			</p>	
+			<p>
+				Note that the addresses field does not parse correctly as an array of addresses.<br>
+				Without the beans providing meta-information about the data structure, the XML
+					parser has no way of determining that it's an array.
+			</p>
+			<p>
+				To preserve this information, the {@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_addJsonTypeAttrs XML_addJsonTypeAttrs} property
+					is provided that will insert <xa>type</xa> attributes into the XML to preserve JSON equivalency in the document when it cannot be determined automatically.
+			</p>
+			<h6 class='figure'>Example with XML_addJsonTypeAttrs setting enabled</h6>
+			<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_addJsonTypeAttrs</jsf>, <jk>true</jk>);
+			</p>
+			<h6 class='figure'>Results</h6>
+			<p class='bcode'>
+	<xt>&lt;per:person</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:per</xa>=<xs>'http://www.ibm.com/person/'</xs> 
+			<xa>xmlns:addr</xa>=<xs>'http://www.ibm.com/address/'</xs> 
+			<xa>xmlns:mail</xa>=<xs>'http://www.ibm.com/mail/'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs>
+			<xa>uri</xa>=<xs>'http://sample/addressBook/person/1'</xs><xt>&gt;</xt>
+		<xt>&lt;per:id</xt> <xa>type</xa>=<xs>'number'</xs><xt>&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+		<xt>&lt;per:addressBookUri&gt;</xt>http://sample/addressBook<xt>&lt;/per:addressBookUri&gt;</xt>
+		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
+		<xt>&lt;per:addresses</xt> <xa>type</xa>=<xs>'array'</xs><xt>&gt;</xt>
+			<xt>&lt;addr:address</xt> <xa>uri</xa>=<xs>'http://sample/addressBook/address/1'</xs><xt>&gt;</xt>
+				<xt>&lt;addr:personUri&gt;</xt>http://sample/addressBook/person/1<xt>&lt;/addr:personUri&gt;</xt>
+				<xt>&lt;addr:id</xt> <xa>type</xa>=<xs>'number'</xs><xt>&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+				<xt>&lt;mail:state&gt;</xt>NY<xt>

<TRUNCATED>

[03/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.java
new file mode 100755
index 0000000..322cdc8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.xml.XmlParserProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import javax.xml.stream.*;
+import javax.xml.stream.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Context object that lives for the duration of a single parsing of {@link XmlParser}.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class XmlParserContext extends ParserContext {
+
+	/**
+	 * XMLSchema namespace URI ({@link String}, default=<js>"http://www.w3.org/2001/XMLSchema-instance"</js>).
+	 * <p>
+	 * The XMLSchema namespace.
+	 */
+	private final String xsiNs;
+	private final boolean
+		trimWhitespace,
+		validating,
+		coalescing,
+		replaceEntityReferences,
+		preserveRootElement;
+	private final XMLReporter reporter;
+	private final XMLResolver resolver;
+	private final XMLEventAllocator eventAllocator;
+	private XMLStreamReader xmlStreamReader;
+
+
+	/**
+	 * Create a new parser context with the specified options.
+	 *
+	 * @param beanContext The bean context being used.
+	 * @param pp The default parser properties.
+	 * @param xpp The default XML parser properties.
+	 * @param op The override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	public XmlParserContext(BeanContext beanContext, ParserProperties pp, XmlParserProperties xpp, ObjectMap op, Method javaMethod, Object outer) {
+		super(beanContext, pp, op, javaMethod, outer);
+		if (op == null || op.isEmpty()) {
+			xsiNs = xpp.getXsiNs();
+			trimWhitespace = xpp.isTrimWhitespace();
+			validating = xpp.isValidating();
+			coalescing = xpp.isCoalescing();
+			replaceEntityReferences = xpp.isReplaceEntityReferences();
+			reporter = xpp.getReporter();
+			resolver = xpp.getResolver();
+			eventAllocator = xpp.getEventAllocator();
+			preserveRootElement = xpp.isPreserveRootElement();
+		} else {
+			xsiNs = op.getString(XML_xsiNs, xpp.getXsiNs());
+			trimWhitespace = op.getBoolean(XML_trimWhitespace, xpp.isTrimWhitespace());
+			validating = op.getBoolean(XML_validating, xpp.isValidating());
+			coalescing = op.getBoolean(XML_coalescing, xpp.isCoalescing());
+			replaceEntityReferences = op.getBoolean(XML_replaceEntityReferences, xpp.isReplaceEntityReferences());
+			reporter = (XMLReporter)op.get(XML_reporter, xpp.getReporter());
+			resolver = (XMLResolver)op.get(XML_resolver, xpp.getResolver());
+			eventAllocator = (XMLEventAllocator)op.get(XML_eventAllocator, xpp.getEventAllocator());
+			preserveRootElement = op.getBoolean(XML_preserveRootElement, xpp.isPreserveRootElement());
+		}
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_xsiNs} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_xsiNs} setting in this context.
+	 */
+	public String getXsiNs() {
+		return xsiNs;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_trimWhitespace} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_trimWhitespace} setting in this context.
+	 */
+	public boolean isTrimWhitespace() {
+		return trimWhitespace;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_preserveRootElement} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_preserveRootElement} setting in this context.
+	 */
+	public boolean isPreserveRootElement() {
+		return preserveRootElement;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_validating} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_validating} setting in this context.
+	 */
+	public boolean isValidating() {
+		return validating;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_coalescing} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_coalescing} setting in this context.
+	 */
+	public boolean isCoalescing() {
+		return coalescing;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_replaceEntityReferences} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_replaceEntityReferences} setting in this context.
+	 */
+	public boolean isReplaceEntityReferences() {
+		return replaceEntityReferences;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_reporter} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_reporter} setting in this context.
+	 */
+	public XMLReporter getReporter() {
+		return reporter;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_resolver} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_resolver} setting in this context.
+	 */
+	public XMLResolver getResolver() {
+		return resolver;
+	}
+
+	/**
+	 * Returns the {@link XmlParserProperties#XML_eventAllocator} setting in this context.
+	 *
+	 * @return The {@link XmlParserProperties#XML_eventAllocator} setting in this context.
+	 */
+	public XMLEventAllocator getEventAllocator() {
+		return eventAllocator;
+	}
+
+
+	/**
+	 * Wrap the specified reader in a STAX reader based on settings in this context.
+	 *
+	 * @param r The input reader.
+	 * @param estimatedSize The estimated size of the contents of the reader.
+	 * @return The new STAX reader.
+	 * @throws ParseException If problem occurred trying to create reader.
+	 */
+	public XMLStreamReader getReader(Reader r, int estimatedSize) throws ParseException {
+		try {
+			r = IOUtils.getBufferedReader(r, estimatedSize);
+			XMLInputFactory factory = XMLInputFactory.newInstance();
+			factory.setProperty(XMLInputFactory.IS_VALIDATING, validating);
+			factory.setProperty(XMLInputFactory.IS_COALESCING, coalescing);
+			factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, replaceEntityReferences);
+			if (factory.isPropertySupported(XMLInputFactory.REPORTER) && reporter != null)
+				factory.setProperty(XMLInputFactory.REPORTER, reporter);
+			if (factory.isPropertySupported(XMLInputFactory.RESOLVER) && resolver != null)
+				factory.setProperty(XMLInputFactory.RESOLVER, resolver);
+			if (factory.isPropertySupported(XMLInputFactory.ALLOCATOR) && eventAllocator != null)
+				factory.setProperty(XMLInputFactory.ALLOCATOR, eventAllocator);
+			xmlStreamReader = factory.createXMLStreamReader(r);
+			xmlStreamReader.nextTag();
+		} catch (Error e) {
+			close();
+			throw new ParseException(e.getLocalizedMessage());
+		} catch (XMLStreamException e) {
+			close();
+			throw new ParseException(e);
+		}
+
+		return xmlStreamReader;
+	}
+
+	/**
+	 * Silently closes the XML stream returned by the call to {@link #getReader(Reader, int)}.
+	 */
+	@Override /* ParserContext */
+	public void close() throws ParseException {
+		super.close();
+		try {
+			if (xmlStreamReader != null)
+				xmlStreamReader.close();
+		} catch (XMLStreamException e) {
+			// Ignore.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.class
new file mode 100755
index 0000000..c5e5e4f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.java
new file mode 100755
index 0000000..23b9503
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserProperties.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import javax.xml.stream.*;
+import javax.xml.stream.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Configurable properties on the {@link XmlParser} class.
+ * <p>
+ * 	Use the {@link XmlParser#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link XmlParser}.
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class XmlParserProperties implements Cloneable {
+
+	/**
+	 * XMLSchema-instance namespace URI ({@link String}, default=<js>"http://www.w3.org/2001/XMLSchema-instance"</js>).
+	 * <p>
+	 * The XMLSchema namespace.
+	 */
+	public static final String XML_xsiNs = "XmlParser.xsiNs";
+
+	/**
+	 * Trim whitespace from text elements ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, whitespace in text elements will be automatically trimmed.
+	 */
+	public static final String XML_trimWhitespace = "XmlParser.trimWhitespace";
+
+	/**
+	 * Set validating mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, XML document will be validated.
+	 * See {@link XMLInputFactory#IS_VALIDATING} for more info.
+	 */
+	public static final String XML_validating = "XmlParser.validating";
+
+	/**
+	 * Set coalescing mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, XML text elements will be coalesced.
+	 * See {@link XMLInputFactory#IS_COALESCING} for more info.
+	 */
+	public static final String XML_coalescing = "XmlParser.coalescing";
+
+	/**
+	 * Replace entity references ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If <jk>true</jk>, entity references will be replace during parsing.
+	 * See {@link XMLInputFactory#IS_REPLACING_ENTITY_REFERENCES} for more info.
+	 */
+	public static final String XML_replaceEntityReferences = "XmlParser.replaceEntityReferences";
+
+	/**
+	 * XML reporter ({@link XMLReporter}, default=<jk>null</jk>).
+	 * <p>
+	 * Associates an {@link XMLReporter} with this parser.
+	 * <p>
+	 * Note:  Reporters are not copied to new parsers during a clone.
+	 */
+	public static final String XML_reporter = "XmlParser.reporter";
+
+	/**
+	 * XML resolver ({@link XMLResolver}, default=<jk>null</jk>).
+	 * <p>
+	 * Associates an {@link XMLResolver} with this parser.
+	 */
+	public static final String XML_resolver = "XmlParser.resolver";
+
+	/**
+	 * XML event allocator. ({@link XMLEventAllocator}, default=<jk>false</jk>).
+	 * <p>
+	 * Associates an {@link XMLEventAllocator} with this parser.
+	 */
+	public static final String XML_eventAllocator = "XmlParser.eventAllocator";
+
+	/**
+	 * Preserve root element during generalized parsing ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, when parsing into a generic {@link ObjectMap}, the map will
+	 * 	contain a single entry whose key is the root element name.
+	 *
+	 * Example:
+	 *	<table class='styled'>
+	 *		<tr>
+	 *			<td>XML</td>
+	 *			<td>ObjectMap.toString(), preserveRootElement==false</td>
+	 *			<td>ObjectMap.toString(), preserveRootElement==true</td>
+	 *		</tr>
+	 *		<tr>
+	 *			<td><code><xt>&lt;root&gt;&lt;a&gt;</xt>foobar<xt>&lt;/a&gt;&lt;/root&gt;</xt><code></td>
+	 *			<td><code>{ a:<js>'foobar'</js> }</code></td>
+	 *			<td><code>{ root: { a:<js>'foobar'</js> }}</code></td>
+	 *		</tr>
+	 *	</table>
+	 *
+	 */
+	public static final String XML_preserveRootElement = "XmlParser.preserveRootElement";
+
+	private String xsiNs = "http://www.w3.org/2001/XMLSchema-instance";
+	private boolean
+		trimWhitespace = false,
+		validating = false,
+		coalescing = false,
+		replaceEntityReferences = true,
+		preserveRootElement = false;
+	private XMLReporter reporter;
+	private XMLResolver resolver;
+	private XMLEventAllocator eventAllocator;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 * @throws LockedException If bean context is locked.
+	 */
+	protected boolean setProperty(String property, Object value) throws LockedException {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(XML_trimWhitespace))
+			trimWhitespace = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_validating))
+			validating = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_coalescing))
+			coalescing = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_replaceEntityReferences))
+			replaceEntityReferences = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_xsiNs))
+			xsiNs = value.toString();
+		else if (property.equals(XML_reporter) && value instanceof XMLReporter)
+			reporter = (XMLReporter)value;
+		else if (property.equals(XML_resolver) && value instanceof XMLResolver)
+			resolver = (XMLResolver)value;
+		else if (property.equals(XML_eventAllocator) && value instanceof XMLEventAllocator)
+			eventAllocator = (XMLEventAllocator)value;
+		else if (property.equals(XML_preserveRootElement))
+			preserveRootElement = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+	/**
+	 * Returns the current {@link #XML_xsiNs} value.
+	 * @return The current {@link #XML_xsiNs} value.
+	 */
+	public String getXsiNs() {
+		return xsiNs;
+	}
+
+	/**
+	 * Returns the current {@link #XML_trimWhitespace} value.
+	 * @return The current {@link #XML_trimWhitespace} value.
+	 */
+	public boolean isTrimWhitespace() {
+		return trimWhitespace;
+	}
+
+	/**
+	 * Returns the current {@link #XML_preserveRootElement} value.
+	 * @return The current {@link #XML_preserveRootElement} value.
+	 */
+	public boolean isPreserveRootElement() {
+		return preserveRootElement;
+	}
+
+	/**
+	 * Returns the current {@link #XML_validating} value.
+	 * @return The current {@link #XML_validating} value.
+	 */
+	public boolean isValidating() {
+		return validating;
+	}
+
+	/**
+	 * Returns the current {@link #XML_coalescing} value.
+	 * @return The current {@link #XML_coalescing} value.
+	 */
+	public boolean isCoalescing() {
+		return coalescing;
+	}
+
+	/**
+	 * Returns the current {@link #XML_replaceEntityReferences} value.
+	 * @return The current {@link #XML_replaceEntityReferences} value.
+	 */
+	public boolean isReplaceEntityReferences() {
+		return replaceEntityReferences;
+	}
+
+	/**
+	 * Returns the current {@link #XML_reporter} value.
+	 * @return The current {@link #XML_reporter} value.
+	 */
+	public XMLReporter getReporter() {
+		return reporter;
+	}
+
+	/**
+	 * Returns the current {@link #XML_reporter} value.
+	 * @return The current {@link #XML_reporter} value.
+	 */
+	public XMLResolver getResolver() {
+		return resolver;
+	}
+
+	/**
+	 * Returns the current {@link #XML_eventAllocator} value.
+	 * @return The current {@link #XML_eventAllocator} value.
+	 */
+	public XMLEventAllocator getEventAllocator() {
+		return eventAllocator;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Object */
+	public XmlParserProperties clone() {
+		try {
+			return (XmlParserProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.class
new file mode 100755
index 0000000..4aa659b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.java
new file mode 100755
index 0000000..0c3b5f5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaDocSerializer.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.io.*;
+
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJO metadata to HTTP responses as XML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/xml+schema</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/xml</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Same as {@link XmlSchemaSerializer}, except prepends <code><xt>&lt;?xml</xt> <xa>version</xa>=<xs>'1.0'</xs> <xa>encoding</xa>=<xs>'UTF-8'</xs><xt>?&gt;</xt></code> to the response
+ * 	to make it a valid XML document.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class XmlSchemaDocSerializer extends XmlSchemaSerializer {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		XmlSerializerContext xctx = (XmlSerializerContext)ctx;
+		XmlSerializerWriter w = xctx.getWriter(out);
+		w.append("<?xml")
+			.attr("version", "1.0")
+			.attr("encoding", "UTF-8")
+			.appendln("?>");
+		super.doSerialize(o, w, ctx);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$1.class
new file mode 100755
index 0000000..98bc0e8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$QueueEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$QueueEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$QueueEntry.class
new file mode 100755
index 0000000..7948545
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$QueueEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schema.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schema.class
new file mode 100755
index 0000000..fa87011
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schemas.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schemas.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schemas.class
new file mode 100755
index 0000000..fba563f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer$Schemas.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.class
new file mode 100755
index 0000000..1361066
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.java
new file mode 100755
index 0000000..bc40ae4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSchemaSerializer.java
@@ -0,0 +1,588 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.text.*;
+import java.util.*;
+import java.util.regex.*;
+
+import javax.xml.*;
+import javax.xml.transform.stream.*;
+import javax.xml.validation.*;
+
+import org.w3c.dom.bootstrap.*;
+import org.w3c.dom.ls.*;
+import org.xml.sax.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Serializes POJO metadata to HTTP responses as XML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/xml+schema</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/xml</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Produces the XML-schema representation of the XML produced by the {@link XmlSerializer} class with the same properties.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link XmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces(value="text/xml+schema",contentType="text/xml")
+public class XmlSchemaSerializer extends XmlSerializer {
+
+	@Override /* XmlSerializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		XmlSerializerContext xctx = (XmlSerializerContext)ctx;
+
+		if (xctx.isEnableNamespaces() && xctx.isAutoDetectNamespaces())
+			findNsfMappings(o, xctx);
+
+		Namespace xs = xctx.getXsNamespace();
+		Namespace[] allNs = ArrayUtils.append(new Namespace[]{xctx.getDefaultNamespace()}, xctx.getNamespaces());
+
+		Schemas s = new Schemas(xs, xctx.getDefaultNamespace(), allNs, xctx);
+		s.process(o, xctx);
+		s.serializeTo(out);
+	}
+
+	/**
+	 * Returns an XML-Schema validator based on the output returned by {@link #doSerialize(Object, Writer, SerializerContext)};
+	 *
+	 * @param o The object to serialize.
+	 * @param ctx The serializer context object return by {@link #createContext(ObjectMap, Method)}.<br>
+	 * 	Can be <jk>null</jk>.
+	 * @return The new validator.
+	 * @throws SAXException If a problem was detected in the XML-Schema output produced by this serializer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public Validator getValidator(Object o, SerializerContext ctx) throws SerializeException, SAXException {
+		String xmlSchema = serialize(o, ctx);
+
+		// create a SchemaFactory capable of understanding WXS schemas
+		SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+
+		if (xmlSchema.indexOf('\u0000') != -1) {
+
+			// Break it up into a map of namespaceURI->schema document
+			final Map<String,String> schemas = new HashMap<String,String>();
+			String[] ss = xmlSchema.split("\u0000");
+			xmlSchema = ss[0];
+			for (String s : ss) {
+				Matcher m = pTargetNs.matcher(s);
+				if (m.find())
+					schemas.put(m.group(1), s);
+			}
+
+			// Create a custom resolver
+			factory.setResourceResolver(
+				new LSResourceResolver() {
+
+					@Override /* LSResourceResolver */
+					public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
+
+						String schema = schemas.get(namespaceURI);
+						if (schema == null)
+							throw new RuntimeException(MessageFormat.format("No schema found for namespaceURI ''{0}''", namespaceURI));
+
+						try {
+							DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
+							DOMImplementationLS domImplementationLS = (DOMImplementationLS)registry.getDOMImplementation("LS 3.0");
+							LSInput in = domImplementationLS.createLSInput();
+							in.setCharacterStream(new StringReader(schema));
+							in.setSystemId(systemId);
+							return in;
+
+						} catch (Exception e) {
+							throw new RuntimeException(e);
+						}
+					}
+				}
+			);
+		}
+		return factory.newSchema(new StreamSource(new StringReader(xmlSchema))).newValidator();
+	}
+
+	private static Pattern pTargetNs = Pattern.compile("targetNamespace=['\"]([^'\"]+)['\"]");
+
+
+	/* An instance of a global element, global attribute, or XML type to be serialized. */
+	private static class QueueEntry {
+		Namespace ns;
+		String name;
+		ClassMeta<?> cm;
+		QueueEntry(Namespace ns, String name, ClassMeta<?> cm) {
+			this.ns = ns;
+			this.name = name;
+			this.cm = cm;
+		}
+	}
+
+	/* An encapsulation of all schemas present in the metamodel of the serialized object. */
+	private class Schemas extends LinkedHashMap<Namespace,Schema> {
+
+		private static final long serialVersionUID = 1L;
+
+		private Namespace defaultNs;
+		private LinkedList<QueueEntry>
+			elementQueue = new LinkedList<QueueEntry>(),
+			attributeQueue = new LinkedList<QueueEntry>(),
+			typeQueue = new LinkedList<QueueEntry>();
+
+		private Schemas(Namespace xs, Namespace defaultNs, Namespace[] allNs, XmlSerializerContext ctx) throws IOException {
+			this.defaultNs = defaultNs;
+			for (Namespace ns : allNs)
+				put(ns, new Schema(this, xs, ns, defaultNs, allNs, ctx));
+		}
+
+		private Schema getSchema(Namespace ns) {
+			if (ns == null)
+				ns = defaultNs;
+			Schema s = get(ns);
+			if (s == null)
+				throw new RuntimeException("No schema defined for namespace '"+ns+"'");
+			return s;
+		}
+
+		private void process(Object o, SerializerContext ctx) throws IOException {
+			ClassMeta<?> cm = ctx.getBeanContext().getClassMetaForObject(o);
+			Namespace ns = defaultNs;
+			if (cm == null)
+				queueElement(ns, "null", object());
+			else {
+				XmlClassMeta xmlMeta = cm.getXmlMeta();
+				if (xmlMeta.getElementName() != null && xmlMeta.getNamespace() != null)
+					ns = xmlMeta.getNamespace();
+				queueElement(ns, xmlMeta.getElementName(), cm);
+			}
+			processQueue();
+		}
+
+
+		private void processQueue() throws IOException {
+			boolean b;
+			do {
+				b = false;
+				while (! elementQueue.isEmpty()) {
+					QueueEntry q = elementQueue.removeFirst();
+					b |= getSchema(q.ns).processElement(q.name, q.cm);
+				}
+				while (! typeQueue.isEmpty()) {
+					QueueEntry q = typeQueue.removeFirst();
+					b |= getSchema(q.ns).processType(q.name, q.cm);
+				}
+				while (! attributeQueue.isEmpty()) {
+					QueueEntry q = attributeQueue.removeFirst();
+					b |= getSchema(q.ns).processAttribute(q.name, q.cm);
+				}
+			} while (b);
+		}
+
+		private void queueElement(Namespace ns, String name, ClassMeta<?> cm) {
+			elementQueue.add(new QueueEntry(ns, name, cm));
+		}
+
+		private void queueType(Namespace ns, String name, ClassMeta<?> cm) {
+			if (name == null)
+				name = XmlUtils.encodeElementName(cm.toString());
+			typeQueue.add(new QueueEntry(ns, name, cm));
+		}
+
+		private void queueAttribute(Namespace ns, String name, ClassMeta<?> cm) {
+			attributeQueue.add(new QueueEntry(ns, name, cm));
+		}
+
+		private void serializeTo(Writer w) throws IOException {
+			boolean b = false;
+			for (Schema s : values()) {
+				if (b)
+					w.append('\u0000');
+				w.append(s.toString());
+				b = true;
+			}
+		}
+	}
+
+	/* An encapsulation of a single schema. */
+	private class Schema {
+		private StringWriter sw = new StringWriter();
+		private XmlSerializerWriter w;
+		private XmlSerializerContext ctx;
+		private Namespace defaultNs, targetNs;
+		private Schemas schemas;
+		private Set<String>
+			processedTypes = new HashSet<String>(),
+			processedAttributes = new HashSet<String>(),
+			processedElements = new HashSet<String>();
+
+		public Schema(Schemas schemas, Namespace xs, Namespace targetNs, Namespace defaultNs, Namespace[] allNs, XmlSerializerContext ctx) throws IOException {
+			this.schemas = schemas;
+			this.defaultNs = defaultNs;
+			this.targetNs = targetNs;
+			this.ctx = ctx;
+			w = new XmlSerializerWriter(sw, ctx.isUseIndentation(), ctx.getQuoteChar(), null, null, true, null);
+			int i = ctx.getIndent();
+			w.oTag(i, "schema");
+			w.attr("xmlns", xs.getUri());
+			w.attr("targetNamespace", targetNs.getUri());
+			w.attr("elementFormDefault", "qualified");
+			if (targetNs != defaultNs)
+				w.attr("attributeFormDefault", "qualified");
+			for (Namespace ns2 : allNs)
+				w.attr("xmlns", ns2.name, ns2.uri);
+			w.append('>').nl();
+			for (Namespace ns : allNs) {
+				if (ns != targetNs) {
+					w.oTag(i+1, "import")
+						.attr("namespace", ns.getUri())
+						.attr("schemaLocation", ns.getName()+".xsd")
+						.append("/>").nl();
+				}
+			}
+		}
+
+		private boolean processElement(String name, ClassMeta<?> cm) throws IOException {
+			if (processedElements.contains(name))
+				return false;
+			processedElements.add(name);
+
+			ClassMeta<?> ft = cm.getFilteredClassMeta();
+			int i = ctx.getIndent() + 1;
+			if (name == null)
+				name = getElementName(ft);
+			Namespace ns = first(ft.getXmlMeta().getNamespace(), defaultNs);
+			String type = getXmlType(ns, ft);
+
+			w.oTag(i, "element")
+				.attr("name", XmlUtils.encodeElementName(name))
+				.attr("type", type)
+				.append('/').append('>').nl();
+
+			schemas.queueType(ns, null, ft);
+			schemas.processQueue();
+			return true;
+		}
+
+		private boolean processAttribute(String name, ClassMeta<?> cm) throws IOException {
+			if (processedAttributes.contains(name))
+				return false;
+			processedAttributes.add(name);
+
+			int i = ctx.getIndent() + 1;
+			String type = getXmlAttrType(cm);
+
+			w.oTag(i, "attribute")
+				.attr("name", name)
+				.attr("type", type)
+				.append('/').append('>').nl();
+
+			return true;
+		}
+
+		private boolean processType(String name, ClassMeta<?> cm) throws IOException {
+			if (processedTypes.contains(name))
+				return false;
+			processedTypes.add(name);
+
+			int i = ctx.getIndent() + 1;
+
+			cm = cm.getFilteredClassMeta();
+
+			w.oTag(i, "complexType")
+				.attr("name", name);
+
+			// This element can have mixed content if:
+			// 	1) It's a generic Object (so it can theoretically be anything)
+			//		2) The bean has a property defined with @XmlFormat.CONTENT.
+			if ((cm.isBean() && cm.getBeanMeta().getXmlMeta().getXmlContentProperty() != null) || cm.isObject())
+				w.attr("mixed", "true");
+
+			w.cTag().nl();
+
+			if (! (cm.isMap() || cm.isBean() || cm.hasToObjectMapMethod() || cm.isCollection() || cm.isArray() || (cm.isAbstract() && ! cm.isNumber()) || cm.isObject())) {
+				String base = getXmlAttrType(cm);
+				w.sTag(i+1, "simpleContent").nl();
+				w.oTag(i+2, "extension")
+					.attr("base", base);
+				if (ctx.isAddJsonTypeAttrs() || (ctx.isAddJsonStringTypeAttrs() && base.equals("string"))) {
+					w.cTag().nl();
+					w.oTag(i+3, "attribute")
+						.attr("name", "type")
+						.attr("type", "string")
+						.ceTag().nl();
+					w.eTag(i+2, "extension").nl();
+				} else {
+					w.ceTag().nl();
+				}
+				w.eTag(i+1, "simpleContent").nl();
+
+			} else {
+
+				//----- Bean -----
+				if (cm.isBean()) {
+					BeanMeta<?> bm = cm.getBeanMeta();
+
+					boolean hasChildElements = false;
+
+					for (BeanPropertyMeta<?> pMeta : bm.getPropertyMetas())
+						if (pMeta.getXmlMeta().getXmlFormat() != XmlFormat.ATTR && pMeta.getXmlMeta().getXmlFormat() != XmlFormat.CONTENT)
+							hasChildElements = true;
+
+					if (bm.getXmlMeta().getXmlContentProperty() != null) {
+						w.sTag(i+1, "sequence").nl();
+						w.oTag(i+2, "any")
+							.attr("processContents", "skip")
+							.attr("minOccurs", 0)
+							.ceTag().nl();
+						w.eTag(i+1, "sequence").nl();
+
+					} else if (hasChildElements) {
+						w.sTag(i+1, "sequence").nl();
+
+						boolean hasOtherNsElement = false;
+
+						for (BeanPropertyMeta<?> pMeta : bm.getPropertyMetas()) {
+							XmlBeanPropertyMeta<?> xmlMeta = pMeta.getXmlMeta();
+							if (xmlMeta.getXmlFormat() != XmlFormat.ATTR) {
+								boolean isCollapsed = xmlMeta.getXmlFormat() == COLLAPSED;
+								ClassMeta<?> ct2 = pMeta.getClassMeta();
+								String childName = pMeta.getName();
+								if (isCollapsed) {
+									if (xmlMeta.getChildName() != null)
+										childName = xmlMeta.getChildName();
+									ct2 = pMeta.getClassMeta().getElementType();
+								}
+								Namespace cNs = first(xmlMeta.getNamespace(), ct2.getXmlMeta().getNamespace(), cm.getXmlMeta().getNamespace(), defaultNs);
+								if (xmlMeta.getNamespace() == null) {
+									w.oTag(i+2, "element")
+										.attr("name", XmlUtils.encodeElementName(childName), true)
+										.attr("type", getXmlType(cNs, ct2));
+									if (isCollapsed) {
+										w.attr("minOccurs", 0);
+										w.attr("maxOccurs", "unbounded");
+									} else {
+										if (! ctx.isTrimNulls())
+											w.attr("nillable", true);
+										else
+											w.attr("minOccurs", 0);
+									}
+
+									w.ceTag().nl();
+								} else {
+									// Child element is in another namespace.
+									schemas.queueElement(cNs, pMeta.getName(), ct2);
+									hasOtherNsElement = true;
+								}
+
+							}
+						}
+
+						// If this bean has any child elements in another namespace,
+						// we need to add an <any> element.
+						if (hasOtherNsElement)
+							w.oTag(i+2, "any")
+								.attr("minOccurs", 0)
+								.attr("maxOccurs", "unbounded")
+								.ceTag().nl();
+						w.eTag(i+1, "sequence").nl();
+					}
+
+					for (BeanPropertyMeta<?> pMeta : bm.getXmlMeta().getXmlAttrProperties().values()) {
+						Namespace pNs = pMeta.getXmlMeta().getNamespace();
+						if (pNs == null)
+							pNs = defaultNs;
+
+						// If the bean attribute has a different namespace than the bean, then it needs to
+						// be added as a top-level entry in the appropriate schema file.
+						if (pNs != targetNs) {
+							schemas.queueAttribute(pNs, pMeta.getName(), pMeta.getClassMeta());
+							w.oTag(i+1, "attribute")
+							//.attr("name", pMeta.getName(), true)
+							.attr("ref", pNs.getName() + ':' + pMeta.getName())
+							.ceTag().nl();
+						}
+
+						// Otherwise, it's just a plain attribute of this bean.
+						else {
+							w.oTag(i+1, "attribute")
+								.attr("name", pMeta.getName(), true)
+								.attr("type", getXmlAttrType(pMeta.getClassMeta()))
+								.ceTag().nl();
+						}
+					}
+
+				//----- Collection -----
+				} else if (cm.isCollection() || cm.isArray()) {
+					ClassMeta<?> elementType = cm.getElementType();
+					if (elementType.isObject()) {
+						w.sTag(i+1, "sequence").nl();
+						w.oTag(i+2, "any")
+							.attr("processContents", "skip")
+							.attr("maxOccurs", "unbounded")
+							.attr("minOccurs", "0")
+							.ceTag().nl();
+						w.eTag(i+1, "sequence").nl();
+					} else {
+						Namespace cNs = first(elementType.getXmlMeta().getNamespace(), cm.getXmlMeta().getNamespace(), defaultNs);
+						schemas.queueType(cNs, null, elementType);
+						w.sTag(i+1, "sequence").nl();
+						w.oTag(i+2, "choice")
+							.attr("minOccurs", 0)
+							.attr("maxOccurs", "unbounded")
+							.cTag().nl();
+						w.oTag(i+3, "element")
+							.attr("name", XmlUtils.encodeElementName(getElementName(elementType)))
+							.attr("type", getXmlType(cNs, elementType))
+							.ceTag().nl();
+						w.oTag(i+3, "element")
+							.attr("name", "null")
+							.attr("type", "string")
+							.ceTag().nl();
+						w.eTag(i+2, "choice").nl();
+						w.eTag(i+1, "sequence").nl();
+					}
+
+				//----- Map -----
+				} else if (cm.isMap() || cm.hasToObjectMapMethod() || cm.isAbstract() || cm.isObject()) {
+					w.sTag(i+1, "sequence").nl();
+					w.oTag(i+2, "any")
+						.attr("processContents", "skip")
+						.attr("maxOccurs", "unbounded")
+						.attr("minOccurs", "0")
+						.ceTag().nl();
+					w.eTag(i+1, "sequence").nl();
+				}
+
+				if (ctx.isAddClassAttrs()) {
+					w.oTag(i+1, "attribute")
+						.attr("name", "_class")
+						.attr("type", "string")
+						.ceTag().nl();
+				}
+				if (ctx.isAddJsonTypeAttrs()) {
+					w.oTag(i+1, "attribute")
+						.attr("name", "type")
+						.attr("type", "string")
+						.ceTag().nl();
+				}
+			}
+
+			w.eTag(i, "complexType").nl();
+			schemas.processQueue();
+
+			return true;
+		}
+
+		private String getElementName(ClassMeta<?> cm) {
+			cm = cm.getFilteredClassMeta();
+			String name = cm.getXmlMeta().getElementName();
+
+			if (name == null) {
+				if (cm.isBoolean())
+					name = "boolean";
+				else if (cm.isNumber())
+					name = "number";
+				else if (cm.isArray() || cm.isCollection())
+					name = "array";
+				else if (! (cm.isMap() || cm.hasToObjectMapMethod() || cm.isBean() || cm.isCollection() || cm.isArray() || cm.isObject() || cm.isAbstract()))
+					name = "string";
+				else
+					name = "object";
+			}
+			return name;
+		}
+
+		@Override /* Object */
+		public String toString() {
+			try {
+				w.eTag(ctx.getIndent(), "schema").nl();
+			} catch (IOException e) {
+				throw new RuntimeException(e); // Shouldn't happen.
+			}
+			return sw.toString();
+		}
+
+		private String getXmlType(Namespace currentNs, ClassMeta<?> cm) {
+			String name = null;
+			cm = cm.getFilteredClassMeta();
+			if (currentNs == targetNs && ! ctx.isAddJsonTypeAttrs()) {
+				if (cm.isBoolean())
+					name = "boolean";
+				else if (cm.isNumber()) {
+					if (cm.isDecimal())
+						name = "decimal";
+					else
+						name = "integer";
+				}
+				if (name == null && ! ctx.isAddJsonStringTypeAttrs()) {
+					if (! (cm.isMap() || cm.hasToObjectMapMethod() || cm.isBean() || cm.isCollection() || cm.isArray() || cm.isObject() || cm.isAbstract()))
+						name = "string";
+				}
+			}
+			if (name == null) {
+				name = XmlUtils.encodeElementName(cm.toString());
+				schemas.queueType(currentNs, name, cm);
+				return currentNs.getName() + ":" + name;
+			}
+
+			return name;
+		}
+	}
+
+	private <T> T first(T...tt) {
+		for (T t : tt)
+			if (t != null)
+				return t;
+		return null;
+	}
+
+
+	private static String getXmlAttrType(ClassMeta<?> cm) {
+		if (cm.isBoolean())
+			return "boolean";
+		if (cm.isNumber()) {
+			if (cm.isDecimal())
+				return "decimal";
+			return "integer";
+		}
+		return "string";
+	}
+
+	@Override /* Serializer */
+	public XmlSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		// This serializer must always have namespaces enabled.
+		if (properties == null)
+			properties = new ObjectMap();
+		properties.put(XmlSerializerProperties.XML_enableNamespaces, true);
+		return new XmlSerializerContext(getBeanContext(), sp, xsp, properties, javaMethod);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Simple.class
new file mode 100755
index 0000000..bc8d4b1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleSq.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleSq.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleSq.class
new file mode 100755
index 0000000..3ddea63
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleSq.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleXmlJsonSq.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleXmlJsonSq.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleXmlJsonSq.class
new file mode 100755
index 0000000..d1b38a7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SimpleXmlJsonSq.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Sq.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Sq.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Sq.class
new file mode 100755
index 0000000..2db7192
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$Sq.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SqReadable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SqReadable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SqReadable.class
new file mode 100755
index 0000000..71e44be
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$SqReadable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJson.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJson.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJson.class
new file mode 100755
index 0000000..8d4a34b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJson.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJsonSq.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJsonSq.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJsonSq.class
new file mode 100755
index 0000000..4264fee
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer$XmlJsonSq.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.class
new file mode 100755
index 0000000..221a0e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.java
new file mode 100755
index 0000000..8b75856
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializer.java
@@ -0,0 +1,725 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+import static com.ibm.juno.core.xml.XmlSerializerProperties.*;
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Serializes POJO models to XML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/xml</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/xml</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	See the {@link JsonSerializer} class for details on how Java models map to JSON.
+ * <p>
+ * 	For example, the following JSON...
+ * <p class='bcode'>
+ * 	{
+ * 		name:<js>'John Smith'</js>,
+ * 		address: {
+ * 			streetAddress: <js>'21 2nd Street'</js>,
+ * 			city: <js>'New York'</js>,
+ * 			state: <js>'NY'</js>,
+ * 			postalCode: <js>10021</js>
+ * 		},
+ * 		phoneNumbers: [
+ * 			<js>'212 555-1111'</js>,
+ * 			<js>'212 555-2222'</js>
+ * 		],
+ * 		additionalInfo: <jk>null</jk>,
+ * 		remote: <jk>false</jk>,
+ * 		height: <js>62.4</js>,
+ * 		<js>'fico score'</js>:  <js>' &gt; 640'</js>
+ * 	}
+ * <p>
+ * 	...maps to the following XML...
+ * <p class='bcode'>
+ * 	<xt>&lt;object&gt;</xt>
+ * 		<xt>&lt;name</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
+ * 		<xt>&lt;address</xt> <xa>type</xa>=<xs>'object'</xs><xt>&gt;</xt>
+ * 			<xt>&lt;streetAddress</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt>21 2nd Street<xt>&lt;/streetAddress&gt;</xt>
+ * 			<xt>&lt;city</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt>New York<xt>&lt;/city&gt;</xt>
+ * 			<xt>&lt;state</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt>NY<xt>&lt;/state&gt;</xt>
+ * 			<xt>&lt;postalCode</xt> <xa>type</xa>=<xs>'number'</xs><xt>&gt;</xt>10021<xt>&lt;/postalCode&gt;</xt>
+ * 		<xt>&lt;/address&gt;</xt>
+ * 		<xt>&lt;phoneNumbers</xt> <xa>type</xa>=<xs>'array'</xs><xt>&gt;</xt>
+ * 			<xt>&lt;string&gt;</xt>212 555-1111<xt>&lt;/string&gt;</xt>
+ * 			<xt>&lt;string&gt;</xt>212 555-2222<xt>&lt;/string&gt;</xt>
+ * 		<xt>&lt;/phoneNumbers&gt;</xt>
+ * 		<xt>&lt;additionalInfo</xt> <xa>type</xa>=<xs>'null'</xs><xt>&gt;&lt;/additionalInfo&gt;</xt>
+ * 		<xt>&lt;remote</xt> <xa>type</xa>=<xs>'boolean'</xs><xt>&gt;</xt>false<xt>&lt;/remote&gt;</xt>
+ * 		<xt>&lt;height</xt> <xa>type</xa>=<xs>'number'</xs><xt>&gt;</xt>62.4<xt>&lt;/height&gt;</xt>
+ * 		<xt>&lt;fico_x0020_score</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt> &amp;gt; 640<xt>&lt;/fico_x0020_score&gt;</xt>
+ * 	<xt>&lt;/object&gt;</xt>
+ * <p>
+ * 	This serializer provides several serialization options.  Typically, one of the predefined <jsf>DEFAULT</jsf> serializers will be sufficient.
+ * 	However, custom serializers can be constructed to fine-tune behavior.
+ * <p>
+ * 	If an attribute name contains any non-valid XML element characters, they will be escaped using standard {@code _x####_} notation.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link XmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link Sq} - Default serializer, single quotes.
+ * 	<li>{@link SqReadable} - Default serializer, single quotes, whitespace added.
+ * 	<li>{@link XmlJson} - Default serializer with JSON attribute tags.
+ * 	<li>{@link XmlJsonSq} - Default serializer with JSON attribute tags, single quotes.
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Produces("text/xml")
+public class XmlSerializer extends WriterSerializer {
+
+	/** Default serializer, all default settings. */
+	public static final XmlSerializer DEFAULT = new XmlSerializer().lock();
+
+	/** Default serializer, single quotes. */
+	public static final XmlSerializer DEFAULT_SQ = new XmlSerializer.Sq().lock();
+
+	/** Default serializer, single quotes, whitespace added. */
+	public static final XmlSerializer DEFAULT_SQ_READABLE = new XmlSerializer.SqReadable().lock();
+
+	/** Default serializer with JSON attribute tags. */
+	public static final XmlSerializer DEFAULT_XMLJSON = new XmlSerializer.XmlJson().lock();
+
+	/** Default serializer with JSON attribute tags, single quotes. */
+	public static final XmlSerializer DEFAULT_XMLJSON_SQ = new XmlSerializer.XmlJsonSq().lock();
+
+	/** Default serializer without namespaces. */
+	public static final XmlSerializer DEFAULT_SIMPLE = new XmlSerializer.Simple().lock();
+
+	/** Default serializer without namespaces, with single quotes. */
+	public static final XmlSerializer DEFAULT_SIMPLE_SQ = new XmlSerializer.SimpleSq().lock();
+
+	/** Default serializer without namespaces, with JSON attribute tags and single quotes. */
+	public static final XmlSerializer DEFAULT_SIMPLE_XMLJSON_SQ = new XmlSerializer.SimpleXmlJsonSq().lock();
+
+
+	/** Default serializer, single quotes. */
+	public static class Sq extends XmlSerializer {
+		/** Constructor */
+		public Sq() {
+			setProperty(SERIALIZER_quoteChar, '\'');
+		}
+	}
+
+	/** Default serializer, single quotes, whitespace added. */
+	public static class SqReadable extends Sq {
+		/** Constructor */
+		public SqReadable() {
+			setProperty(SERIALIZER_useIndentation, true);
+		}
+	}
+
+	/** Default serializer with JSON attribute tags. */
+	@Produces(value="text/xml+json",contentType="text/xml")
+	public static class XmlJson extends XmlSerializer {
+		/** Constructor */
+		public XmlJson() {
+			setProperty(XML_addJsonTypeAttrs, true);
+		}
+	}
+
+	/** Default serializer with JSON attribute tags, single quotes. */
+	public static class XmlJsonSq extends XmlJson {
+		/** Constructor */
+		public XmlJsonSq() {
+			setProperty(SERIALIZER_quoteChar, '\'');
+		}
+	}
+
+	/** Default serializer without namespaces. */
+	@Produces(value="text/xml+simple",contentType="text/xml")
+	public static class Simple extends XmlSerializer {
+		/** Constructor */
+		public Simple() {
+			setProperty(XML_enableNamespaces, false);
+		}
+	}
+
+	/** Default serializer without namespaces, single quotes. */
+	public static class SimpleSq extends Simple {
+		/** Constructor */
+		public SimpleSq() {
+			setProperty(SERIALIZER_quoteChar, '\'');
+		}
+	}
+
+	/** Default serializer with JSON attribute tags, single quotes. */
+	public static class SimpleXmlJsonSq extends SimpleSq {
+		/** Constructor */
+		public SimpleXmlJsonSq() {
+			setProperty(XML_addJsonTypeAttrs, true);
+		}
+	}
+
+	/** XML serializer properties currently set on this serializer. */
+	protected transient XmlSerializerProperties xsp = new XmlSerializerProperties();
+
+
+	/**
+	 * Recursively searches for the XML namespaces on the specified POJO and adds them to the serializer context object.
+	 *
+	 * @param o The POJO to check.
+	 * @param ctx The context that exists for the duration of a single serialization.
+	 * @throws SerializeException
+	 */
+	protected void findNsfMappings(Object o, XmlSerializerContext ctx) throws SerializeException {
+		BeanContext bc = ctx.getBeanContext();
+		ClassMeta<?> aType = null;						// The actual type
+		aType = ctx.push(null, o, null);
+
+		if (aType != null) {
+			Namespace ns = aType.getXmlMeta().getNamespace();
+			if (ns != null) {
+				if (ns.uri != null)
+					ctx.addNamespace(ns);
+				else
+					ns = null;
+			}
+		}
+
+		// Handle recursion
+		if (aType != null && ! aType.isPrimitive()) {
+
+			BeanMap bm = null;
+			if (aType.isBeanMap()) {
+				bm = (BeanMap)o;
+			} else if (aType.isBean()) {
+				bm = bc.forBean(o);
+			} else if (aType.isDelegate()) {
+				ClassMeta innerType = ((Delegate)o).getClassMeta();
+				Namespace ns = innerType.getXmlMeta().getNamespace();
+				if (ns != null) {
+					if (ns.uri != null)
+						ctx.addNamespace(ns);
+					else
+						ns = null;
+				}
+
+				if (innerType.isBean()) {
+					for (BeanPropertyMeta bpm : (Collection<BeanPropertyMeta>)innerType.getBeanMeta().getPropertyMetas()) {
+						ns = bpm.getXmlMeta().getNamespace();
+						if (ns != null && ns.uri != null)
+							ctx.addNamespace(ns);
+					}
+
+				} else if (innerType.isMap()) {
+					for (Object o2 : ((Map)o).values())
+						findNsfMappings(o2, ctx);
+				} else if (innerType.isCollection()) {
+					for (Object o2 : ((Collection)o))
+						findNsfMappings(o2, ctx);
+				}
+
+			} else if (aType.isMap()) {
+				for (Object o2 : ((Map)o).values())
+					findNsfMappings(o2, ctx);
+			} else if (aType.isCollection()) {
+				for (Object o2 : ((Collection)o))
+					findNsfMappings(o2, ctx);
+			} else if (aType.isArray() && ! aType.getElementType().isPrimitive()) {
+				for (Object o2 : ((Object[])o))
+					findNsfMappings(o2, ctx);
+			}
+			if (bm != null) {
+				for (BeanMapEntry p : (Set<BeanMapEntry>)bm.entrySet()) {
+
+					Namespace ns = p.getMeta().getXmlMeta().getNamespace();
+					if (ns != null && ns.uri != null)
+						ctx.addNamespace(ns);
+
+					try {
+						findNsfMappings(p.getValue(), ctx);
+					} catch (Throwable x) {
+						// Ignore
+					}
+				}
+			}
+		}
+
+		ctx.pop();
+	}
+
+	/**
+	 * Workhorse method.
+	 *
+	 * @param out The writer to send the output to.
+	 * @param o The object to serialize.
+	 * @param eType The expected type if this is a bean property value being serialized.
+	 * @param ctx The serializer context.
+	 * @param elementName The root element name.
+	 * @param elementNamespace The namespace of the element.
+	 * @param addNamespaceUris Flag indicating that namespace URIs need to be added.
+	 * @param format The format to serialize the output to.
+	 * @param pMeta The bean property metadata if this is a bean property being serialized.
+	 * @return The same writer passed in so that calls to the writer can be chained.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	protected XmlSerializerWriter serializeAnything(XmlSerializerWriter out, Object o, ClassMeta eType,
+			XmlSerializerContext ctx, String elementName, Namespace elementNamespace, boolean addNamespaceUris,
+			XmlFormat format, BeanPropertyMeta<?> pMeta) throws IOException, SerializeException {
+
+		BeanContext bc = ctx.getBeanContext();
+		String ts = null;              // The type string (e.g. <type> or <x x='type'>
+		int indent = ctx.indent;       // Current indentation
+		ClassMeta<?> aType = null;     // The actual type
+		ClassMeta<?> wType = null;     // The wrapped type
+		ClassMeta<?> gType = object(); // The generic type
+
+		aType = ctx.push(elementName, o, eType);
+
+		if (eType == null)
+			eType = object();
+
+		// Handle recursion
+		if (aType == null) {
+			o = null;
+			aType = object();
+		}
+
+		if (o != null) {
+
+			if (aType.isDelegate()) {
+				wType = aType;
+				aType = ((Delegate)o).getClassMeta();
+			}
+
+			gType = aType.getFilteredClassMeta();
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+		} else {
+			gType = eType.getFilteredClassMeta();
+		}
+
+		String classAttr = null;
+		if (ctx.isAddClassAttrs()) {
+			if (o != null && ! eType.equals(aType))
+				classAttr = aType.toString();
+			else if (o == null)
+				classAttr = eType.toString();
+		}
+
+		// char '\0' is interpreted as null.
+		if (o != null && gType.isChar() && ((Character)o).charValue() == 0)
+			o = null;
+
+		boolean isCollapsed = false;		// If 'true', this is a collection and we're not rendering the outer element.
+
+		// Get the JSON type string.
+		if (gType.isCharSequence() || gType.isChar())
+			ts = "string";
+		else if (gType.isNumber())
+			ts = "number";
+		else if (gType.isBoolean())
+			ts = "boolean";
+		else if (gType.isMap() || gType.isBean() || gType.hasToObjectMapMethod()) {
+			isCollapsed = gType.getXmlMeta().getFormat() == XmlFormat.COLLAPSED;
+			ts = "object";
+		}
+		else if (gType.isCollection() || gType.isArray()) {
+			isCollapsed = (format == COLLAPSED && ! addNamespaceUris);
+			ts = "array";
+		}
+		else
+			ts = "string";
+
+
+		// Is there a name associated with this bean?
+		if (elementName == null)
+			elementName = gType.getXmlMeta().getElementName();
+		if (elementName == null)
+			elementName = aType.getXmlMeta().getElementName();
+
+		// If the value is null then it's either going to be <null/> or <XmlSerializer nil='true'/>
+		// depending on whether the element has a name.
+		boolean isNullTag = (elementName == null && o == null);
+
+		if (isNullTag)
+			ts = "null";
+
+		if (ctx.isEnableNamespaces()) {
+			if (elementNamespace == null)
+				elementNamespace = gType.getXmlMeta().getNamespace();
+			if (elementNamespace == null)
+				elementNamespace = aType.getXmlMeta().getNamespace();
+			if (elementNamespace != null && elementNamespace.uri == null)
+				elementNamespace = null;
+			if (elementNamespace == null)
+				elementNamespace = ctx.getDefaultNamespace();
+		} else {
+			elementNamespace = null;
+		}
+
+		// Do we need a carriage return after the start tag?
+		boolean cr = o != null && (gType.isMap() || gType.isCollection() || gType.isArray() || gType.isBean() || gType.hasToObjectMapMethod());
+
+		String en = (elementName == null ? ts : elementName);
+		boolean encodeEn = elementName != null;
+		String ns = (elementNamespace == null ? null : elementNamespace.name);
+		String xsi = null, dns = null, elementNs = null;
+		if (ctx.isEnableNamespaces()) {
+			xsi = ctx.getXsiNamespace().name;
+			dns = elementName == null && ctx.getDefaultNamespace() != null ? ctx.getDefaultNamespace().name : null;
+			elementNs = elementName == null ? dns : ns;
+			if (elementName == null)
+				elementNamespace = null;
+		}
+
+		// Render the start tag.
+		if (! isCollapsed) {
+			out.oTag(indent, elementNs, en, encodeEn);
+			if (addNamespaceUris) {
+				out.attr((String)null, "xmlns", ctx.getDefaultNamespace().getUri());
+
+				for (Namespace n : ctx.getNamespaces())
+					out.attr("xmlns", n.getName(), n.getUri());
+
+				Namespace xsiNs = ctx.getXsiNamespace();
+				if (xsiNs != null)
+					out.attr("xmlns", xsiNs.name, xsiNs.uri);
+			}
+			if (elementName != null && ctx.isAddJsonTypeAttrs() && (ctx.isAddJsonStringTypeAttrs() || ! ts.equals("string")))
+				out.attr(dns, "type", ts);
+			if (classAttr != null)
+				out.attr(dns, "_class", classAttr);
+			if (o == null) {
+				if (! isNullTag)
+					out.attr(xsi, "nil", "true");
+				if ((gType.isBoolean() || gType.isNumber()) && ! gType.isNullable())
+					o = gType.getPrimitiveDefault();
+			}
+
+			if (o != null && !(gType.isMap() || gType.isBean() || gType.hasToObjectMapMethod()))
+				out.append('>');
+
+			if (cr && !(gType.isMap() || gType.isBean() || gType.hasToObjectMapMethod()))
+				out.nl();
+		}
+
+		boolean hasChildren = true;
+
+		// Render the tag contents.
+		if (o != null) {
+			if (gType.isUri() || (pMeta != null && pMeta.isUri()))
+				out.appendUri(o);
+			else if (gType.isCharSequence() || gType.isChar())
+				out.encodeText(o);
+			else if (gType.isNumber() || gType.isBoolean())
+				out.append(o);
+			else if (gType.isMap() || (wType != null && wType.isMap())) {
+				if (o instanceof BeanMap)
+					hasChildren = serializeBeanMap(out, (BeanMap)o, elementNamespace, ctx, isCollapsed);
+				else
+					hasChildren = serializeMap(out, (Map)o, gType, ctx);
+			}
+			else if (gType.hasToObjectMapMethod())
+				hasChildren = serializeMap(out, gType.toObjectMap(o), gType, ctx);
+			else if (gType.isBean())
+				hasChildren = serializeBeanMap(out, bc.forBean(o), elementNamespace, ctx, isCollapsed);
+			else if (gType.isCollection() || (wType != null && wType.isCollection())) {
+				if (isCollapsed)
+					ctx.indent--;
+				serializeCollection(out, (Collection)o, gType, ctx, pMeta);
+				if (isCollapsed)
+					ctx.indent++;
+			}
+			else if (gType.isArray()) {
+				if (isCollapsed)
+					ctx.indent--;
+				serializeCollection(out, toList(gType.getInnerClass(), o), gType, ctx, pMeta);
+				if (isCollapsed)
+					ctx.indent++;
+			}
+			else
+				out.encodeText(o);
+		}
+
+		ctx.pop();
+
+		// Render the end tag.
+		if (! isCollapsed) {
+			if (o == null || ! hasChildren)
+				out.append('/').append('>').nl();
+			else
+				out.i(cr ? indent : 0).eTag(elementNs, en, encodeEn).nl();
+		}
+
+		return out;
+	}
+
+	private boolean serializeMap(XmlSerializerWriter out, Map m, ClassMeta<?> type, XmlSerializerContext ctx) throws IOException, SerializeException {
+
+		m = sort(ctx, m);
+
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		boolean hasChildren = false;
+		for (Iterator i = m.entrySet().iterator(); i.hasNext();) {
+			Map.Entry e = (Map.Entry)i.next();
+
+			Object k = e.getKey();
+			if (k == null) {
+				k = "\u0000";
+			} else {
+				k = generalize(ctx, k, keyType);
+			}
+
+			Object value = e.getValue();
+
+			if (! hasChildren) {
+				hasChildren = true;
+				out.append('>').nl();
+			}
+			serializeAnything(out, value, valueType, ctx, k.toString(), null, false, NORMAL, null);
+		}
+		return hasChildren;
+	}
+
+	private boolean serializeBeanMap(XmlSerializerWriter out, BeanMap m, Namespace elementNs, XmlSerializerContext ctx, boolean isCollapsed) throws IOException, SerializeException {
+		boolean hasChildren = false;
+		BeanMeta bm = m.getMeta();
+
+		Map<String,BeanPropertyMeta> xmlAttrs = bm.getXmlMeta().getXmlAttrProperties();
+		Object content = null;
+		for (BeanPropertyMeta p : xmlAttrs.values()) {
+
+			String key = p.getName();
+			Object value = null;
+			try {
+				value = p.get(m);
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable x) {
+				ctx.addBeanGetterWarning(p, x);
+			}
+
+			if (canIgnoreValue(ctx, p.getClassMeta(), key, value))
+				continue;
+
+			Namespace ns = (ctx.isEnableNamespaces() && p.getXmlMeta().getNamespace() != elementNs ? p.getXmlMeta().getNamespace() : null);
+
+			if (p.isBeanUri() || p.isUri())
+				out.attrUri(ns, key, value);
+			else
+				out.attr(ns, key, value);
+		}
+
+		boolean hasContent = false;
+
+		for (BeanMapEntry p : (Set<BeanMapEntry>)m.entrySet()) {
+			BeanPropertyMeta pMeta = p.getMeta();
+			XmlFormat xf = pMeta.getXmlMeta().getXmlFormat();
+
+			if (xf == CONTENT) {
+				content = p.getValue();
+				hasContent = true;
+			} else if (xf == ATTR) {
+				// Do nothing
+			} else {
+				String key = p.getKey();
+				Object value = null;
+				try {
+					value = p.getValue();
+				} catch (StackOverflowError e) {
+					throw e;
+				} catch (Throwable x) {
+					ctx.addWarning("Could not call getValue() on property ''{0}'', {1}", key, x.getLocalizedMessage());
+				}
+
+				if (canIgnoreValue(ctx, pMeta.getClassMeta(), key, value))
+					continue;
+
+				if (! hasChildren) {
+					hasChildren = true;
+					out.appendIf(! isCollapsed, '>').nl();
+				}
+				serializeAnything(out, value, pMeta.getClassMeta(), ctx, key, pMeta.getXmlMeta().getNamespace(), false, pMeta.getXmlMeta().getXmlFormat(), pMeta);
+			}
+		}
+		if ((! hasContent) || canIgnoreValue(ctx, string(), null, content))
+			return hasChildren;
+		out.append(">").cr(ctx.indent);
+
+		// Serialize XML content.
+		XmlContentHandler h = bm.getXmlMeta().getXmlContentHandler();
+		if (h != null)
+			try {
+				h.serialize(out, m.getBean());
+			} catch (Exception e) {
+				throw new SerializeException(e);
+			}
+		else
+			out.encodeText(content);
+		out.nl();
+		return true;
+	}
+
+	private XmlSerializerWriter serializeCollection(XmlSerializerWriter out, Collection c, ClassMeta<?> type, XmlSerializerContext ctx, BeanPropertyMeta<?> ppMeta) throws IOException, SerializeException {
+
+		c = sort(ctx, c);
+
+		ClassMeta<?> elementType = type.getElementType();
+
+		String eName = null;
+		Namespace eNs = null;
+
+		if (ppMeta != null) {
+			eName = ppMeta.getXmlMeta().getChildName();
+			eNs = ppMeta.getXmlMeta().getNamespace();
+		}
+
+		if (eName == null) {
+			eName = type.getXmlMeta().getChildName();
+			eNs = type.getXmlMeta().getNamespace();
+		}
+
+		if (eName == null && ! elementType.isObject()) {
+			eName = elementType.getXmlMeta().getElementName();
+			eNs = elementType.getXmlMeta().getNamespace();
+		}
+
+		for (Iterator i = c.iterator(); i.hasNext();) {
+			Object value = i.next();
+			serializeAnything(out, value, elementType, ctx, eName, eNs, false, NORMAL, null);
+		}
+		return out;
+	}
+
+	/**
+	 * Returns the schema serializer based on the settings of this serializer.
+	 * @return The schema serializer.
+	 */
+	public XmlSerializer getSchemaSerializer() {
+		XmlSchemaSerializer s = new XmlSchemaSerializer();
+		s.beanContextFactory = this.beanContextFactory;
+		s.sp = this.sp;
+		s.xsp = this.xsp;
+		return s;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		XmlSerializerContext xctx = (XmlSerializerContext)ctx;
+		if (xctx.isEnableNamespaces() && xctx.isAutoDetectNamespaces())
+			findNsfMappings(o, xctx);
+		serializeAnything(xctx.getWriter(out), o, null, xctx, null, null, xctx.isEnableNamespaces() && xctx.isAddNamespaceUrlsToRoot(), NORMAL, null);
+	}
+
+	@Override /* Serializer */
+	public XmlSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new XmlSerializerContext(getBeanContext(), sp, xsp, properties, javaMethod);
+	}
+
+	@Override /* CoreApi */
+	public XmlSerializer setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! xsp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> XmlSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public XmlSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public XmlSerializer clone() {
+		try {
+			XmlSerializer c = (XmlSerializer)super.clone();
+			c.xsp = xsp.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.class
new file mode 100755
index 0000000..16e777a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.java
new file mode 100755
index 0000000..0ea37fa
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerContext.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.xml.NamespaceFactory.*;
+import static com.ibm.juno.core.xml.XmlSerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of the {@link XmlSerializer}.
+ * <p>
+ * 	See {@link SerializerContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("hiding")
+public class XmlSerializerContext extends SerializerContext {
+
+	private final boolean
+		addJsonTypeAttrs,
+		addJsonStringTypeAttrs,
+		autoDetectNamespaces,
+		enableNamespaces,
+		addNamespaceUrlsToRoot;
+
+	private Namespace
+		defaultNamespace,
+		xsiNamespace,
+		xsNamespace;
+
+	private Namespace[] namespaces = new Namespace[0];
+
+	/**
+	 * Constructor.
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp Default general serializer properties.
+	 * @param xsp Default XML serializer properties.
+	 * @param op Override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	public XmlSerializerContext(BeanContext beanContext, SerializerProperties sp, XmlSerializerProperties xsp, ObjectMap op, Method javaMethod) {
+		super(beanContext, sp, op, javaMethod);
+		if (op == null || op.isEmpty()) {
+			addJsonTypeAttrs = xsp.addJsonTypeAttrs;
+			addJsonStringTypeAttrs = xsp.addJsonStringTypeAttrs;
+			enableNamespaces = xsp.enableNamespaces;
+			autoDetectNamespaces = xsp.autoDetectNamespaces;
+			addNamespaceUrlsToRoot = xsp.addNamespaceUrlsToRoot;
+			addNamespaces(xsp.namespaces);
+			setDefaultNamespace(xsp.defaultNamespace);
+			xsiNamespace = xsp.xsiNamespace;
+			xsNamespace = xsp.xsNamespace;
+		} else {
+			addJsonTypeAttrs = op.getBoolean(XML_addJsonTypeAttrs, xsp.addJsonTypeAttrs);
+			addJsonStringTypeAttrs = op.getBoolean(XML_addJsonStringTypeAttrs, xsp.addJsonStringTypeAttrs);
+			enableNamespaces = op.getBoolean(XML_enableNamespaces, xsp.enableNamespaces);
+			autoDetectNamespaces = op.getBoolean(XML_autoDetectNamespaces, xsp.autoDetectNamespaces);
+			addNamespaceUrlsToRoot = op.getBoolean(XML_addNamespaceUrisToRoot, xsp.addNamespaceUrlsToRoot);
+			namespaces = (op.containsKey(XML_namespaces) ? parseNamespaces(op.get(XML_namespaces)) : xsp.namespaces);
+			setDefaultNamespace(op.containsKey(XML_defaultNamespaceUri) ? op.getString(XML_defaultNamespaceUri) : xsp.defaultNamespace);
+			xsiNamespace = (op.containsKey(XML_xsiNamespace) ? parseNamespace(op.get(XML_xsiNamespace)) : xsp.xsiNamespace);
+			xsNamespace = (op.containsKey(XML_xsNamespace) ? parseNamespace(op.get(XML_xsNamespace)) : xsp.xsNamespace);
+		}
+	}
+
+	private void setDefaultNamespace(String s) {
+		if (s == null)
+			return;
+		if (StringUtils.startsWith(s, '{'))
+			defaultNamespace = parseNamespace(s);
+		else if (! s.startsWith("http://"))
+			defaultNamespace = get(s, "http://unknown");
+		else
+			defaultNamespace = get(null, s);
+	}
+
+	private void addNamespaces(Namespace...namespaces) {
+		for (Namespace ns : namespaces)
+			addNamespace(ns);
+	}
+
+	void addNamespace(Namespace ns) {
+		if (ns == defaultNamespace)
+			return;
+
+		for (Namespace n : namespaces)
+			if (n == ns)
+				return;
+
+		if (defaultNamespace != null && (ns.uri.equals(defaultNamespace.uri) || ns.name.equals(defaultNamespace.name)))
+			defaultNamespace = ns;
+		else
+			namespaces = ArrayUtils.append(namespaces, ns);
+	}
+
+	/**
+	 * Returns the list of namespaces being used in the current XML serialization.
+	 *
+	 * @return The list of namespaces being used in the current XML serialization.
+	 */
+	public Namespace[] getNamespaces() {
+		return namespaces;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_addJsonTypeAttrs} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_addJsonTypeAttrs} setting value in this context.
+	 */
+	public final boolean isAddJsonTypeAttrs() {
+		return addJsonTypeAttrs;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_addJsonStringTypeAttrs} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_addJsonStringTypeAttrs} setting value in this context.
+	 */
+	public final boolean isAddJsonStringTypeAttrs() {
+		return addJsonStringTypeAttrs;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_autoDetectNamespaces} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_autoDetectNamespaces} setting value in this context.
+	 */
+	public final boolean isAutoDetectNamespaces() {
+		return enableNamespaces && autoDetectNamespaces;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_enableNamespaces} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_enableNamespaces} setting value in this context.
+	 */
+	public final boolean isEnableNamespaces() {
+		return enableNamespaces;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_addNamespaceUrisToRoot} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_addNamespaceUrisToRoot} setting value in this context.
+	 */
+	public final boolean isAddNamespaceUrlsToRoot() {
+		return addNamespaceUrlsToRoot;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_defaultNamespaceUri} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_defaultNamespaceUri} setting value in this context.
+	 */
+	public final Namespace getDefaultNamespace() {
+		return defaultNamespace;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_xsiNamespace} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_xsiNamespace} setting value in this context.
+	 */
+	public final Namespace getXsiNamespace() {
+		return xsiNamespace;
+	}
+
+	/**
+	 * Returns the {@link XmlSerializerProperties#XML_xsNamespace} setting value in this context.
+	 *
+	 * @return The {@link XmlSerializerProperties#XML_xsNamespace} setting value in this context.
+	 */
+	public final Namespace getXsNamespace() {
+		return xsNamespace;
+	}
+
+	/**
+	 * Wraps the specified writer in a {@link XmlSerializerWriter} if it is not already an instance of that class.
+	 *
+	 * @param out The writer being wrapped.
+	 * @return The wrapped writer.
+	 */
+	public XmlSerializerWriter getWriter(Writer out) {
+		if (out instanceof XmlSerializerWriter)
+			return (XmlSerializerWriter)out;
+		return new XmlSerializerWriter(out, isUseIndentation(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase(), isEnableNamespaces(), getDefaultNamespace());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.class
new file mode 100755
index 0000000..1fa4859
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.class differ


[11/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.java
new file mode 100755
index 0000000..669a832
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Configurable properties common to all {@link Serializer} classes.
+ * <p>
+ * 	Use the {@link Serializer#setProperty(String, Object)} method to set property values.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SerializerProperties implements Cloneable {
+
+	/**
+	 * Max depth ({@link Integer}, default=<code>100</code>).
+	 * <p>
+	 * Abort serialization if specified depth is reached in the POJO tree.
+	 * If this depth is exceeded, an exception is thrown.
+	 * This prevents stack overflows from occurring when trying to serialize models with recursive references.
+	 */
+	public static final String SERIALIZER_maxDepth = "Serializer.maxDepth";
+
+	/**
+	 * Initial depth ({@link Integer}, default=<code>0</code>).
+	 * <p>
+	 * The initial indentation level at the root.
+	 * Useful when constructing document fragments that need to be indented at a certain level.
+	 */
+	public static final String SERIALIZER_initialDepth = "Serializer.initialDepth";
+
+	/**
+	 * Automatically detect POJO recursions ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * Specifies that recursions should be checked for during serialization.
+	 * <p>
+	 * Recursions can occur when serializing models that aren't true trees, but rather contain loops.
+	 * <p>
+	 * The behavior when recursions are detected depends on the value for {@link #SERIALIZER_ignoreRecursions}.
+	 * <p>
+	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
+	 * 	the following when <jsf>SERIALIZER_ignoreRecursions</jsf> is <jk>true</jk>...
+	 * <code>{A:{B:{C:null}}}</code><br>
+	 * <p>
+	 * Note:  Checking for recursion can cause a small performance penalty.
+	 */
+	public static final String SERIALIZER_detectRecursions = "Serializer.detectRecursions";
+
+	/**
+	 * Ignore recursion errors ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * Used in conjunction with {@link #SERIALIZER_detectRecursions}.
+	 * Setting is ignored if <jsf>SERIALIZER_detectRecursions</jsf> is <jk>false</jk>.
+	 * <p>
+	 * If <jk>true</jk>, when we encounter the same object when serializing a tree,
+	 * 	we set the value to <jk>null</jk>.
+	 * Otherwise, an exception is thrown.
+	 */
+	public static final String SERIALIZER_ignoreRecursions = "Serializer.ignoreRecursions";
+
+	/**
+	 * Debug mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * Enables the following additional information during serialization:
+	 * <ul>
+	 * 	<li>When bean getters throws exceptions, the exception includes the object stack information
+	 * 		in order to determine how that method was invoked.
+	 * 	<li>Enables {#link SERIALIZER_detectRecursions}.
+	 * </ul>
+	 */
+	public static final String SERIALIZER_debug = "Serializer.debug";
+
+	/**
+	 * Use indentation in output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, newlines and indentation is added to the output to improve readability.
+	 */
+	public static final String SERIALIZER_useIndentation = "Serializer.useIndentation";
+
+	/**
+	 * Add class attributes to output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, then <js>"_class"</js> attributes will be added to beans if their type cannot be inferred through reflection.
+	 * This is used to recreate the correct objects during parsing if the object types cannot be inferred.
+	 * For example, when serializing a {@code Map<String,Object>} field, where the bean class cannot be determined from the value type.
+	 */
+	public static final String SERIALIZER_addClassAttrs = "Serializer.addClassAttrs";
+
+	/**
+	 * Quote character ({@link Character}, default=<js>'"'</js>.
+	 * <p>
+	 * This is the character used for quoting attributes and values.
+	 */
+	public static final String SERIALIZER_quoteChar = "Serializer.quoteChar";
+
+	/**
+	 * Boolean.  Trim null bean property values from output.
+	 * <p>
+	 * 	If <jk>true</jk>, null bean values will not be serialized to the output.
+	 * <p>
+	 * 	Note that enabling this setting has the following effects on parsing:
+	 * 	<ul>
+	 * 		<li>Map entries with <jk>null</jk> values will be lost.
+	 * 	</ul>
+	 * <p>
+	 * 	Default is <jk>true</jk>.
+	 */
+	public static final String SERIALIZER_trimNullProperties = "Serializer.trimNullProperties";
+
+	/**
+	 * Boolean.  Trim empty lists and arrays from output.
+	 * <p>
+	 * 	If <jk>true</jk>, empty list values will not be serialized to the output.
+	 * <p>
+	 * 	Note that enabling this setting has the following effects on parsing:
+	 * 	<ul>
+	 * 		<li>Map entries with empty list values will be lost.
+	 * 		<li>Bean properties with empty list values will not be set.
+	 * 	</ul>
+	 * <p>
+	 * 	Default is <jk>false</jk>.
+	 */
+	public static final String SERIALIZER_trimEmptyLists = "Serializer.trimEmptyLists";
+
+	/**
+	 * Boolean.  Trim empty maps from output.
+	 * <p>
+	 * 	If <jk>true</jk>, empty map values will not be serialized to the output.
+	 * <p>
+	 * 	Note that enabling this setting has the following effects on parsing:
+	 * 	<ul>
+	 * 		<li>Bean properties with empty map values will not be set.
+	 * 	</ul>
+	 * <p>
+	 * 	Default is <jk>false</jk>.
+	 */
+	public static final String SERIALIZER_trimEmptyMaps = "Serializer.trimEmptyMaps";
+
+	/**
+	 * String.  URI base for relative URIs.
+	 * <p>
+	 * 	Prepended to relative URIs during serialization (along with the {@link #SERIALIZER_absolutePathUriBase} if specified.
+	 * 	(i.e. URIs not containing a schema and not starting with <js>'/'</js>).
+	 * 	(e.g. <js>"foo/bar"</js>)
+	 * <p>
+	 * 	Default is <js>""</js>.
+	 *
+	 * <dl>
+	 * 	<dt>Examples:</dt>
+	 * 	<dd>
+	 * <table class='styled'>
+	 * 	<tr><th>SERIALIZER_relativeUriBase</th><th>URI</th><th>Serialized URI</th></tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>mywebapp</code></td>
+	 * 		<td><code>http://foo:9080/bar/baz/mywebapp</code></td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>/mywebapp</code></td>
+	 * 		<td><code>/mywebapp</code></td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>http://mywebapp</code></td>
+	 * 		<td><code>http://mywebapp</code></td>
+	 * 	</tr>
+	 * </table>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String SERIALIZER_relativeUriBase = "Serializer.relativeUriBase";
+
+	/**
+	 * Boolean.  Sort arrays and collections alphabetically before serializing.
+	 * <p>
+	 * 	Note that this introduces a performance penalty.
+	 * <p>
+	 * 	Default is <jk>false</jk>.
+	 */
+	public static final String SERIALIZER_sortCollections = "Serializer.sortCollections";
+
+	/**
+	 * Boolean.  Sort maps alphabetically before serializing.
+	 * <p>
+	 * 	Note that this introduces a performance penalty.
+	 * <p>
+	 * 	Default is <jk>false</jk>.
+	 */
+	public static final String SERIALIZER_sortMaps = "Serializer.sortMaps";
+
+	/**
+	 * String.  URI base for relative URIs with absolute paths.
+	 * <p>
+	 * 	Prepended to relative absolute-path URIs during serialization.
+	 * 	(i.e. URIs starting with <js>'/'</js>).
+	 * 	(e.g. <js>"/foo/bar"</js>)
+	 * <p>
+	 * 	Default is <js>""</js>.
+	 *
+	 * <dl>
+	 * 	<dt>Examples:</dt>
+	 * 	<dd>
+	 * <table class='styled'>
+	 * 	<tr><th>SERIALIZER_absolutePathUriBase</th><th>URI</th><th>Serialized URI</th></tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>mywebapp</code></td>
+	 * 		<td><code>mywebapp</code></td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>/mywebapp</code></td>
+	 * 		<td><code>http://foo:9080/bar/baz/mywebapp</code></td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td><code>http://foo:9080/bar/baz</code></td>
+	 * 		<td><code>http://mywebapp</code></td>
+	 * 		<td><code>http://mywebapp</code></td>
+	 * 	</tr>
+	 * </table>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String SERIALIZER_absolutePathUriBase = "Serializer.absolutePathUriBase";
+
+	int maxDepth = 100, initialDepth = 0;
+	boolean
+		debug = false,
+		detectRecursions = false,
+		ignoreRecursions = false,
+		useIndentation = false,
+		addClassAttrs = false,
+		trimNulls = true,
+		trimEmptyLists = false,
+		trimEmptyMaps = false,
+		sortCollections = false,
+		sortMaps = false;
+	char quoteChar = '"';
+	String relativeUriBase="", absolutePathUriBase="";
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(SERIALIZER_maxDepth))
+			maxDepth = bc.convertToType(value, Integer.class);
+		else if (property.equals(SERIALIZER_debug))
+			debug = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_detectRecursions))
+			detectRecursions = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_ignoreRecursions))
+			ignoreRecursions = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_useIndentation))
+			useIndentation = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_addClassAttrs))
+			addClassAttrs = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_quoteChar))
+			quoteChar = bc.convertToType(value, Character.class);
+		else if (property.equals(SERIALIZER_trimNullProperties))
+			trimNulls = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_trimEmptyLists))
+			trimEmptyLists = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_trimEmptyMaps))
+			trimEmptyMaps = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_relativeUriBase))
+			relativeUriBase = value == null ? null : value.toString();
+		else if (property.equals(SERIALIZER_absolutePathUriBase))
+			absolutePathUriBase = value == null ? null : value.toString();
+		else if (property.equals(SERIALIZER_sortCollections))
+			sortCollections = bc.convertToType(value, Boolean.class);
+		else if (property.equals(SERIALIZER_sortMaps))
+			sortMaps = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public SerializerProperties clone() {
+		try {
+			return (SerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Won't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.class
new file mode 100755
index 0000000..0bd3142
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.java
new file mode 100755
index 0000000..7a91e6a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerWriter.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import java.io.*;
+import java.net.*;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Simple wrapper around a standard {@link Writer} with additional methods.
+ * <p>
+ * Modeled after the Java ProcessBuilder class so that you can chain commands to reduce
+ * 	the need for string concatenation for performance reasons.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	writer.append(<js>"foo"</js>).nl().i(5).append(<js>"bar"</js>);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SerializerWriter extends Writer {
+
+	/** The underlying writer. */
+	protected final Writer out;
+
+	/** Use-indentation flag. */
+	protected final boolean useIndentation;
+
+	/** Use-whitespace flag. */
+	protected final boolean useWhitespace;
+
+	/** The quote character being used by this writer. */
+	protected final char quoteChar;
+
+	/** The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>). */
+	protected final String relativeUriBase;
+
+	/** The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>). */
+	protected final String absolutePathUriBase;
+
+	/**
+	 * @param out The writer being wrapped.
+	 * @param useIndentation If <jk>true</jk>, calling {@link #cr(int)} will create an indentation.
+	 * @param useWhitespace If <jk>true</jk>, calling {@link #s()} will write a space character.
+	 * @param quoteChar The character to write when {@link #q()} is called.
+	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
+	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
+	 */
+	public SerializerWriter(Writer out, boolean useIndentation, boolean useWhitespace, char quoteChar, String relativeUriBase, String absolutePathUriBase) {
+		this.out = out;
+		this.useIndentation = useIndentation;
+		this.useWhitespace = useWhitespace;
+		this.quoteChar = quoteChar;
+		this.relativeUriBase = relativeUriBase;
+		this.absolutePathUriBase = absolutePathUriBase;
+	}
+
+	/**
+	 * Performs a carriage return.
+	 * <p>
+	 * 	Adds a newline and the specified number of tabs (if the {@code useIndentation} setting is enabled) to the output.
+	 *
+	 * @param depth The indentation.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter cr(int depth) throws IOException {
+		if (useIndentation)
+			return nl().i(depth);
+		return this;
+	}
+
+	/**
+	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text,
+	 * 	followed by a newline (if the {@code useIndentation} setting is enabled).
+	 *
+	 * @param indent The number of tabs to indent.
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object.
+	 */
+	public SerializerWriter appendln(int indent, String text) throws IOException {
+		return append(indent, true, text);
+	}
+
+	/**
+	 * Writes the specified text followed by a newline (if the {@code useIndentation} setting is enabled).
+	 *
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object.
+	 */
+	public SerializerWriter appendln(String text) throws IOException {
+		return append(0, true, text);
+	}
+
+	/**
+	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text.
+	 *
+	 * @param indent The number of tabs to indent.
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object.
+	 */
+	public SerializerWriter append(int indent, String text) throws IOException {
+		return append(indent, false, text);
+	}
+
+	/**
+	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text.
+	 *
+	 * @param indent The number of tabs to indent.
+	 * @param c The character to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object.
+	 */
+	public SerializerWriter append(int indent, char c) throws IOException {
+		return i(indent).append(c);
+	}
+
+	/**
+	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text,
+	 * 	optionally followed by a newline (if the {@code useIndentation} setting is enabled).
+	 *
+	 * @param indent The number of tabs to indent.
+	 * @param newline If <jk>true</jk>, then a newline is written.
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	private SerializerWriter append(int indent, boolean newline, String text) throws IOException {
+		i(indent);
+		out.write(text);
+		if (newline)
+			nl();
+		return this;
+	}
+
+	/**
+	 * Appends the specified object as a URI.
+	 * <p>
+	 * Object is converted to a <code>String</code> using <code>toString()</code>, so this will work on {@link URL} or {@link URI} objects,
+	 * or any other type that returns a URI via it's <code>toString()</code> method.
+	 * <p>
+	 * If the URI is relative (i.e. without a schema and not prepended with <js>'/'</js>) the URI
+	 * will be prepended with {@link #absolutePathUriBase} and {@link #relativeUriBase}.
+	 * <p>
+	 * If the URI is context-absolute (i.e. without a schema, but prepended with <js>'/'</js>)
+	 * the URI will be prepended with {@link #absolutePathUriBase}.
+	 *
+	 * @param uri The URI to serialize.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 */
+	public SerializerWriter appendUri(Object uri) throws IOException {
+		String s = uri.toString();
+		if (s.indexOf("://") == -1) {
+			if (StringUtils.startsWith(s, '/')) {
+				if (absolutePathUriBase != null)
+					append(absolutePathUriBase);
+			} else {
+				if (relativeUriBase != null) {
+					append(relativeUriBase);
+					if (! relativeUriBase.equals("/"))
+						append("/");
+
+				}
+			}
+		}
+		return append(s);
+	}
+
+	/**
+	 * Adds a whitespace character to the output if the {@code useWhitespace} setting is enabled.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 */
+	public SerializerWriter s() throws IOException {
+		if (useWhitespace)
+			out.write(' ');
+		return this;
+	}
+
+	/**
+	 * Adds the quote character specified by the {@code quoteChar} setting to the output.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 */
+	public SerializerWriter q() throws IOException {
+		out.write(quoteChar);
+		return this;
+	}
+
+	/**
+	 * Writes an indent to the writer if the {@code useIndentation} setting is enabled.
+	 *
+	 * @param indent The number of tabs to indent.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter i(int indent) throws IOException {
+		if (useIndentation)
+			for (int i = 0; i < indent; i++)
+				out.write('\t');
+		return this;
+	}
+
+	/**
+	 * Writes a newline to the writer if the {@code useIndentation} setting is enabled.
+	 *
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter nl() throws IOException {
+		if (useIndentation)
+			out.write('\n');
+		return this;
+	}
+
+	/**
+	 * Writes the specified text to the writer.
+	 *
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter append(Object text) throws IOException {
+		out.append(text == null ? null : text.toString());
+		return this;
+	}
+
+	/**
+	 * Writes the specified text to the writer.
+	 *
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter append(String text) throws IOException {
+		if (text != null)
+			out.append(text);
+		return this;
+	}
+
+	/**
+	 * Writes the specified text to the writer if b is true.
+	 *
+	 * @param b Boolean flag.
+	 * @param text The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter appendIf(boolean b, String text) throws IOException {
+		if (b)
+			out.write(text);
+		return this;
+	}
+
+	/**
+	 * Writes the specified text to the writer if b is true.
+	 *
+	 * @param b Boolean flag.
+	 * @param c The text to write.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerWriter appendIf(boolean b, char c) throws IOException {
+		if (b)
+			out.write(c);
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Writer */
+	public SerializerWriter append(char c) throws IOException {
+		out.write(c);
+		return this;
+	}
+
+	@Override /* Writer */
+	public void write(char[] cbuf, int off, int len) throws IOException {
+		out.write(cbuf, off, len);
+	}
+
+	@Override /* Writer */
+	public void flush() throws IOException {
+		out.flush();
+	}
+
+	@Override /* Writer */
+	public void close() throws IOException {
+		out.close();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.class
new file mode 100755
index 0000000..a6fcb1d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.java
new file mode 100755
index 0000000..ae9a506
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/StringObject.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * A serializer/object pair used for delayed object serialization.
+ * <p>
+ * Useful in certain conditions such as logging when you don't want to needlessly serialize objects.
+ * <p>
+ * Instances of this method are created by the {@link WriterSerializer#toStringObject(Object)} method.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	<jc>// The POJO will not be serialized unless DEBUG is enabled.</jc>
+ * 	logger.log(<jsf>DEBUG</jsf>, <js>"Object contents are: {0}"</js>, JsonSerializer.<jsf>DEFAULT</jsf>.toObjectString(myPojo));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class StringObject implements CharSequence, Writable {
+
+	private final WriterSerializer s;
+	private final Object o;
+	private String results;
+
+	/**
+	 * Constructor.
+	 * @param s The serializer to use to serialize the object.
+	 * @param o The object to be serialized.
+	 */
+	public StringObject(WriterSerializer s, Object o) {
+		this.s = s;
+		this.o = o;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		if (results == null)
+			results = s.toString(o);
+		return results;
+	}
+
+	@Override /* CharSequence */
+	public int length() {
+		return toString().length();
+	}
+
+	@Override /* CharSequence */
+	public char charAt(int index) {
+		return toString().charAt(index);
+	}
+
+	@Override /* CharSequence */
+	public CharSequence subSequence(int start, int end) {
+		return toString().subSequence(start, end);
+	}
+
+	@Override /* Writable */
+	public void writeTo(Writer w) throws IOException {
+		try {
+			s.serialize(o, w);
+		} catch (SerializeException e) {
+			throw new IOException(e);
+		}
+	}
+
+	@Override /* Writable */
+	public String getMediaType() {
+		return s.getMediaTypes()[0];
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.class
new file mode 100755
index 0000000..a1b81b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.java
new file mode 100755
index 0000000..6309176
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/WriterSerializer.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Subclass of {@link Serializer} for character-based serializers.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This class is typically the parent class of all character-based serializers.
+ * 	It has 2 abstract methods to implement...
+ * <ul>
+ * 	<li>{@link #createContext(ObjectMap, Method)}
+ * 	<li>{@link #doSerialize(Object, Writer, SerializerContext)}
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>@Produces annotation</h6>
+ * <p>
+ * 	The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()}
+ * 		and {@link #getResponseContentType()} methods.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class WriterSerializer extends Serializer<Writer> {
+
+	@Override /* Serializer */
+	public boolean isWriterSerializer() {
+		return true;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected abstract void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException;
+
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Internal test method.
+	 *
+	 * @param o The object to serialize.
+	 * @param ctx The serialize context.
+	 * 	This object is automatically closed after serialization.
+	 * @return The output serialized to a string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final String serialize(Object o, SerializerContext ctx) throws SerializeException {
+		try {
+			StringWriter w = new StringWriter();
+			serialize(o, w, ctx);
+			return w.toString();
+		} catch (IOException e) { // Shouldn't happen.
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Convenience method for serializing an object to a String.
+	 *
+	 * @param o The object to serialize.
+	 * @return The output serialized to a string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final String serialize(Object o) throws SerializeException {
+		try {
+			StringWriter w = new StringWriter();
+			serialize(o, w, createContext());
+			return w.toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+
+	/**
+	 * Identical to {@link #serialize(Object)} except throws a {@link RuntimeException}
+	 * instead of a {@link SerializeException}.
+	 * This is typically good enough for debugging purposes.
+	 *
+	 * @param o The object to serialize.
+	 * @return The serialized object.
+	 */
+	public final String toString(Object o) {
+		try {
+			StringWriter w = new StringWriter();
+			serialize(o, w, createContext());
+			return w.toString();
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Wraps the specified object inside a {@link StringObject}.
+	 *
+	 * @param o The object to wrap.
+	 * @return The wrapped object.
+	 */
+	public final StringObject toStringObject(Object o) {
+		return new StringObject(this, o);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* CoreApi */
+	public WriterSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public WriterSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> WriterSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public WriterSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public WriterSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public WriterSerializer clone() throws CloneNotSupportedException {
+		WriterSerializer c = (WriterSerializer)super.clone();
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/package.html
new file mode 100755
index 0000000..4fe443f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/package.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Serializer API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Serializer'>Serializer API</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#SerializerGroup'>The SerializerGroup class</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#DefiningSerializer'>Defining a new Serializer</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Serializer"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Serializer API</h2>
+<div class='topic'>
+	<p>
+		The serialization API is designed to be easily extensible by developers.<br>
+		If you are writing your own serializer, you will typically subclass directly from either {@link com.ibm.juno.core.serializer.WriterSerializer}
+			or {@link com.ibm.juno.core.serializer.OutputStreamSerializer}.<br>
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerGroup"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - The SerializerGroup class</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.serializer.SerializerGroup} class represents a group of serializers registered with the media types they handle.
+		</p>
+		
+		<h6 class='topic'>Features</h6>		
+		<p>
+			The <code>SerializerGroup</code> class provides the following features:
+		<ul>
+			<li>Finds serializers based on HTTP <code>Accept</code> header values.
+			<li>Sets common properties on all serializers in a single method call.
+		 	<li>Locks all serializers in a single method call.
+			<li>Clones existing groups and all serializers within the group in a single method call.
+		</ul>
+		
+		<p>
+			Refer to {@link com.ibm.juno.core.serializer.SerializerGroup} for additional information.
+		</p>
+	</div> 
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="DefiningSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - Defining a new Serializer</h2>
+<div class='topic'>
+	<p>
+		Defining a new serializer is quite simple if you subclass directly from {@link com.ibm.juno.core.serializer.WriterSerializer} 
+			or {@link com.ibm.juno.core.serializer.OutputStreamSerializer}.<br>
+		In each case, you simply need to implement a single
+			method and specify a {@link com.ibm.juno.core.annotation.Produces} annotation.
+	</p>
+	<p>
+		The following example shows a simple serializer that converts images to output streams using standard JRE classes.
+	</p>
+	<p class='bcode'>
+	<ja>@Produces</ja>({<js>"image/png"</js>,<js>"image/jpeg"</js>})
+	<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
+		<ja>@Override</ja>
+		<jk>public void</jk> serialize(Object o, OutputStream out, SerializerContext ctx) <jk>throws</jk> IOException, SerializeException {
+			RenderedImage image = (RenderedImage)o;
+			String mediaType = ctx.getMediaType();
+			ImageIO.<jsm>write</jsm>(image, mediaType.substring(mediaType.indexOf(<js>'/'</js>)+1), out);
+		}	
+	}
+	</p>
+	<p>
+		Serializer that take advantage of the entire {@link com.ibm.juno.core.CoreApi} interface to be able to serialize arbitrary beans and POJOs is
+			considerably more complex and outside the scope of this document.<br>  
+		If developing such a serializer, the best course of action would be to replicate what occurs in the {@link com.ibm.juno.core.json.JsonSerializer} class.
+	</p>
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.class
new file mode 100755
index 0000000..1d9487b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.java
new file mode 100755
index 0000000..df249f2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializer.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.soap;
+
+import static com.ibm.juno.core.soap.SoapXmlSerializerProperties.*;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Serializes POJOs to HTTP responses as XML+SOAP.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/xml+soap</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/xml+soap</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Essentially the same output as {@link XmlDocSerializer}, except wrapped in a standard SOAP envelope.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link SoapXmlSerializerProperties}
+ * 	<li>{@link XmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces(value="text/xml+soap",contentType="text/xml")
+public final class SoapXmlSerializer extends XmlSerializer {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		XmlSerializerContext xctx = (XmlSerializerContext)ctx;
+		XmlSerializerWriter w = xctx.getWriter(out);
+		w.append("<?xml")
+			.attr("version", "1.0")
+			.attr("encoding", "UTF-8")
+			.appendln("?>");
+		w.oTag("soap", "Envelope")
+			.attr("xmlns", "soap", xctx.getProperties().getString(SOAPXML_SOAPAction, "http://www.w3.org/2003/05/soap-envelope"))
+			.appendln(">");
+		w.sTag(1, "soap", "Body").nl();
+		super.serialize(o, w, ctx);
+		w.eTag(1, "soap", "Body").nl();
+		w.eTag("soap", "Envelope").nl();
+	}
+
+	@Override /* Serializer */
+	public ObjectMap getResponseHeaders(ObjectMap properties) {
+		return super.getResponseHeaders(properties)
+			.append("SOAPAction", properties.getString(SOAPXML_SOAPAction, "http://www.w3.org/2003/05/soap-envelope"));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.class
new file mode 100755
index 0000000..9aac21c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.java
new file mode 100755
index 0000000..f66a7f2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/SoapXmlSerializerProperties.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.soap;
+
+/**
+ * Properties associated with the {@link SoapXmlSerializer} class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SoapXmlSerializerProperties {
+
+	/**
+	 * The <code>SOAPAction</code> HTTP header value to set on responses.
+	 * <p>
+	 * Default is <js>"http://www.w3.org/2003/05/soap-envelope"</js>.
+	 */
+	public static final String SOAPXML_SOAPAction = "SoapXmlSerializer.SOAPAction";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/package.html
new file mode 100755
index 0000000..3b4f818
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/soap/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>SOAP/XML serialization and parsing support</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser$Decoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser$Decoding.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser$Decoding.class
new file mode 100755
index 0000000..c4824b2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser$Decoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.class
new file mode 100755
index 0000000..1a58860
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.java
new file mode 100755
index 0000000..6638562
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParser.java
@@ -0,0 +1,861 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2013, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.urlencoding.UonParserProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parses UON (a notation for URL-encoded query parameter values) text into POJO models.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Content-Type</code> types: <code>text/uon</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This parser uses a state machine, which makes it very fast and efficient.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link UonParserProperties}
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Consumes("text/uon")
+public class UonParser extends ReaderParser {
+
+	/** Reusable instance of {@link UonParser}, all default settings. */
+	public static final UonParser DEFAULT = new UonParser().lock();
+
+	/** Reusable instance of {@link UonParser.Decoding}. */
+	public static final UonParser DEFAULT_DECODING = new Decoding().lock();
+
+	/** Reusable instance of {@link UonParser}, all default settings, whitespace-aware. */
+	public static final UonParser DEFAULT_WS_AWARE = new UonParser().setProperty(UON_whitespaceAware, true).lock();
+
+	// Characters that need to be preceeded with an escape character.
+	private static final AsciiSet escapedChars = new AsciiSet(",()~=$\u0001\u0002");
+
+	private static final char NUL='\u0000', AMP='\u0001', EQ='\u0002';  // Flags set in reader to denote & and = characters.
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UrlEncodingParser().setProperty(UonParserProperties.<jsf>UON_decodeChars</jsf>,<jk>true</jk>);</code>.
+	 */
+	public static class Decoding extends UonParser {
+		/** Constructor */
+		public Decoding() {
+			setProperty(UON_decodeChars, true);
+		}
+	}
+
+	/** UON parser properties currently set on this serializer. */
+	protected transient UonParserProperties upp = new UonParserProperties();
+
+	/** URL-Encoding properties currently set on this serializer. */
+	protected transient UrlEncodingProperties uep = new UrlEncodingProperties();
+
+	/**
+	 * Workhorse method.
+	 *
+	 * @param nt The class type being parsed, or <jk>null</jk> if unknown.
+	 * @param ctx The parser context for this parse.
+	 * @param r The reader being parsed.
+	 * @param p If this is a bean property value, the bean property meta, or null if this is not a bean property value being parsed.
+	 * @param outer The outer object (for constructing nested inner classes).
+	 * @param isUrlParamValue If <jk>true</jk>, then we're parsing a top-level URL-encoded value which is treated a bit different than the default case.
+	 * @param name The parent field or map key name.
+	 * @return The parsed object.
+	 * @throws ParseException
+	 */
+	protected <T> T parseAnything(ClassMeta<T> nt, UonParserContext ctx, ParserReader r, BeanPropertyMeta p, Object outer, boolean isUrlParamValue, Object name) throws ParseException {
+
+		BeanContext bc = ctx.getBeanContext();
+		if (nt == null)
+			nt = (ClassMeta<T>)object();
+		PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+		ClassMeta<?> ft = nt.getFilteredClassMeta();
+
+		int line = r.getLine();
+		int column = r.getColumn();
+		Object o = null;
+		try {
+			// Parse type flag '$x'
+			char flag = readFlag(r, (char)0);
+
+			int c = r.peek();
+
+			if (c == -1 || c == AMP) {
+				// If parameter is blank and it's an array or collection, return an empty list.
+				if (ft.isArray() || ft.isCollection())
+					o = ft.newInstance();
+				else if (ft.isString() || ft.isObject())
+					o = "";
+				else if (ft.isPrimitive())
+					o = ft.getPrimitiveDefault();
+				// Otherwise, leave null.
+			} else if (ft.isObject()) {
+				if (flag == 0 || flag == 's') {
+					o = parseString(r, isUrlParamValue, ctx);
+				} else if (flag == 'b') {
+					o = parseBoolean(r, ctx);
+				} else if (flag == 'n') {
+					o = parseNumber(r, null, ctx);
+				} else if (flag == 'o') {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap(ctx, r, m, string(), object());
+					o = m.cast();
+				} else if (flag == 'a') {
+					Collection l = new ObjectList(bc);
+					o = parseIntoCollection(ctx, r, l, ft.getElementType(), isUrlParamValue);
+				} else {
+					throw new ParseException(line, column, "Unexpected flag character ''{0}''.", flag);
+				}
+			} else if (ft.isBoolean()) {
+				o = parseBoolean(r, ctx);
+			} else if (ft.isCharSequence()) {
+				o = parseString(r, isUrlParamValue, ctx);
+			} else if (ft.isChar()) {
+				String s = parseString(r, isUrlParamValue, ctx);
+				o = s == null ? null : s.charAt(0);
+			} else if (ft.isNumber()) {
+				o = parseNumber(r, (Class<? extends Number>)ft.getInnerClass(), ctx);
+			} else if (ft.isMap()) {
+				Map m = (ft.canCreateNewInstance(outer) ? (Map)ft.newInstance(outer) : new ObjectMap(bc));
+				o = parseIntoMap(ctx, r, m, ft.getKeyType(), ft.getValueType());
+			} else if (ft.isCollection()) {
+				if (flag == 'o') {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap(ctx, r, m, string(), object());
+					// Handle case where it's a collection, but serialized as a map with a _class or _value key.
+					if (m.containsKey("_class") || m.containsKey("_value"))
+						o = m.cast();
+					// Handle case where it's a collection, but only a single value was specified.
+					else {
+						Collection l = (ft.canCreateNewInstance(outer) ? (Collection)ft.newInstance(outer) : new ObjectList(bc));
+						l.add(m.cast(ft.getElementType()));
+						o = l;
+					}
+				} else {
+					Collection l = (ft.canCreateNewInstance(outer) ? (Collection)ft.newInstance(outer) : new ObjectList(bc));
+					o = parseIntoCollection(ctx, r, l, ft.getElementType(), isUrlParamValue);
+				}
+			} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap(ctx, r, m, string(), object());
+				o = ft.newInstanceFromObjectMap(outer, m);
+			} else if (ft.canCreateNewBean(outer)) {
+				BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+				m = parseIntoBeanMap(ctx, r, m);
+				o = m == null ? null : m.getBean();
+			} else if (ft.canCreateNewInstanceFromString(outer)) {
+				String s = parseString(r, isUrlParamValue, ctx);
+				if (s != null)
+					o = ft.newInstanceFromString(outer, s);
+			} else if (ft.isArray()) {
+				if (flag == 'o') {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap(ctx, r, m, string(), object());
+					// Handle case where it's an array, but serialized as a map with a _class or _value key.
+					if (m.containsKey("_class") || m.containsKey("_value"))
+						o = m.cast();
+					// Handle case where it's an array, but only a single value was specified.
+					else {
+						ArrayList l = new ArrayList(1);
+						l.add(m.cast(ft.getElementType()));
+						o = bc.toArray(ft, l);
+					}
+				} else {
+					ArrayList l = (ArrayList)parseIntoCollection(ctx, r, new ArrayList(), ft.getElementType(), isUrlParamValue);
+					o = bc.toArray(ft, l);
+				}
+			} else if (flag == 'o') {
+				// It could be a non-bean with _class attribute.
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap(ctx, r, m, string(), object());
+				if (m.containsKey("_class"))
+					o = m.cast();
+				else
+					throw new ParseException(line, column, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", ft.getInnerClass().getName(), ft.getNotABeanReason());
+			} else {
+				throw new ParseException(line, column, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", ft.getInnerClass().getName(), ft.getNotABeanReason());
+			}
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (name != null)
+				setName(nt, o, name);
+
+			return (T)o;
+
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			if (p == null)
+				throw new ParseException("Error occurred trying to parse into class ''{0}''", ft).initCause(e);
+			throw new ParseException("Error occurred trying to parse value for bean property ''{0}'' on class ''{1}''",
+				p.getName(), p.getBeanMeta().getClassMeta()
+			).initCause(e);
+		}
+	}
+
+	private <K,V> Map<K,V> parseIntoMap(UonParserContext ctx, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		if (keyType == null)
+			keyType = (ClassMeta<K>)string();
+
+		int c = r.read();
+		if (c == -1 || c == NUL || c == AMP)
+			return null;
+		if (c != '(')
+			throw new ParseException(line, column, "Expected '(' at beginning of object.");
+
+		final int S1=1; // Looking for attrName start.
+		final int S2=2; // Found attrName end, looking for =.
+		final int S3=3; // Found =, looking for valStart.
+		final int S4=4; // Looking for , or )
+		boolean isInEscape = false;
+
+		int state = S1;
+		K currAttr = null;
+		while (c != -1 && c != AMP) {
+			c = r.read();
+			if (! isInEscape) {
+				if (state == S1) {
+					if (c == ')')
+						return m;
+					if ((c == '\n' || c == '\r') && ctx.whitespaceAware)
+						skipSpace(r);
+					else {
+						r.unread();
+						Object attr = parseAttr(r, ctx.decodeChars, ctx);
+						currAttr = (attr == null ? null : ctx.getBeanContext().convertToType(attr, keyType));
+						state = S2;
+						c = 0; // Avoid isInEscape if c was '\'
+					}
+				} else if (state == S2) {
+					if (c == EQ || c == '=')
+						state = S3;
+					else if (c == -1 || c == ',' || c == ')' || c == AMP) {
+						if (currAttr == null) {
+							// Value was '%00'
+							r.unread();
+							return null;
+						}
+						m.put(currAttr, null);
+						if (c == ')' || c == -1 || c == AMP)
+							return m;
+						state = S1;
+					}
+				} else if (state == S3) {
+					if (c == -1 || c == ',' || c == ')' || c == AMP) {
+						V value = convertAttrToType(m, "", valueType);
+						m.put(currAttr, value);
+						if (c == -1 || c == ')' || c == AMP)
+							return m;
+						state = S1;
+					} else  {
+						V value = parseAnything(valueType, ctx, r.unread(), null, m, false, currAttr);
+						m.put(currAttr, value);
+						state = S4;
+						c = 0; // Avoid isInEscape if c was '\'
+					}
+				} else if (state == S4) {
+					if (c == ',')
+						state = S1;
+					else if (c == ')' || c == -1 || c == AMP) {
+						return m;
+					}
+				}
+			}
+			isInEscape = isInEscape(c, r, isInEscape);
+		}
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on object.");
+		if (state == S2)
+			throw new ParseException(line, column, "Could not find '=' following attribute name on object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Dangling '=' found in object entry");
+		if (state == S4)
+			throw new ParseException(line, column, "Could not find ')' marking end of object.");
+
+		return null; // Unreachable.
+	}
+
+	private <E> Collection<E> parseIntoCollection(UonParserContext ctx, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int c = r.read();
+		if (c == -1 || c == NUL || c == AMP)
+			return null;
+
+		// If we're parsing a top-level parameter, we're allowed to have comma-delimited lists outside parenthesis (e.g. "&foo=1,2,3&bar=a,b,c")
+		// This is not allowed at lower levels since we use comma's as end delimiters.
+		boolean isInParens = (c == '(');
+		if (! isInParens)
+			if (isUrlParamValue)
+				r.unread();
+			else
+				throw new ParseException(line, column, "Could not find '(' marking beginning of collection.");
+
+		if (isInParens) {
+			final int S1=1; // Looking for starting of first entry.
+			final int S2=2; // Looking for starting of subsequent entries.
+			final int S3=3; // Looking for , or ) after first entry.
+
+			int state = S1;
+			while (c != -1 && c != AMP) {
+				c = r.read();
+				if (state == S1 || state == S2) {
+					if (c == ')') {
+						if (state == S2) {
+							l.add(parseAnything(elementType, ctx, r.unread(), null, l, false, null));
+							r.read();
+						}
+						return l;
+					} else if ((c == '\n' || c == '\r') && ctx.whitespaceAware) {
+						skipSpace(r);
+					} else {
+						l.add(parseAnything(elementType, ctx, r.unread(), null, l, false, null));
+						state = S3;
+					}
+				} else if (state == S3) {
+					if (c == ',') {
+						state = S2;
+					} else if (c == ')') {
+						return l;
+					}
+				}
+			}
+			if (state == S1 || state == S2)
+				throw new ParseException(line, column, "Could not find start of entry in array.");
+			if (state == S3)
+				throw new ParseException(line, column, "Could not find end of entry in array.");
+
+		} else {
+			final int S1=1; // Looking for starting of entry.
+			final int S2=2; // Looking for , or & or END after first entry.
+
+			int state = S1;
+			while (c != -1 && c != AMP) {
+				c = r.read();
+				if (state == S1) {
+					if ((c == '\n' || c == '\r') && ctx.whitespaceAware) {
+						skipSpace(r);
+					} else {
+						l.add(parseAnything(elementType, ctx, r.unread(), null, l, false, null));
+						state = S2;
+					}
+				} else if (state == S2) {
+					if (c == ',') {
+						state = S1;
+					} else if ((c == '\n' || c == '\r') && ctx.whitespaceAware) {
+						skipSpace(r);
+					} else if (c == AMP || c == -1) {
+						r.unread();
+						return l;
+					}
+				}
+			}
+		}
+
+		return null;  // Unreachable.
+	}
+
+	private <T> BeanMap<T> parseIntoBeanMap(UonParserContext ctx, ParserReader r, BeanMap<T> m) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int c = r.read();
+		if (c == -1 || c == NUL || c == AMP)
+			return null;
+		if (c != '(')
+			throw new ParseException(line, column, "Expected '(' at beginning of object.");
+
+		final int S1=1; // Looking for attrName start.
+		final int S2=2; // Found attrName end, looking for =.
+		final int S3=3; // Found =, looking for valStart.
+		final int S4=4; // Looking for , or }
+		boolean isInEscape = false;
+
+		int state = S1;
+		String currAttr = "";
+		int currAttrLine = -1, currAttrCol = -1;
+		while (c != -1 && c != AMP) {
+			c = r.read();
+			if (! isInEscape) {
+				if (state == S1) {
+					if (c == ')' || c == -1 || c == AMP) {
+						return m;
+					}
+					if ((c == '\n' || c == '\r') && ctx.whitespaceAware)
+						skipSpace(r);
+					else {
+						r.unread();
+						currAttrLine= r.getLine();
+						currAttrCol = r.getColumn();
+						currAttr = parseAttrName(r, ctx.decodeChars);
+						if (currAttr == null)  // Value was '%00'
+							return null;
+						state = S2;
+					}
+				} else if (state == S2) {
+					if (c == EQ || c == '=')
+						state = S3;
+					else if (c == -1 || c == ',' || c == ')' || c == AMP) {
+						m.put(currAttr, null);
+						if (c == ')' || c == -1 || c == AMP)
+							return m;
+						state = S1;
+					}
+				} else if (state == S3) {
+					if (c == -1 || c == ',' || c == ')' || c == AMP) {
+						if (! currAttr.equals("_class")) {
+							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
+							if (pMeta == null) {
+								if (m.getMeta().isSubTyped()) {
+									m.put(currAttr, "");
+								} else {
+									onUnknownProperty(ctx, currAttr, m, currAttrLine, currAttrCol);
+								}
+							} else {
+								Object value = ctx.getBeanContext().convertToType("", pMeta.getClassMeta());
+								pMeta.set(m, value);
+							}
+						}
+						if (c == -1 || c == ')' || c == AMP)
+							return m;
+						state = S1;
+					} else {
+						if (! currAttr.equals("_class")) {
+							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
+							if (pMeta == null) {
+								if (m.getMeta().isSubTyped()) {
+									m.put(currAttr, parseAnything(object(), ctx, r.unread(), null, m.getBean(false), false, currAttr));
+								} else {
+									onUnknownProperty(ctx, currAttr, m, currAttrLine, currAttrCol);
+									parseAnything(object(), ctx, r.unread(), null, m.getBean(false), false, null); // Read content anyway to ignore it
+								}
+							} else {
+								Object value = parseAnything(pMeta.getClassMeta(), ctx, r.unread(), pMeta, m.getBean(false), false, currAttr);
+								pMeta.set(m, value);
+							}
+						}
+						state = S4;
+					}
+				} else if (state == S4) {
+					if (c == ',')
+						state = S1;
+					else if (c == ')' || c == -1 || c == AMP) {
+						return m;
+					}
+				}
+			}
+			isInEscape = isInEscape(c, r, isInEscape);
+		}
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on object.");
+		if (state == S2)
+			throw new ParseException(line, column, "Could not find '=' following attribute name on object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Could not find value following '=' on object.");
+		if (state == S4)
+			throw new ParseException(line, column, "Could not find ')' marking end of object.");
+
+		return null; // Unreachable.
+	}
+
+	Object parseAttr(ParserReader r, boolean encoded, UonParserContext ctx) throws IOException, ParseException {
+		Object attr;
+		int c = r.peek();
+		if (c == '$') {
+			char f = readFlag(r, (char)0);
+			if (f == 'b')
+				attr = parseBoolean(r, ctx);
+			else if (f == 'n')
+				attr = parseNumber(r, null, ctx);
+			else
+				attr = parseAttrName(r, encoded);
+		} else {
+			attr = parseAttrName(r, encoded);
+		}
+		return attr;
+	}
+
+	String parseAttrName(ParserReader r, boolean encoded) throws IOException, ParseException {
+
+		// If string is of form '(xxx)', we're looking for ')' at the end.
+		// Otherwise, we're looking for '&' or '=' or -1 denoting the end of this string.
+
+		int line = r.getLine();
+		int column = r.getColumn();
+		int c = r.peek();
+		if (c == '$')
+			readFlag(r, 's');
+		if (c == '(')
+			return parsePString(r);
+
+		r.mark();
+		boolean isInEscape = false;
+		if (encoded) {
+			while (c != -1) {
+				c = r.read();
+				if (! isInEscape) {
+					if (c == AMP || c == EQ || c == -1) {
+						if (c != -1)
+							r.unread();
+						String s = r.getMarked();
+						return (s.equals("\u0000") ? null : s);
+					}
+				}
+				else if (c == AMP)
+					r.replace('&');
+				else if (c == EQ)
+					r.replace('=');
+				isInEscape = isInEscape(c, r, isInEscape);
+			}
+		} else {
+			while (c != -1) {
+				c = r.read();
+				if (! isInEscape) {
+					if (c == '=' || c == -1) {
+						if (c != -1)
+							r.unread();
+						String s = r.getMarked();
+						return (s.equals("\u0000") ? null : s);
+					}
+				}
+				isInEscape = isInEscape(c, r, isInEscape);
+			}
+		}
+
+		// We should never get here.
+		throw new ParseException(line, column, "Unexpected condition.");
+	}
+
+
+	/**
+	 * Returns true if the next character in the stream is preceeded by an escape '~' character.
+	 * @param c The current character.
+	 * @param r The reader.
+	 * @param prevIsInEscape What the flag was last time.
+	 */
+	private static final boolean isInEscape(int c, ParserReader r, boolean prevIsInEscape) throws IOException {
+		if (c == '~' && ! prevIsInEscape) {
+			c = r.peek();
+			if (escapedChars.contains(c)) {
+				r.delete();
+				return true;
+			}
+		}
+		return false;
+	}
+
+	String parseString(ParserReader r, boolean isUrlParamValue, UonParserContext ctx) throws IOException, ParseException {
+
+		// If string is of form '(xxx)', we're looking for ')' at the end.
+		// Otherwise, we're looking for ',' or ')' or -1 denoting the end of this string.
+
+		int c = r.peek();
+		if (c == '(')
+			return parsePString(r);
+
+		r.mark();
+		boolean isInEscape = false;
+		String s = null;
+		AsciiSet endChars = (isUrlParamValue ? endCharsParam : endCharsNormal);
+		while (c != -1) {
+			c = r.read();
+			if (! isInEscape) {
+				// If this is a URL parameter value, we're looking for:  &
+				// If not, we're looking for:  &,)
+				if (endChars.contains(c)) {
+					r.unread();
+					c = -1;
+				}
+			}
+			if (c == -1)
+				s = r.getMarked();
+			else if (c == EQ)
+				r.replace('=');
+			else if ((c == '\n' || c == '\r') && ctx.whitespaceAware) {
+				s = r.getMarked(0, -1);
+				skipSpace(r);
+				c = -1;
+			}
+			isInEscape = isInEscape(c, r, isInEscape);
+		}
+
+		return (s == null || s.equals("\u0000") ? null : s);
+	}
+
+	private static final AsciiSet endCharsParam = new AsciiSet(""+AMP), endCharsNormal = new AsciiSet(",)"+AMP);
+
+
+	/**
+	 * Parses a string of the form "(foo)"
+	 * All whitespace within parenthesis are preserved.
+	 */
+	static String parsePString(ParserReader r) throws IOException, ParseException {
+
+		int line = r.getLine();
+		int column = r.getColumn();
+		r.read(); // Skip first parenthesis.
+		r.mark();
+		int c = 0;
+
+		boolean isInEscape = false;
+		while (c != -1) {
+			c = r.read();
+			if (! isInEscape) {
+				if (c == ')')
+					return r.getMarked(0, -1);
+			}
+			if (c == EQ)
+				r.replace('=');
+			isInEscape = isInEscape(c, r, isInEscape);
+		}
+		throw new ParseException(line, column, "Unmatched parenthesis");
+	}
+
+	private Boolean parseBoolean(ParserReader r, UonParserContext ctx) throws IOException, ParseException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		readFlag(r, 'b');
+		String s = parseString(r, false, ctx);
+		if (s == null)
+			return null;
+		if (s.equals("true"))
+			return true;
+		if (s.equals("false"))
+			return false;
+		throw new ParseException(line, column, "Unrecognized syntax for boolean.  ''{0}''.", s);
+	}
+
+	private Number parseNumber(ParserReader r, Class<? extends Number> c, UonParserContext ctx) throws IOException, ParseException {
+		readFlag(r, 'n');
+		String s = parseString(r, false, ctx);
+		if (s == null)
+			return null;
+		return StringUtils.parseNumber(s, c);
+	}
+
+	/*
+	 * Call this method after you've finished a parsing a string to make sure that if there's any
+	 * remainder in the input, that it consists only of whitespace and comments.
+	 */
+	private void validateEnd(ParserReader r) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		int c = r.read();
+		if (c != -1)
+			throw new ParseException(line, column, "Remainder after parse: ''{0}''.", (char)c);
+	}
+
+	/**
+	 * Reads flag character from "$x(" construct if flag is present.
+	 * Returns 0 if no flag is present.
+	 */
+	static char readFlag(ParserReader r, char expected) throws IOException, ParseException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		char c = (char)r.peek();
+		if (c == '$') {
+			r.read();
+			char f = (char)r.read();
+			if (expected != 0 && f != expected)
+				throw new ParseException(line, column, "Unexpected flag character: ''{0}''.  Expected ''{1}''.", f, expected);
+			c = (char)r.peek();
+			// Type flag must be followed by '('
+			if (c != '(')
+				throw new ParseException(line, column, "Unexpected character following flag: ''{0}''.", c);
+			return f;
+		}
+		return 0;
+	}
+
+	private Object[] parseArgs(UonParserContext ctx, ParserReader r, ClassMeta<?>[] argTypes) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		final int S1=1; // Looking for start of entry
+		final int S2=2; // Looking for , or )
+
+		Object[] o = new Object[argTypes.length];
+		int i = 0;
+
+		int c = r.read();
+		if (c == -1 || c == AMP)
+			return null;
+		if (c != '(')
+			throw new ParseException("Expected '(' at beginning of args array.");
+
+		int state = S1;
+		while (c != -1 && c != AMP) {
+			c = r.read();
+			if (state == S1) {
+				if (c == ')')
+					return o;
+				o[i] = parseAnything(argTypes[i], ctx, r.unread(), null, ctx.getOuter(), false, null);
+				i++;
+				state = S2;
+			} else if (state == S2) {
+				if (c == ',') {
+					state = S1;
+				} else if (c == ')') {
+					return o;
+				}
+			}
+		}
+
+		throw new ParseException(line, column, "Did not find ')' at the end of args array.");
+	}
+
+	private static void skipSpace(ParserReader r) throws IOException {
+		int c = 0;
+		while ((c = r.read()) != -1) {
+			if (c > ' ' || c <= 2) {
+				r.unread();
+				return;
+			}
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public UonParserContext createContext(ObjectMap properties, Method javaMethod, Object outer) {
+		return new UonParserContext(getBeanContext(), pp, upp, uep, properties, javaMethod, outer);
+	}
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		T o = parseAnything(type, uctx, r, null, ctx.getOuter(), true, null);
+		validateEnd(r);
+		return o;
+	}
+
+	@Override /* ReaderParser */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		readFlag(r, 'o');
+		m = parseIntoMap(uctx, r, m, ctx.getBeanContext().getClassMeta(keyType), ctx.getBeanContext().getClassMeta(valueType));
+		validateEnd(r);
+		return m;
+	}
+
+	@Override /* ReaderParser */
+	protected <E> Collection<E> doParseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		readFlag(r, 'a');
+		c = parseIntoCollection(uctx, r, c, ctx.getBeanContext().getClassMeta(elementType), false);
+		validateEnd(r);
+		return c;
+	}
+
+	@Override /* ReaderParser */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		readFlag(r, 'a');
+		Object[] a = parseArgs(uctx, r, argTypes);
+		return a;
+	}
+
+	@Override /* Parser */
+	public UonParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! upp.setProperty(property, value))
+			if (! uep.setProperty(property, value))
+				super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> UonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UonParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UonParser clone() {
+		try {
+			UonParser c = (UonParser)super.clone();
+			c.upp = upp.clone();
+			c.uep = uep.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.class
new file mode 100755
index 0000000..87fa9f6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.java
new file mode 100755
index 0000000..631bdcd
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserContext.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.urlencoding.UonParserProperties.*;
+import static com.ibm.juno.core.urlencoding.UrlEncodingProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Context object that lives for the duration of a single parsing in {@link UonParser} and {@link UrlEncodingParser}.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class UonParserContext extends ParserContext {
+
+	boolean decodeChars, whitespaceAware, expandedParams;
+
+	/**
+	 * Create a new parser context with the specified options.
+	 *
+	 * @param beanContext The bean context being used.
+	 * @param pp The default parser properties.
+	 * @param upp The default UON-Encoding properties.
+	 * @param uep The default URL-Encoding properties.
+	 * @param op The override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	public UonParserContext(BeanContext beanContext, ParserProperties pp, UonParserProperties upp, UrlEncodingProperties uep, ObjectMap op, Method javaMethod, Object outer) {
+		super(beanContext, pp, op, javaMethod, outer);
+		if (op == null || op.isEmpty()) {
+			decodeChars = upp.decodeChars;
+			whitespaceAware = upp.whitespaceAware;
+			expandedParams = uep.expandedParams;
+		} else {
+			decodeChars = op.getBoolean(UON_decodeChars, upp.decodeChars);
+			whitespaceAware = op.getBoolean(UON_whitespaceAware, upp.whitespaceAware);
+			expandedParams = op.getBoolean(URLENC_expandedParams, uep.expandedParams);
+		}
+	}
+
+	/**
+	 * Returns the {@link UrlEncodingProperties#URLENC_expandedParams} setting value in this context.
+	 *
+	 * @return The {@link UrlEncodingProperties#URLENC_expandedParams} setting value in this context.
+	 */
+	public final boolean isExpandedParams() {
+		return expandedParams;
+	}
+
+	/**
+	 * Wraps the specified reader in a {@link UonParserReader}.
+	 *
+	 * @param r The reader to wrap.
+	 * @param estimatedSize The estimated size of the input.
+	 * @return The wrapped reader.
+	 */
+	public final UonParserReader getUrlEncodingParserReader(Reader r, int estimatedSize) {
+		if (r instanceof UonParserReader)
+			return (UonParserReader)r;
+		return new UonParserReader(r, Math.min(8096, estimatedSize), decodeChars);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.class
new file mode 100755
index 0000000..cffaddd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.java
new file mode 100755
index 0000000..f7b16ef
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserProperties.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Configurable properties on the {@link UonParser} and {@link UrlEncodingParser} classes.
+ * <p>
+ * 	Use the {@link UonParser#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link UonParser}.
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class UonParserProperties implements Cloneable {
+
+	/**
+	 * Decode <js>"%xx"</js> sequences. ({@link Boolean}, default=<jk>false</jk> for {@link UonParser}, <jk>true</jk> for {@link UrlEncodingParser}).
+	 * <p>
+	 * Specify <jk>true</jk> if URI encoded characters should be decoded, <jk>false</jk>
+	 * 	if they've already been decoded before being passed to this parser.
+	 */
+	public static final String UON_decodeChars = "UonParser.decodeChars";
+
+	/**
+	 * Expect input to contain readable whitespace characters from using the {@link UonSerializerProperties#UON_useWhitespace} setting ({@link Boolean}, default=<jk>false</jk>).
+	 */
+	public static final String UON_whitespaceAware = "UonParser.whitespaceAware";
+
+	boolean
+		decodeChars = false,
+		whitespaceAware = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(UON_decodeChars))
+			decodeChars = bc.convertToType(value, Boolean.class);
+		else if (property.equals(UON_whitespaceAware))
+			whitespaceAware = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public UonParserProperties clone() {
+		try {
+			return (UonParserProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.class
new file mode 100755
index 0000000..f8585fb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.class differ


[16/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/package.html
new file mode 100755
index 0000000..0e707c9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/package.html
@@ -0,0 +1,1687 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Jena-based RDF serialization and parsing support</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RdfOverview'>RDF support overview</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#RdfOverviewExample'>Example</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#RdfSerializer'>RdfSerializer class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#Namespaces'>Namespaces</a></p>
+		<li><p><a class='doclink' href='#UriProperties'>URI properties</a></p>
+		<li><p><a class='doclink' href='#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
+		<li><p><a class='doclink' href='#Collections'>Collections</a></p>
+		<li><p><a class='doclink' href='#RootProperty'>Root property</a></p>
+		<li><p><a class='doclink' href='#TypedLiterals'>Typed literals</a></p>
+		<li><p><a class='doclink' href='#Recursion'>Non-tree models and recursion detection</a></p>
+		<li><p><a class='doclink' href='#SerializerConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#SerializerOtherNotes'>Other notes</a></p>
+	</ol>	
+	<li><p><a class='doclink' href='#RdfParser'>RdfParser class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#GenericParsing'>Parsing into generic POJO models</a></p>
+		<li><p><a class='doclink' href='#ParserConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#ParserOtherNotes'>Other notes</a></p>
+	</ol>	
+	<li><p><a class='doclink' href='#RestApiSupport'>REST API support</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#RestServerSupport'>REST server support</a></p>
+		<ol>
+		<li><p><a class='doclink' href='#RestServletJenaDefault'>Using RestServletJenaDefault</a></p>
+		<li><p><a class='doclink' href='#RestServlet'>Using RestServlet with annotations</a></p>
+		<li><p><a class='doclink' href='#DefaultJenaProvider'>Using JAX-RS DefaultJenaProvider</a></p>
+		<li><p><a class='doclink' href='#BaseProvider'>Using JAX-RS BaseProvider with annotations</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#RestClientSupport'>REST client support</a></p>
+	</ol>	
+</ol>
+
+
+<!-- ======================================================================================================== -->
+<a id="RdfOverview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - RDF support overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports serializing and parsing arbitrary POJOs to and from the following RDF formats:
+	</p>
+	<ul>
+		<li>RDF/XML
+		<li>Abbreviated RDF/XML
+		<li>N-Triple
+		<li>Turtle
+		<li>N3
+	</ul>
+	<p>
+		Juno can serialize and parse instances of any of the following POJO types:
+	</p>
+	<ul>
+		<li>Java primitive objects (e.g. <code>String</code>, <code>Integer</code>, <code>Boolean</code>, <code>Float</code>).
+		<li>Java collections framework objects (e.g. <code>HashSet</code>, <code>TreeMap</code>) containing anything on this list.
+		<li>Multi-dimensional arrays of any type on this list.
+		<li>Java Beans with properties of any type on this list.
+		<li>Classes with standard transformations to and from <code>Strings</code> (e.g. classes containing <code>toString()</code>, 
+			<code>fromString()</code>, <code>valueOf()</code>, <code>constructor(String)</code>).
+	</ul>
+	<p>
+		In addition to the types shown above, Juno includes the ability to define filters to transform non-standard object and 
+			property types to serializable forms (e.g. to transform <code>Calendars</code> to and from <code>ISO8601</code> strings, 
+			or <code>byte[]</code> arrays to and from base-64 encoded strings).<br>
+		These filters can be associated with serializers/parsers, or can be associated with classes or bean properties through type and method annotations.
+	</p>
+	<p>
+		Refer to <a href='../package-summary.html#PojoCategories' class='doclink'>POJO Categories</a> for a complete definition of supported POJOs.
+	</p>
+	<h6 class='topic'>Prerequisites</h6>
+	<p>
+		Juno uses the Jena library for these formats.  <br>
+		The predefined serializers and parsers convert POJOs to and from RDF models and then uses Jena to convert them to and from the various RDF languages.	
+	</p>
+	<p>
+		Since Juno is 100% pure IBM code, the Jena libraries must be provided on the classpath separately if you plan on making use of the RDF support.
+	</p>
+		The minimum list of required jars are:
+	</p>
+	<ul>
+		<li><code>jena-core-2.7.1.jar</code> 	
+		<li><code>jena-iri-0.9.2.jar</code> 	
+		<li><code>log4j-1.2.16.jar</code> 	
+		<li><code>slf4j-api-1.6.4.jar</code> 	
+		<li><code>slf4j-log4j12-1.6.4.jar</code> 	
+	</ul>
+
+	<!-- ======================================================================================================== -->
+	<a id="RdfOverviewExample"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - RDF support overview - example</h3>
+	<div class='topic'>
+		<p>
+			The example shown here is from the Address Book resource located in the <code>com.ibm.juno.sample.war</code> application.
+		</p>
+		<p>
+			The POJO model consists of a <code>List</code> of <code>Person</code> beans, with each <code>Person</code> containing
+				zero or more <code>Address</code> beans.
+		</p>
+		<p>
+			When you point a browser at <code>/sample/addressBook</code>, the POJO is rendered as HTML:
+		</p>
+		<img class='bordered' src="doc-files/Example_HTML.png">
+		<p>
+			By appending <code>?Accept=<i>mediaType</i>&plainText=true</code> to the URL, you can view the data in the various RDF supported formats.
+		</p>
+		
+		<h6 class='figure'>RDF/XML</h6>
+		<img class='bordered' src="doc-files/Example_RDFXML.png">
+		
+		<h6 class='figure'>Abbreviated RDF/XML</h6>
+		<img class='bordered' src="doc-files/Example_RDFXMLABBREV.png">
+
+		<h6 class='figure'>N-Triple</h6>
+		<img class='bordered' src="doc-files/Example_NTriple.png">
+
+		<h6 class='figure'>Turtle</h6>
+		<img class='bordered' src="doc-files/Example_Turtle.png">
+		
+		<h6 class='figure'>N3</h6>
+		<img class='bordered' src="doc-files/Example_N3.png">
+	</div>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="RdfSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - RdfSerializer class</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.jena.RdfSerializer} class is the top-level class for all Jena-based serializers.<br>
+		Language-specific serializers are defined as inner subclasses of the <code>RdfSerializer</code> class:
+	</p>	
+	<ul>
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer.Xml}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer.XmlAbbrev}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer.NTriple}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer.Turtle}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer.N3}
+	</ul>
+	<p>
+		Static reusable instances of serializers are also provided with default settings:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer#DEFAULT_XML}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer#DEFAULT_XMLABBREV}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer#DEFAULT_TURTLE}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer#DEFAULT_NTRIPLE}
+		<li>{@link com.ibm.juno.core.jena.RdfSerializer#DEFAULT_N3}
+	</ul>
+	<p>
+		Abbreviated RDF/XML is currently the most widely accepted and readable RDF syntax, so the examples shown here will use that format.
+	</p>
+	<p>
+		For brevity, the examples will use public fields instead of getters/setters to reduce the size of the examples.<br>
+		In the real world, you'll typically want to use standard bean getters and setters.
+	</p>
+	<p>
+		To start off simple, we'll begin with the following simplified bean and build it up.
+	</p>
+	<p class='bcode'>
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name) {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+		}
+	}
+	</p>
+	<p>
+		The following code shows how to convert this to abbreviated RDF/XML:
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev().setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+
+	<jc>// Serialize the bean to RDF/XML.</jc>
+	String rdfXml = s.serialize(p);
+	</p>
+	<p>
+		It should be noted that serializers can also be created by cloning existing serializers:
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new serializer with readable output by cloning an existing serializer.</jc>
+	RdfSerializer s = RdfSerializer.<jsf>DEFAULT_XMLABBREV</jsf>.clone().setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
+	</p>
+	<p>
+		This code produces the following output:
+	</p>
+	<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description&gt;</xt>
+	      <xt>&lt;jp:id&gt;</xt>1<xt>&lt;/jp:id&gt;</xt>
+	      <xt>&lt;jp:name&gt;</xt>John Smith<xt>&lt;/jp:name&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+	</p>
+	<p>
+		Notice that we've taken an arbitrary POJO and converted it to RDF.<br>
+		The Juno serializers and parsers are designed to work with arbitrary POJOs without requiring 
+			any annotations.<br>
+		That being said, several annotations are provided to customize how POJOs are handled to produce usable RDF.
+	</p>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Namespaces"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.1 - Namespaces</h3>
+	<div class='topic'>
+		<p>
+			You'll notice in the previous example that Juno namespaces are used to represent bean property names.<br>
+			These are used by default when namespaces are not explicitly specified.
+		</p>
+		<p>
+			The <code>juno</code> namespace is used for generic names for objects that don't have namespaces associated with them.
+		</p>
+		<p>
+			The <code>junobp</code> namespace is used on bean properties that don't have namespaces associated with them.
+		</p>
+		<p>
+			The easiest way to specify namespaces is through annotations.<br>
+			In this example, we're going to associate the prefix <code>'per'</code> to our bean class and all
+				properties of this class.<br>
+			We do this by adding the following annotation to our class:
+		</p>
+		<p class='bcode'>
+	<ja>@Rdf</ja>(prefix=<js>"per"</js>)
+	<jk>public class</jk> Person {
+	</p>
+	<p>
+		In general, the best approach is to define the namespace URIs at the package level using a <code>package-info.java</code>
+			class, like so:
+	</p>
+	<p class='bcode'>
+	<jc>// RDF namespaces used in this package</jc>
+	<ja>@RdfSchema</ja>(
+		prefix=<js>"ab"</js>,
+		rdfNs={
+			<ja>@RdfNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.ibm.com/addressBook/"</js>),
+			<ja>@RdfNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.ibm.com/person/"</js>),
+			<ja>@RdfNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.ibm.com/address/"</js>),
+			<ja>@RdfNs</ja>(prefix=<js>"mail"</js>, namespaceURI=<js>"http://www.ibm.com/mail/"</js>)
+		}
+	)
+	<jk>package</jk> com.ibm.sample.addressbook;
+	<jk>import</jk> com.ibm.juno.core.xml.annotation.*;
+		</p>
+		<p>
+			This assigns a default prefix of <js>"ab"</js> for all classes and properties within the project, 
+				and specifies various other prefixes used within this project.
+		</p>
+		<p>
+			Now when we rerun the sample code, we'll get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description&gt;</xt>
+	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+		<p>
+			Namespace auto-detection ({@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_autoDetectNamespaces}) is enabled
+				on serializers by default.<br>
+			This causes the serializer to make a first-pass over the data structure to look for namespaces.<br>
+			In high-performance environments, you may want to consider disabling auto-detection and providing an explicit list of namespaces to the serializer
+				to avoid this scanning step.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer, but manually specify the namespaces.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3)
+		.setProperty(XmlSerializerProperties.<jsf>XML_autoDetectNamespaces</jsf>, <jk>false</jk>)
+		.setProperty(XmlSerializerProperties.<jsf>XML_namespaces</jsf>, <js>"{per:'http://www.ibm.com/person/'}"</js>);
+	</p>
+		<p>
+			This code change will produce the same output as before, but will perform slightly better since it doesn't have to crawl the POJO tree before serializing the result.
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="UriProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.2 - URI properties</h3>
+	<div class='topic'>
+		<p>
+			Bean properties of type <code>java.net.URI</code> or <code>java.net.URL</code> have special meaning to the RDF serializer.<br>
+			They are interpreted as resource identifiers.
+		</p>
+		<p>
+			In the following code, we're adding 2 new properties.<br>
+			The first property is annotated with <ja>@BeanProperty</ja> to identify that this property is the
+				resource identifier for this bean.<br>
+			The second unannotated property is interpreted as a reference to another resource.
+		</p>
+		<p class='bcode'>	
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) 
+		<jk>public</jk> URI <jf>uri</jf>;
+		
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+	
+		...
+		
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri) <jk>throws</jk> URISyntaxException {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+		}
+	}
+		</p>
+		<p>
+			We alter our code to pass in values for these new properties.
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>);
+		</p>
+		<p>
+			Now when we run the sample code, we get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description <b><xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs></b>&gt;</xt>
+	      <xt><b>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</b></xt>
+	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+		<p>
+			The {@link com.ibm.juno.core.annotation.URI} annotation can also be used on classes and properties 
+				to identify them as URLs when they're not instances of <code>java.net.URI</code> or <code>java.net.URL</code> 
+				(not needed if <code><ja>@BeanProperty</ja>(beanUri=<jk>true</jk>)</code> is already specified).
+		</p>
+		<p>
+			The following properties would have produced the same output as before.  Note that the <ja>@URI</ja> annotation is only needed
+				on the second property.
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> String <jf>uri</jf>;
+		
+		<ja>@URI</ja> <jk>public</jk> String <jf>addressBookUri</jf>;
+		</p>
+		<p>
+			Also take note of the {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase} and {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase}
+				settings that can be specified on the serializer to resolve relative and context-root-relative URIs to fully-qualfied URIs.
+		</p>
+		<p>
+			This can be useful if you want to keep the URI authority and context root information out of the bean logic layer.
+		</p>
+		<p>
+			The following code produces the same output as before, but the URIs on the beans are relative.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_relativeUriBase</jsf>, <js>"http://myhost/sample"</js>);
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_absolutePathUriBase</jsf>, <js>"http://myhost"</js>);
+		
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"person/1"</js>, <js>"/"</js>);
+
+	<jc>// Serialize the bean to RDF/XML.</jc>
+	String rdfXml = s.serialize(p);
+		</p>		
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="BeanAnnotations"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.3 - @Bean and @BeanProperty annotations</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.annotation.Bean} and {@link com.ibm.juno.core.annotation.BeanProperty} annotations
+				are used to customize the behavior of beans across the entire framework.<br>
+			In addition to using them to identify the resource URI for the bean shown above, they have various other uses:
+		</p>
+		<ul>
+			<li>Hiding bean properties.
+			<li>Specifying the ordering of bean properties.
+			<li>Overriding the names of bean properties.
+			<li>Associating filters at both the class and property level (to convert non-serializable POJOs to serializable forms).
+		</ul>
+		<p>
+			For example, we now add a <code>birthDate</code> property, and associate a filter with it to transform
+				it to an ISO8601 date-time string in GMT time.<br>
+			By default, <code>Calendars</code> are treated as beans by the framework, which is usually not how you want them serialized.<br>
+			Using filters, we can convert them to standardized string forms.
+		</p>
+		<p class='bcode'>	
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar birthDate;
+		...
+		
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			...
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+		</p>
+		<p>
+			And we alter our code to pass in the birthdate.
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+		</p>
+		<p>
+			Now when we rerun the sample code, we'll get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
+	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
+	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	      <xt><b>&lt;per:birthDate&gt;</xt>1946-08-12T00:00:00Z<xt>&lt;/per:birthDate&gt;</b></xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+	</div>
+	
+		
+	<!-- ======================================================================================================== -->
+	<a id="Collections"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.4 - Collections</h3>
+	<div class='topic'>
+		<p>
+			Collections and arrays are converted to RDF sequences.<br>
+			In our example, let's add a list-of-beans property to our sample class:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+		...
+	}
+		</p>
+		<p>
+			The <code>Address</code> class has the following properties defined:
+		</p>
+		<p class='bcode'>
+	<ja>@Rdf</ja>(prefix=<js>"addr"</js>)
+	<jk>public class</jk> Address {
+
+		<jc>// Bean properties</jc>
+		<ja>@BeanProperty</ja>(beanUri=<jk>true</jk>) <jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		
+		<jk>public int</jk> <jf>id</jf>;
+		
+		<ja>@Rdf</ja>(prefix=<js>"mail"</js>) 
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		
+		<ja>@Rdf</ja>(prefix=<js>"mail"</js>) 
+		<jk>public int</jk> <jf>zip</jf>;
+		
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			Next, add some quick-and-dirty code to add an address to our person bean:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer (revert back to namespace autodetection).</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev().setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+		</p>
+		<p>
+			Now when we run the sample code, we get the following:
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs>
+	    <b><xa>xmlns:mail</xa>=<xs>"http://www.ibm.com/mail/"</xs></b>
+	    <b><xa>xmlns:addr</xa>=<xs>"http://www.ibm.com/address/"</xs></b><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
+	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
+	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	      <b><xt>&lt;per:addresses&gt;</xt>
+	         <xt>&lt;rdf:Seq&gt;</xt>
+	            <xt>&lt;rdf:li&gt;</xt>
+	               <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/address/1"</xs>&gt;</xt>
+	                  <xt>&lt;addr:personUri <xa>rdf:resource</xa>=<xs>"http://sample/addressBook/person/1"</xs>/&gt;</xt>
+	                  <xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+	                  <xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+	                  <xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+	                  <xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+	                  <xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+	                  <xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+	               <xt>&lt;/rdf:Description&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	         <xt>&lt;/rdf:Seq&gt;</xt>
+	      <xt>&lt;/per:addresses&gt;</xt></b>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="RootProperty"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.5 - Root property</h3>
+	<div class='topic'>
+		<p>
+			For all RDF languages, the POJO objects get broken down into simple triplets.<br>
+			Unfortunately, for tree-structured data like the POJOs shown above, this causes the root node of the tree to become lost.<br>
+			There is no easy way to identify that <code>person/1</code> is the root node in our tree once in triplet form, and in
+				some cases it's impossible.
+		</p>
+		<p>
+			By default, the {@link com.ibm.juno.core.jena.RdfParser} class handles this by scanning
+				all the nodes and identifying the nodes without incoming references.<br>
+			However, this is inefficient, especially for large models.<br>
+			And in cases where the root node is referenced by another node in the model by URL, it's not possible to locate the root at all.
+		</p>
+		<p>
+			To resolve this issue, the property {@link com.ibm.juno.core.jena.RdfSerializerProperties#RDF_addRootProperty} was introduced.<br>
+			When enabled, this adds a special <code>root</code> attribute to the root node to make it easy to locate by the parser.
+		</p>
+		<p>
+			To enable, set the <jsf>RDF_addRootProperty</jsf> property to <jk>true</jk> on the serializer:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3),
+		.setProperty(RdfSerializerProperties.<jsf>RDF_addRootProperty</jsf>, <jk>true</jk>);
+		</p>	
+		<p>
+			Now when we rerun the sample code, we'll see the added <code>root</code> attribute on the root resource.
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs>
+	    <xa>xmlns:mail</xa>=<xs>"http://www.ibm.com/mail/"</xs>
+	    <xa>xmlns:addr</xa>=<xs>"http://www.ibm.com/address/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
+  	      <b><xt>&lt;j:root&gt;</xt>true<xt>&lt;/j:root&gt;</xt></b>
+  	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
+	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	      <xt>&lt;per:addresses&gt;</xt>
+	         <xt>&lt;rdf:Seq&gt;</xt>
+	            <xt>&lt;rdf:li&gt;</xt>
+	               <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/address/1"</xs>&gt;</xt>
+	                  <xt>&lt;addr:personUri <xa>rdf:resource</xa>=<xs>"http://sample/addressBook/person/1"</xs>/&gt;</xt>
+	                  <xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+	                  <xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+	                  <xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+	                  <xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+	                  <xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+	                  <xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+	               <xt>&lt;/rdf:Description&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	         <xt>&lt;/rdf:Seq&gt;</xt>
+	      <xt>&lt;/per:addresses&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="TypedLiterals"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.6 - Typed literals</h3>
+	<div class='topic'>
+		<p>
+			XML-Schema datatypes can be added to non-<code>String</code> literals through the {@link com.ibm.juno.core.jena.RdfSerializerProperties#RDF_addLiteralTypes}
+				setting.
+		</p>
+		<p>
+			To enable, set the <jsf>RDF_addLiteralTypes</jsf> property to <jk>true</jk> on the serializer:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer (revert back to namespace autodetection).</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3),
+		.setProperty(RdfSerializerProperties.<jsf>RDF_addLiteralTypes</jsf>, <jk>true</jk>);
+		</p>	
+		<p>
+			Now when we rerun the sample code, we'll see the added <code>root</code> attribute on the root resource.
+		</p>
+		<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
+	    <xa>xmlns:j</xa>=<xs>"http://www.ibm.com/juno/"</xs>
+	    <xa>xmlns:jp</xa>=<xs>"http://www.ibm.com/junobp/"</xs>
+	    <xa>xmlns:per</xa>=<xs>"http://www.ibm.com/person/"</xs>
+	    <xa>xmlns:mail</xa>=<xs>"http://www.ibm.com/mail/"</xs>
+	    <xa>xmlns:addr</xa>=<xs>"http://www.ibm.com/address/"</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
+  	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
+	      <xt>&lt;per:id</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b><xt>&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
+	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
+	      <xt>&lt;per:addresses&gt;</xt>
+	         <xt>&lt;rdf:Seq&gt;</xt>
+	            <xt>&lt;rdf:li&gt;</xt>
+	               <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/address/1"</xs>&gt;</xt>
+	                  <xt>&lt;addr:personUri <xa>rdf:resource</xa>=<xs>"http://sample/addressBook/person/1"</xs>/&gt;</xt>
+	                  <xt>&lt;addr:id</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b>&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
+	                  <xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
+	                  <xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
+	                  <xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
+	                  <xt>&lt;mail:zip</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b>&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
+	                  <xt>&lt;addr:isCurrent</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#boolean"</xs></b>&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
+	               <xt>&lt;/rdf:Description&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	         <xt>&lt;/rdf:Seq&gt;</xt>
+	      <xt>&lt;/per:addresses&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Recursion"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.7 - Non-tree models and recursion detection</h3>
+	<div class='topic'>
+		<p>
+			The RDF serializer is designed to be used against tree structures.<br>  
+			It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).<br>
+			If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
+				be thrown (if {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth} is not reached first).
+		</p>
+		<p>
+			If you still want to use the XML serializer on such models, Juno provides the 
+				{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions} setting.<br>
+			It tells the serializer to look for instances of an object in the current branch of the tree and
+				skip serialization when a duplicate is encountered.
+		</p>
+		<p>
+			Recursion detection introduces a performance penalty of around 20%.<br>
+			For this reason the setting is disabled by default.
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.8 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>RdfSerializer</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfSerializerProperties#RDF_addLiteralTypes}</td>
+				<td>Add XSI data types to non-<code>String</code> literals</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfSerializerProperties#RDF_addRootProperty}</td>
+				<td>Add RDF root identifier property to root node</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_junoNs}</td>
+				<td>The XML namespace for Juno properties</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_junoBpNs}</td>
+				<td>The default XML namespace for bean properties</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_iriRules}</td>
+				<td>Set the engine for checking and resolving</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_errorMode}</td>
+				<td>Allows a coarse-grained approach to control of error handling</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_embedding}</td>
+				<td>Sets ARP to look for RDF embedded within an enclosing XML document</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_err_}</td>
+				<td>Provides fine-grained control over detected error conditions</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_warn_}</td>
+				<td>Provides fine-grained control over detected warning conditions</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_ign_}</td>
+				<td>Provides fine-grained control over ignoring conditions</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_xmlBase}</td>
+				<td>The value to be included for an <xa>xml:base</xa> attribute on the root element in the file</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_longId}</td>
+				<td>Whether to use long IDs for anon resources</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_allowBadUris}</td>
+				<td>URIs in the graph are, by default, checked prior to serialization</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_relativeUris}</td>
+				<td>What sort of relative URIs should be used</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_showXmlDeclaration}</td>
+				<td>Options for XML declaration in output</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_showDoctypeDeclaration}</td>
+				<td>Show XML declaration in output</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_tab}</td>
+				<td>The number of spaces with which to indent XML child elements</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_attributeQuoteChar}</td>
+				<td>The XML attribute quote character</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_rdfxml_blockRules}</td>
+				<td>Indicates grammar rules that will not be used</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_minGap}</td>
+				<td>Minimum gap between items on a line</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_objectLists}</td>
+				<td>Print object lists as comma separated lists</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_subjectColumn}</td>
+				<td>If the subject is shorter than this value, the first property may go on the same line</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_propertyColumn}</td>
+				<td>Width of the property column</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_indentProperty}</td>
+				<td>Width to indent properties</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_widePropertyLen}</td>
+				<td>Width of the property column</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_abbrevBaseUri}</td>
+				<td>Control whether to use abbreviations <code>&lt;&gt;</code> or <code>&lt;#&gt;</code></td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_usePropertySymbols}</td>
+				<td>Control whether to use <code>a</code>, <code>=</code> and <code>=&gt;</code> in output</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_useTripleQuotedStrings}</td>
+				<td>Allow the use of <code>"""</code> to delimit long strings</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_n3_useDoubles}</td>
+				<td>Allow the use doubles as <code>123.456</code></td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_autoDetectNamespaces}</td>
+				<td>Auto-detect namespace usage</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.xml.XmlSerializerProperties#XML_namespaces}</td>
+				<td>Namespaces used</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth}</td>
+				<td>Maximum serialization depth</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions}</td>
+				<td>Automatically detect POJO recursions</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_useIndentation}</td>
+				<td>Use indentation in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_quoteChar}</td>
+				<td>Quote character</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimNullProperties}</td>
+				<td>Trim null bean property values from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyLists}</td>
+				<td>Trim empty lists and arrays from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyMaps}</td>
+				<td>Trim empty maps from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase}</td>
+				<td>URI context root for relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase}</td>
+				<td>URI authority for absolute path relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireDefaultConstructor}</td>
+				<td>Beans require no-arg constructors</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSerializable}</td>
+				<td>Beans require <code>Serializable</code> interface</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSettersForGetters}</td>
+				<td>Beans require setters for getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSomeProperties}</td>
+				<td>Beans require some properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanConstructorVisibility}</td>
+				<td>Look for bean constructors with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanClassVisibility}</td>
+				<td>Look for bean classes with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanFieldVisibility}</td>
+				<td>Look for bean fields with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_methodVisibility}</td>
+				<td>Look for bean methods with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useJavaBeanIntrospector}</td>
+				<td>Use Java {@link java.beans.Introspector} for determining bean properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useInterfaceProxies}</td>
+				<td>Use interface proxies</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties}</td>
+				<td>Ignore unknown properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownNullBeanProperties}</td>
+				<td>Ignore unknown properties with null values</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnGetters}</td>
+				<td>Ignore invocation errors when calling getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnSetters}</td>
+				<td>Ignore invocation errors when calling setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_addNotBeanPackages}</td>
+				<td>Add to the list of packages whose classes should not be considered beans</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_removeNotBeanPackages}</td>
+				<td>Remove from the list of packages whose classes should not be considered beans</td>
+			</tr>	
+		</table>	
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.9 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno serializers, the RDF serializer is thread safe and maintains an internal cache of bean classes encountered.
+				For performance reasons, it's recommended that serializers be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="RdfParser"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - RdfParser class</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.jena.RdfParser} class is the top-level class for all Jena-based parsers.<br>
+		Language-specific parsers are defined as inner subclasses of the <code>RdfParser</code> class:
+	</p>	
+	<ul>
+		<li>{@link com.ibm.juno.core.jena.RdfParser.Xml}
+		<li>{@link com.ibm.juno.core.jena.RdfParser.NTriple}
+		<li>{@link com.ibm.juno.core.jena.RdfParser.Turtle}
+		<li>{@link com.ibm.juno.core.jena.RdfParser.N3}
+	</ul>
+	<p>
+		The <code>RdfParser.Xml</code> parser handles both regular and abbreviated RDF/XML.
+	</p>
+	<p>
+		Static reusable instances of parsers are also provided with default settings:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.jena.RdfParser#DEFAULT_XML}
+		<li>{@link com.ibm.juno.core.jena.RdfParser#DEFAULT_TURTLE}
+		<li>{@link com.ibm.juno.core.jena.RdfParser#DEFAULT_NTRIPLE}
+		<li>{@link com.ibm.juno.core.jena.RdfParser#DEFAULT_N3}
+	</ul>
+	<p>
+		For an example, we will build upon the previous example and parse the generated RDF/XML back into the original bean.
+	</p>
+		<p class='bcode'>
+	<jc>// Create a new serializer with readable output.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3)
+		.setProperty(RdfSerializerProperties.<jsf>RDF_addRootProperty</jsf>, <jk>true</jk>);
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+
+	<jc>// Serialize the bean to RDF/XML.</jc>
+	String rdfXml = s.serialize(p);
+	
+	<jc>// Parse it back into a bean using the reusable XML parser.</jc>
+	p = RdfParser.<jsf>DEFAULT_XML</jsf>.parse(rdfXml, Person.<jk>class</jk>);
+
+	<jc>// Render it as JSON.</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(p);
+	System.<jsm>err</jsm>.println(json);
+	</p>
+	<p>
+		We print it out to JSON to show that all the data has been preserved:
+	</p>
+	<p class='bcode'>
+	{
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		id: 1, 
+		name: <js>'John Smith'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: 1, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: 12345, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}	
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="GenericParsing"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.1 - Parsing into generic POJO models</h3>
+	<div class='topic'>
+		<p>
+			The RDF parser is not limited to parsing back into the original bean classes.<br>  
+			If the bean classes are not available on the parsing side, the parser can also be used to 
+				parse into a generic model consisting of <code>Maps</code>, <code>Collections</code>, and primitive
+				objects.
+		</p>
+		<p>
+			You can parse into any <code>Map</code> type (e.g. <code>HashMap</code>, <code>TreeMap</code>), but
+				using {@link com.ibm.juno.core.ObjectMap} is recommended since it has many convenience methods
+				for converting values to various types. <br> 
+			The same is true when parsing collections.  You can use any Collection (e.g. <code>HashSet</code>, <code>LinkedList</code>)
+				or array (e.g. <code>Object[]</code>, <code>String[]</code>, <code>String[][]</code>), but using 
+				{@link com.ibm.juno.core.ObjectList} is recommended.
+		</p>
+		<p>
+			When the map or list type is not specified, or is the abstract <code>Map</code>, <code>Collection</code>, or <code>List</code> types, 
+				the parser will use <code>ObjectMap</code> and <code>ObjectList</code> by default.
+		</p>
+		<p>
+			In the following example, we parse into an <code>ObjectMap</code> and use the convenience methods for performing data conversion on values in the map.
+		</p>
+		<p class='bcode'>	
+	<jc>// Parse RDF into a generic POJO model.</jc>
+	ObjectMap m = RdfParser.<jsf>DEFAULT_XML</jsf>.parse(rdfXml, ObjectMap.<jk>class</jk>);
+
+	<jc>// Get some simple values.</jc>
+	String name = m.getString(<js>"name"</js>);
+	<jk>int</jk> id = m.getInt(<js>"id"</js>);
+
+	<jc>// Get a value convertable from a String.</jc>
+	URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>);
+
+	<jc>// Get a value using a filter.</jc>
+	CalendarFilter filter = <jk>new</jk> CalendarFilter.ISO8601DTZ();
+	Calendar birthDate = m.get(filter, <js>"birthDate"</js>);
+
+	<jc>// Get the addresses.</jc>
+	ObjectList addresses = m.getObjectList(<js>"addresses"</js>);
+
+	<jc>// Get the first address and convert it to a bean.</jc>
+	Address address = addresses.get(Address.<jk>class</jk>, 0);
+		</p>
+		
+		<p>
+			However, there are caveats when parsing into generic models due to the nature of RDF.<br>
+			Watch out for the following:
+		</p>
+		<ul>
+			<li>The ordering of entries are going to be inconsistent.<br><br>
+			<li>Bean URIs are always going to be denoted with the key <js>"uri"</js>.<br>
+				Therefore, you cannot have a bean with a URI property and a separate property named <js>"uri"</js>.<br>
+				The latter will overwrite the former.<br>
+				This isn't a problem when parsing into beans instead of generic POJO models.<br><br>
+			<li>All values are strings.<br>
+				This normally isn't a problem when using <code>ObjectMap</code> and <code>ObjectList</code> since 
+					various methods are provided for converting to the correct type anyway.<br><br>	
+			<li>The results may not be what is expected if there are lots of URL reference loops in the RDF model.<br>
+				As nodes are processed from the root node down through the child nodes, the parser keeps
+					track of previously processed parent URIs and handles them accordingly.<br>
+				If it finds that the URI has previously been processed, it handles it as a normal URI string and doesn't 
+					process further.<br>
+				However, depending on how complex the reference loops are, the parsed data may end up having the
+					same data in it, but structured differently from the original POJO.
+		</ul>
+		<p>
+			We can see some of these when we render the <code>ObjectMap</code> back to JSON.
+		</p>
+		<p class='bcode'>
+	System.<jsm>err</jsm>.println(JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(m));
+		</p>
+		<p>
+			This is what's produced:
+		</p>
+		<p class='bcode'>
+	{
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				isCurrent: <js>'true'</js>, 
+				zip: <js>'12345'</js>, 
+				state: <js>'NY'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				street: <js>'100 Main Street'</js>, 
+				id: <js>'1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>
+			}
+		], 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		name: <js>'John Smith'</js>, 
+		id: <js>'1'</js>, 
+		root: <js>'true'</js>
+	}		
+		</p>
+		<p>
+			As a general rule, parsing into beans is often more efficient than parsing into generic models.<br>
+			And working with beans is often less error prone than working with generic models.
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.2 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>RdfParser</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfParserProperties#RDF_trimWhitespace}</td>
+				<td>Trim whitespace from text elements</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_iriRules}</td>
+				<td>Set the engine for checking and resolving</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_errorMode}</td>
+				<td>Allows a coarse-grained approach to control of error handling</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_embedding}</td>
+				<td>Sets ARP to look for RDF embedded within an enclosing XML document</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_err_}</td>
+				<td>Provides fine-grained control over detected error conditions</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_warn_}</td>
+				<td>Provides fine-grained control over detected warning conditions</td>
+			</tr>		
+			<tr>
+				<td>{@link com.ibm.juno.core.jena.RdfProperties#RDF_arp_ign_}</td>
+				<td>Provides fine-grained control over ignoring conditions</td>
+			</tr>		
+		</table>	
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.3 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno parsers, the RDF parser is thread safe and maintains an internal cache of bean classes encountered.
+				For performance reasons, it's recommended that parser be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+	
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="RestApiSupport"></a>
+<h2 class='topic' onclick='toggle(this)'>4 - REST API support</h2>
+<div class='topic'>
+	<p>
+		Juno provides fully-integrated support for RDF serialization/parsing in the REST server and client APIs.
+	</p>
+	<p>
+		The next two sections describe these in detail.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestServerSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.1 - REST server support</h3>
+	<div class='topic'>
+		<p>
+			There are four general ways of defining REST interfaces with support for RDF media types.<br>
+			Two using the built-in Juno Server API, and two using the JAX-RS integration component.
+		</p>
+		<ul>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.jena.RestServletJenaDefault}.<br>
+				This includes serialization and parsing for all Jena supported types, including all supported flavors of RDF.<br><br>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.RestServlet} and specify the
+					RDF serializers and parsers using the {@link com.ibm.juno.server.annotation.RestResource#serializers()} and
+					{@link com.ibm.juno.server.annotation.RestResource#parsers()} on the entire servlet class, or 
+					the {@link com.ibm.juno.server.annotation.RestMethod#serializers()} and {@link com.ibm.juno.server.annotation.RestMethod#parsers()}
+					annotations on individual methods within the class.<br><br>
+			<li>Register {@link com.ibm.juno.server.jaxrs.rdf.DefaultJenaProvider} with JAX-RS to provide support RDF support for all JAX-RS resource.<br>
+				This includes serialization and parsing for all Juno supported types (JSON, XML, HTML...), including all supported flavors of RDF.<br><br>
+			<li>Create and register a subclass of {@link com.ibm.juno.server.jaxrs.BaseProvider} and specify the serializers and parsers to use on JAX-RS resources.
+		</ul>
+		<p>
+			In general, the Juno REST server API is much more configurable and easier to use than JAX-RS, but beware that the author may be slightly biased in this statement.
+		</p>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServletJenaDefault"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.1 - Using RestServletJenaDefault</h4>
+		<div class='topic'>
+			<p>
+				The quickest way to implement a REST resource with RDF support is to create a subclass of {@link com.ibm.juno.server.jena.RestServletJenaDefault}.<br>
+				This class provides support for all the RDF flavors in addition to JSON, XML, HTML, and URL-Encoding.
+			</p>
+			<p>
+				The reason why RDF support was not added to {@link com.ibm.juno.server.RestServletDefault} directly was to keep the Jena prerequisites
+					out of the <code>com.ibm.juno.server</code> package.
+			</p>
+			<p>
+				The <code>AddressBookResource</code> example shown in the first chapter uses the <code>RestServletJenaDefault</code> class.<br>
+				The start of the class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<jc>// Proof-of-concept resource that shows off the capabilities of working with POJO resources.
+	// Consists of an in-memory address book repository.</jc>
+	<ja>@RestResource</ja>(
+		messages=<js>"nls/AddressBookResource"</js>,
+		properties={
+			<ja>@Property</ja>(name=RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, value=<js>"3"</js>),
+			<ja>@Property</ja>(name=RdfSerializerProperties.<jsf>RDF_addRootProperty</jsf>, value=<js>"true"</js>),
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>),
+			<ja>@Property</ja>(name=HtmlSerializerProperties.<jsf>HTML_uriAnchorText</jsf>, value=<jsf>TO_STRING</jsf>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_description</jsf>, value=<js>"$L{description}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
+		},
+		encoders=GzipEncoder.<jk>class</jk>
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+			</p>
+			<p>
+				Notice how serializer and parser properties can be specified using the <code>@RestResource.properties()</code> annotation.<br>
+				The <jsf>RDF_rdfxml_tab</jsf> and <jsf>RDF_addRootProperty</jsf> are properties on the RDF serializers.<br>
+				The <jsf>SERIALIZER_quoteChar</jsf> property is common to all serializers.<br>
+				The remaining properties are specific to the HTML serializer.
+			</p>
+			<p>
+ 				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
+ 				These variables are replaced at runtime based on the HTTP request locale.
+				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
+				See {@link com.ibm.juno.server.RestServlet#getVarResolver()} for more information.
+			</p>
+			<p>
+				This document won't go into all the details of the Juno <code>RestServlet</code> class.<br>
+				Refer to the {@link com.ibm.juno.server} documentation for more information on the REST servlet class in general.
+			</p>
+			<p>
+				The rest of the code in the resource class consists of REST methods that simply accept and return POJOs.<br>
+				The framework takes care of all content negotiation, serialization/parsing, and error handling.<br>
+				Below are 3 of those methods to give you a general idea of the concept:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404})
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+	
+	<jc>// POST person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/people"</js>, guards=AdminGuard.<jk>class</jk>, rc={307,404})
+	<jk>public void</jk> createPerson(RestResponse res, <ja>@Content</ja> CreatePerson cp) <jk>throws</jk> Exception {
+		Person p = addressBook.createPerson(cp);
+		res.sendRedirect(p.<jf>uri</jf>);
+	}
+
+	<jc>// DELETE person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"DELETE"</js>, path=<js>"/people/{id}"</js>, guards=AdminGuard.<jk>class</jk>, rc={200,404})
+	<jk>public</jk> String deletePerson(RestResponse res, <ja>@Attr</ja> <jk>int</jk> id) <jk>throws</jk> Exception {
+		Person p = findPerson(id);
+		addressBook.remove(p);
+		<jk>return</jk> <js>"DELETE successful"</js>;			
+	}	
+			</p>
+			<p>
+				The resource class can be registered with the web application like any other servlet, or can be 
+					defined as a child of another resource through the {@link com.ibm.juno.server.annotation.RestResource#children()} annotation.
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServlet"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.2 - Using RestServlet with annotations</h4>
+		<div class='topic'>
+			<p>
+				For fine-tuned control of media types, the {@link com.ibm.juno.server.RestServlet} class 
+					can be subclassed directly.<br>
+				The serializers/parsers can be specified through annotations at the class and/or method levels.
+			</p>
+			<p>
+				An equivalent <code>AddressBookResource</code> class could be defined to only support RDF/XML using
+					the following definition:
+			</p>
+			<p class='bcode'>
+	<ja>@RestResource</ja>(
+		serializers={RdfSerializer.XmlAbbrev.<jk>class</jk>},
+		parsers={RdfParser.Xml.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, value=<js>"3"</js>),
+			<ja>@Property</ja>(name=RdfSerializerProperties.<jsf>RDF_addRootProperty</jsf>, value=<js>"true"</js>),
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServlet {
+			</p>
+			<p>
+				Likewise, serializers and parsers can be specified/augmented/overridden at the method level like so:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404},
+		serializers={RdfSerializer.XmlAbbrev.<jk>class</jk>},
+		parsers={RdfParser.Xml.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, value=<js>"3"</js>),
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+			</p>
+			<p>
+				The {@link com.ibm.juno.server.annotation.RestMethod#serializersInherit()} and 
+					{@link com.ibm.juno.server.annotation.RestMethod#parsersInherit()} control how various artifacts
+					are inherited from the parent class.<br>
+				Refer to {@link com.ibm.juno.server} for additional information on using these annotations.
+			</p>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="DefaultJenaProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.3 - Using JAX-RS DefaultJenaProvider</h4>
+		<div class='topic'>
+			<p>
+				RDF media type support in JAX-RS can be achieved by using the {@link com.ibm.juno.server.jaxrs.rdf.DefaultJenaProvider} class.<br>
+				It implements the JAX-RS <code>MessageBodyReader</code> and <code>MessageBodyWriter</code> interfaces for all Juno supported media types.
+			</p>
+			<p>
+				The <code>DefaultJenaProvider</code> class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonSerializer</jc>
+		<js>"application/json+simple"</js>,<js>"text/json+simple"</js>,    <jc>// JsonSerializer.Simple</jc>
+		<js>"application/json+schema"</js>,<js>"text/json+schema"</js>,    <jc>// JsonSchemaSerializer</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlDocSerializer</jc>
+		<js>"text/xml+simple"</js>,                               <jc>// XmlDocSerializer.Simple</jc>
+		<js>"text/xml+schema"</js>,                               <jc>// XmlSchemaDocSerializer</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlDocSerializer</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingSerializer</jc>
+		<js>"text/xml+soap"</js>,                                 <jc>// SoapXmlSerializer</jc>
+		<js>"text/xml+rdf"</js>,                                  <jc>// RdfSerializer.Xml</jc>
+		<js>"text/xml+rdf+abbrev"</js>,                           <jc>// RdfSerializer.XmlAbbrev</jc>
+		<js>"text/n-triple"</js>,                                 <jc>// RdfSerializer.NTriple</jc>
+		<js>"text/turtle"</js>,                                   <jc>// RdfSerializer.Turtle</jc>
+		<js>"text/n3"</js>,                                       <jc>// RdfSerializer.N3</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectSerializer</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonParser</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlParser</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlParser</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingParser</jc>
+		<js>"text/xml+rdf"</js>,                                  <jc>// RdfParser.Xml</jc>
+		<js>"text/n-triple"</js>,                                 <jc>// RdfParser.NTriple</jc>
+		<js>"text/turtle"</js>,                                   <jc>// RdfParser.Turtle</jc>
+		<js>"text/n3"</js>,                                       <jc>// RdfParser.N3</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectParser</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			JsonSerializer.<jk>class</jk>,
+			JsonSerializer.Simple.<jk>class</jk>,
+			JsonSchemaSerializer.<jk>class</jk>,
+			XmlDocSerializer.<jk>class</jk>,
+			XmlDocSerializer.Simple.<jk>class</jk>,
+			XmlSchemaDocSerializer.<jk>class</jk>,
+			HtmlDocSerializer.<jk>class</jk>,
+			UrlEncodingSerializer.<jk>class</jk>,
+			SoapXmlSerializer.<jk>class</jk>,
+			RdfSerializer.Xml.<jk>class</jk>,
+			RdfSerializer.XmlAbbrev.<jk>class</jk>,
+			RdfSerializer.NTriple.<jk>class</jk>,
+			RdfSerializer.Turtle.<jk>class</jk>,
+			RdfSerializer.N3.<jk>class</jk>,
+			JavaSerializedObjectSerializer.<jk>class</jk>
+		},
+		parsers={
+			JsonParser.<jk>class</jk>,
+			XmlParser.<jk>class</jk>,
+			HtmlParser.<jk>class</jk>,
+			UrlEncodingParser.<jk>class</jk>,
+			RdfParser.Xml.<jk>class</jk>,
+			RdfParser.NTriple.<jk>class</jk>,
+			RdfParser.Turtle.<jk>class</jk>,
+			RdfParser.N3.<jk>class</jk>,
+			JavaSerializedObjectParser.<jk>class</jk>,
+		}
+	)
+	<jk>public final class</jk> DefaultJenaProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				That's the entire class.  It consists of only annotations to hook up media types to Juno serializers and parsers.<br>
+				The <ja>@Provider</ja>, <ja>@Produces</ja>, and <ja>@Consumes</ja> annotations are standard JAX-RS annotations, and the <ja>@JunoProvider</ja> annotation is from Juno.
+			</p>
+			<p>
+				To enable the provider, you need to make the JAX-RS environment aware of it.<br>
+				In Wink, this is accomplished by adding an entry to a config file.
+			</p>
+			<p class='bcode'>
+	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>"2.3"</xs><xt>&gt;</xt>
+		<xt>&lt;servlet&gt;</xt>
+			<xt>&lt;servlet-name&gt;</xt>WinkService<xt>&lt;/servlet-name&gt;</xt>
+			<xt>&lt;servlet-class&gt;</xt>org.apache.wink.server.internal.servlet.RestServlet<xt>&lt;/servlet-class&gt;</xt>
+			<xt>&lt;init-param&gt;</xt>
+				<xt>&lt;param-name&gt;</xt>applicationConfigLocation<xt>&lt;/param-name&gt;</xt>
+				<xt>&lt;param-value&gt;</xt>/WEB-INF/wink.cfg<xt>&lt;/param-value&gt;</xt>
+			<xt>&lt;/init-param&gt;</xt>
+		<xt>&lt;/servlet&gt;</xt>
+			</p>
+			<p>
+				Simply include a reference to the provider in the configuration file.
+			<p class='bcode'>
+	com.ibm.juno.server.jaxrs.DefaultJenaProvider
+			</p>
+			<p>
+				Properties can be specified on providers through the {@link com.ibm.juno.server.jaxrs.JunoProvider#properties()} annotation.
+			</p>
+			<p>
+				Properties can also be specified at the method level by using the {@link com.ibm.juno.server.annotation.RestMethod#properties} annotation, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@GET</ja>
+	<ja>@Produces</ja>(<js>"*/*"</js>)
+	<ja>@RestMethod</ja>( <jc>/* Override some properties */</jc>
+		properties={
+			<ja>@Property</ja>(name=RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, value=<js>"3"</js>),
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public</jk> Message getMessage() {
+		<jk>return</jk> message;
+	}
+			</p>
+			<h6 class='topic'>Limitations</h6>
+			<p>
+				In general, the Juno REST API is considerably more flexible than the JAX-RS API, since you can specify and override
+					serializers, parsers, properties, filters, converters, guards, etc... at both the class and method levels.<br>
+				Therefore, the JAX-RS API has the following limitations that the Juno Server API does not:
+			</p>
+			<ul>
+				<li>The ability to specify different media type providers at the class and method levels.<br> 
+					For example, you may want to use <code>RdfSerializer.Xml</code> with one set of properties on 
+						one class, and another instance with different properties on another class.<br>
+					There is currently no way to define this at the class level.<br>
+					You can override properties at the method level, but this can be cumbersome since it would have to be
+						done for all methods in the resource.<br><br>
+				<li>The Juno Server API allows you to manipulate properties programatically through the {@link com.ibm.juno.server.RestResponse#setProperty(String,Object)}
+					method, and through the {@link com.ibm.juno.server.annotation.Properties} annotation.<br>
+					There is no equivalent in JAX-RS.
+			</ul>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="BaseProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.4 - Using JAX-RS BaseProvider with annotations</h4>
+		<div class='topic'>
+			<p>
+				To provide support for only RDF media types, you can define your own provider class, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"text/xml+rdf"</js>,                                  <jc>// RdfSerializer.Xml</jc>
+		<js>"text/xml+rdf+abbrev"</js>,                           <jc>// RdfSerializer.XmlAbbrev</jc>
+		<js>"text/n-triple"</js>,                                 <jc>// RdfSerializer.NTriple</jc>
+		<js>"text/turtle"</js>,                                   <jc>// RdfSerializer.Turtle</jc>
+		<js>"text/n3"</js>,                                       <jc>// RdfSerializer.N3</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"text/xml+rdf"</js>,                                  <jc>// RdfParser.Xml</jc>
+		<js>"text/n-triple"</js>,                                 <jc>// RdfParser.NTriple</jc>
+		<js>"text/turtle"</js>,                                   <jc>// RdfParser.Turtle</jc>
+		<js>"text/n3"</js>,                                       <jc>// RdfParser.N3</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			RdfSerializer.Xml.<jk>class</jk>,
+			RdfSerializer.XmlAbbrev.<jk>class</jk>,
+			RdfSerializer.NTriple.<jk>class</jk>,
+			RdfSerializer.Turtle.<jk>class</jk>,
+			RdfSerializer.N3.<jk>class</jk>,
+		},
+		parsers={
+			RdfParser.Xml.<jk>class</jk>,
+			RdfParser.NTriple.<jk>class</jk>,
+			RdfParser.Turtle.<jk>class</jk>,
+			RdfParser.N3.<jk>class</jk>,
+		},
+		properties={
+			<ja>@Property</ja>(name=RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, value=<js>"3"</js>),
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public final class</jk> MyRdfProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				Then register it with Wink the same way as <code>DefaultJenaProvider</code>.
+			</p>
+		</div>
+
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestClientSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.2 - REST client support</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class provides an easy-to-use REST client interface with 
+				pluggable media type handling using any of the Juno serializers and parsers.
+		</p>
+		<p>
+			Defining a client to support RDF media types on HTTP requests and responses can be done in one line of code:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a client to handle RDF/XML requests and responses.</jc>
+	RestClient client = <jk>new</jk> RestClient(RdfSerializer.XmlAbbrev.<jk>class</jk>, RdfParser.Xml.<jk>class</jk>);
+		</p>
+		<p>
+			The client handles all content negotiation based on the registered serializers and parsers.
+		</p>
+		<p>
+			The following code is pulled from the main method of the <code>ClientTest</code> class in the sample web application, and
+				is run against the <code>AddressBookResource</code> class running within the sample app.
+			It shows how the client can be used to interact with the REST API while completely hiding the negotiated content type and working with nothing more than beans.
+		</p>
+		<p class='bcode'>
+	String root = <js>"http://localhost:9080/sample/addressBook"</js>;
+	
+	<jc>// Get the current contents of the address book</jc>
+	AddressBook ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Delete the existing entries</jc>
+	<jk>for</jk> (Person p : ab) {
+		String r = client.doDelete(p.<jf>uri</jf>).getResponse(String.<jk>class</jk>);
+		System.<jsm>out</jsm>.println(<js>"Deleted person "</js> + p.<jf>name</jf> + <js>", response = "</js> + r);
+	}
+	
+	<jc>// Make sure they're gone</jc>
+	ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Add 1st person again</jc>
+	CreatePerson cp = <jk>new</jk> CreatePerson(
+		<js>"Barack Obama"</js>, 
+		<jsm>toCalendar</jsm>(<js>"Aug 4, 1961"</js>),
+		<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>true</jk>),
+		<jk>new</jk> CreateAddress(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, <js>"IL"</js>, 60615, <jk>false</jk>)
+	); 
+	Person p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add 2nd person again, but add addresses separately</jc>
+	cp = <jk>new</jk> CreatePerson(
+		<js>"George Walker Bush"</js>, 
+		toCalendar(<js>"Jul 6, 1946"</js>)
+	);
+	p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add addresses to 2nd person</jc>
+	CreateAddress ca = <jk>new</jk> CreateAddress(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, <js>"TX"</js>, 76638, <jk>true</jk>);
+	Address a = client.doPost(p.<jf>uri</jf> + <js>"/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+				
+	ca = <jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>false</jk>);
+	a = client.doPost(p.<jf>uri</jf> + "/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+	
+	<jc>// Find 1st person, and change name</jc>
+	Person[] pp = client.doGet(root + <js>"?q={name:\"'Barack+Obama'\"}"</js>).getResponse(Person[].<jk>class</jk>);
+	String r = client.doPut(pp[0].<jf>uri</jf> + <js>"/name"</js>, <js>"Barack Hussein Obama"</js>).getResponse(String.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Changed name, response = "</js> + r);
+	p = client.doGet(pp[0].<jf>uri</jf>).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"New name = "</js> + p.<jf>name</jf>);
+		</p>
+		<p>
+			The code above produces the following output.
+		</p>
+		<p class='bcode'>
+	Number of entries = 2
+	Deleted person Barack Obama, response = DELETE successful
+	Deleted person George Walker Bush, response = DELETE successful
+	Number of entries = 0
+	Created person Barack Obama, uri = http://localhost:9080/sample/addressBook/people/3
+	Created person George Walker Bush, uri = http://localhost:9080/sample/addressBook/people/4
+	Created address http://localhost:9080/sample/addressBook/addresses/7
+	Created address http://localhost:9080/sample/addressBook/addresses/8
+	Changed name, response = PUT successful
+	New name = Barack Hussein Obama
+		</p>
+	</div>
+</div>
+<p align="center"><i><b>*** f�n ***</b></i></p>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.class
new file mode 100755
index 0000000..2cf8314
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.java
new file mode 100755
index 0000000..90308ef
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectParser.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jso;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Parses POJOs from HTTP responses as Java {@link ObjectInputStream ObjectInputStreams}.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Consumes <code>Content-Type</code> types: <code>application/x-java-serialized-object</code>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Consumes("application/x-java-serialized-object")
+public final class JavaSerializedObjectParser extends InputStreamParser {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@SuppressWarnings("unchecked")
+	@Override /* InputStreamParser */
+	protected <T> T doParse(InputStream in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		try {
+			ObjectInputStream ois = new ObjectInputStream(in);
+			return (T)ois.readObject();
+		} catch (ClassNotFoundException e) {
+			throw new ParseException(e);
+		}
+	}
+
+
+	@Override /* Lockable */
+	public JavaSerializedObjectParser clone() {
+		try {
+			return (JavaSerializedObjectParser)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.class
new file mode 100755
index 0000000..39933b5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.java
new file mode 100755
index 0000000..8f59b48
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/JavaSerializedObjectSerializer.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jso;
+
+import java.io.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJOs to HTTP responses as Java {@link ObjectOutputStream ObjectOutputStreams}.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>application/x-java-serialized-object</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>application/x-java-serialized-object</code>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("application/x-java-serialized-object")
+public final class JavaSerializedObjectSerializer extends OutputStreamSerializer {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* OutputStreamSerializer */
+	protected void doSerialize(Object o, OutputStream out, SerializerContext ctx) throws IOException, SerializeException {
+		ObjectOutputStream oos = new ObjectOutputStream(out);
+		oos.writeObject(o);
+		oos.flush();
+		oos.close();
+	}
+
+	@Override /* Serializer */
+	public JavaSerializedObjectSerializer clone() {
+		try {
+			return (JavaSerializedObjectSerializer)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}


[23/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.java
new file mode 100755
index 0000000..afddef1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Used to convert non-serializable objects to a serializable form.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	<code>PojoFilters</code> are used to extend the functionality of the serializers and parsers to be able to handle POJOs
+ * 	that aren't automatically handled by the serializers or parsers.  For example, JSON does not have a standard
+ * 	representation for rendering dates.  By defining a special {@code Date} filter and associating it with a serializer and
+ * 	parser, you can convert a {@code Date} object to a {@code String} during serialization, and convert that {@code String} object back into
+ * 	a {@code Date} object during parsing.
+ * <p>
+ * 	Object filters MUST declare a public no-arg constructor so that the bean context can instantiate them.
+ * <p>
+ * 	<code>PojoFilters</code> are associated with instances of {@link BeanContext BeanContexts} by passing the filter class to
+ * 	the {@link BeanContextFactory#addFilters(Class...)} method.<br>
+ * 	When associated with a bean context, fields of the specified type will automatically be converted when the
+ * 	{@link BeanMap#get(Object)} or {@link BeanMap#put(String, Object)} methods are called.<br>
+ * <p>
+ * 	<code>PojoFilters</code> have two parameters:
+ * 	<ol>
+ * 		<li>{@code <F>} - The filtered representation of an object.
+ * 		<li>{@code <T>} - The normal representation of an object.
+ * 	</ol>
+ * 	<br>
+ * 	{@link Serializer Serializers} use object filters to convert objects of type T into objects of type F, and on calls to {@link BeanMap#get(Object)}.<br>
+ * 	{@link Parser Parsers} use object filters to convert objects of type F into objects of type T, and on calls to {@link BeanMap#put(String,Object)}.
+ *
+ *
+ * <h6 class='topic'>Filtered Class Type {@code <F>}</h6>
+ * <p>
+ * 	The filtered object representation of an object must be an object type that the serializers can
+ * 	natively convert to JSON (or language-specific equivalent).  The list of valid filtered types are as follows...
+ * 	<ul>
+ * 		<li>{@link String}
+ * 		<li>{@link Number}
+ * 		<li>{@link Boolean}
+ * 		<li>{@link Collection} containing anything on this list.
+ * 		<li>{@link Map} containing anything on this list.
+ * 		<li>A java bean with properties of anything on this list.
+ * 		<li>An array of anything on this list.
+ * 	</ul>
+ *
+ *
+ * <h6 class='topic'>Normal Class Type {@code <T>}</h6>
+ * <p>
+ * 	The normal object representation of an object.<br>
+ *
+ *
+ * <h6 class='topic'>One-way vs. Two-way Serialization</h6>
+ * <p>
+ * 	Note that while there is a unified interface for handling filtering during both serialization and parsing,
+ * 	in many cases only one of the {@link #filter(Object)} or {@link #unfilter(Object, ClassMeta)} methods will be defined
+ * 	because the filter is one-way.  For example, a filter may be defined to convert an {@code Iterator} to a {@code ObjectList}, but
+ * 	it's not possible to unfilter an {@code Iterator}.  In that case, the {@code generalize(Object}} method would
+ * 	be implemented, but the {@code narrow(ObjectMap)} object would not, and the filter would be associated on
+ * 	the serializer, but not the parser.  Also, you may choose to serialize objects like {@code Dates} to readable {@code Strings},
+ * 	in which case it's not possible to reparse it back into a {@code Date}, since there is no way for the {@code Parser} to
+ * 	know it's a {@code Date} from just the JSON or XML text.
+ *
+ *
+ * <h6 class='topic'>Additional information</h6>
+ * 	See {@link com.ibm.juno.core.filter} for more information.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The normal form of the class.
+ * @param <F> The filtered form of the class.
+ */
+public abstract class PojoFilter<T,F> extends Filter {
+
+	/** Represents no filter. */
+	public static class NULL extends PojoFilter<Object,Object> {}
+
+	Class<T> normalClass;
+	Class<F> filteredClass;
+	ClassMeta<F> filteredClassMeta;
+
+	/**
+	 * Constructor.
+	 */
+	@SuppressWarnings("unchecked")
+	protected PojoFilter() {
+		super();
+
+		Class<?> c = this.getClass().getSuperclass();
+		Type t = this.getClass().getGenericSuperclass();
+		while (c != PojoFilter.class) {
+			t = c.getGenericSuperclass();
+			c = c.getSuperclass();
+		}
+
+		// Attempt to determine the T and G classes using reflection.
+		if (t instanceof ParameterizedType) {
+			ParameterizedType pt = (ParameterizedType)t;
+			Type[] pta = pt.getActualTypeArguments();
+			if (pta.length == 2) {
+				Type nType = pta[0];
+				if (nType instanceof Class) {
+					this.normalClass = (Class<T>)nType;
+
+				// <byte[],x> ends up containing a GenericArrayType, so it has to
+				// be handled as a special case.
+				} else if (nType instanceof GenericArrayType) {
+					Class<?> cmpntType = (Class<?>)((GenericArrayType)nType).getGenericComponentType();
+					this.normalClass = (Class<T>)Array.newInstance(cmpntType, 0).getClass();
+
+				// <Class<?>,x> ends up containing a ParameterizedType, so just use the raw type.
+				} else if (nType instanceof ParameterizedType) {
+					this.normalClass = (Class<T>)((ParameterizedType)nType).getRawType();
+
+				} else
+					throw new RuntimeException("Unsupported parameter type: " + nType);
+				if (pta[1] instanceof Class)
+					this.filteredClass = (Class<F>)pta[1];
+				else if (pta[1] instanceof ParameterizedType)
+					this.filteredClass = (Class<F>)((ParameterizedType)pta[1]).getRawType();
+				else
+					throw new RuntimeException("Unexpected filtered class type: " + pta[1].getClass().getName());
+			}
+		}
+	}
+
+	/**
+	 * Constructor for when the normal and filtered classes are already known.
+	 *
+	 * @param normalClass The normal class (cannot be serialized).
+	 * @param filteredClass The filtered class (serializable).
+	 */
+	protected PojoFilter(Class<T> normalClass, Class<F> filteredClass) {
+		this.normalClass = normalClass;
+		this.filteredClass = filteredClass;
+	}
+
+	/**
+	 * If this filter is to be used to serialize non-serializable POJOs, it must implement this method.
+	 * <p>
+	 * 	The object must be converted into one of the following serializable types:
+	 * 	<ul>
+	 * 		<li>{@link String}
+	 * 		<li>{@link Number}
+	 * 		<li>{@link Boolean}
+	 * 		<li>{@link Collection} containing anything on this list.
+	 * 		<li>{@link Map} containing anything on this list.
+	 * 		<li>A java bean with properties of anything on this list.
+	 * 		<li>An array of anything on this list.
+	 * 	</ul>
+	 *
+	 * @param o The object to be filtered.
+	 * @return The filtered object.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public F filter(T o) throws SerializeException {
+		throw new SerializeException("Generalize method not implemented on filter ''{0}''", this.getClass().getName());
+	}
+
+	/**
+	 * If this filter is to be used to reconstitute POJOs that aren't true Java beans, it must implement this method.
+	 *
+	 * @param f The filtered object.
+	 * @param hint If possible, the parser will try to tell you the object type being created.  For example,
+	 * 	on a serialized date, this may tell you that the object being created must be of type {@code GregorianCalendar}.<br>
+	 * 	This may be <jk>null</jk> if the parser cannot make this determination.
+	 * @return The narrowed object.
+	 * @throws ParseException If this method is not implemented.
+	 */
+	public T unfilter(F f, ClassMeta<?> hint) throws ParseException {
+		throw new ParseException("Narrow method not implemented on filter ''{0}''", this.getClass().getName());
+	}
+
+	/**
+	 * Returns the T class, the normalized form of the class.
+	 *
+	 * @return The normal form of this class.
+	 */
+	public Class<T> getNormalClass() {
+		return normalClass;
+	}
+
+	/**
+	 * Returns the G class, the generialized form of the class.
+	 * <p>
+	 * 	Subclasses must override this method if the generialized class is {@code Object},
+	 * 	meaning it can produce multiple generialized forms.
+	 *
+	 * @return The filtered form of this class.
+	 */
+	public Class<F> getFilteredClass() {
+		return filteredClass;
+	}
+
+	/**
+	 * Returns the {@link ClassMeta} of the filtered class type.
+	 * This value is cached for quick lookup.
+	 *
+	 * @return The {@link ClassMeta} of the filtered class type.
+	 */
+	public ClassMeta<F> getFilteredClassMeta() {
+		if (filteredClassMeta == null)
+			filteredClassMeta = beanContext.getClassMeta(filteredClass);
+		return filteredClassMeta;
+	}
+
+	/**
+	 * Checks if the specified object is an instance of the normal class defined on this filter.
+	 *
+	 * @param o The object to check.
+	 * @return <jk>true</jk> if the specified object is a subclass of the normal class defined on this filter.
+	 * <jk>null</jk> always return <jk>false</jk>.
+	 */
+	public boolean isNormalObject(Object o) {
+		if (o == null)
+			return false;
+		return ClassUtils.isParentClass(normalClass, o.getClass());
+	}
+
+	/**
+	 * Checks if the specified object is an instance of the filtered class defined on this filter.
+	 *
+	 * @param o The object to check.
+	 * @return <jk>true</jk> if the specified object is a subclass of the filtered class defined on this filter.
+	 * <jk>null</jk> always return <jk>false</jk>.
+	 */
+	public boolean isFilteredObject(Object o) {
+		if (o == null)
+			return false;
+		return ClassUtils.isParentClass(filteredClass, o.getClass());
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Filter */
+	public Class<?> forClass() {
+		return normalClass;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return getClass().getSimpleName() + '<' + getNormalClass().getSimpleName() + "," + getFilteredClass().getSimpleName() + '>';
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.class
new file mode 100755
index 0000000..20cf6e9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.java
new file mode 100755
index 0000000..52faf3d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/SurrogateFilter.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+
+
+/**
+ * Specialized {@link PojoFilter} for surrogate classes.
+ * <p>
+ * Surrogate classes are used in place of other classes during serialization.
+ * For example, you may want to use a surrogate class to change the names or order of bean
+ * properties on a bean.
+ * <p>
+ * The following is an example of a surrogate class change changes a property name:
+ * <p class='bcode'>
+ * 	<jk>public class</jk> SurrogateClass {
+ * 		<jk>public</jk> String surrogateField;  <jc>// New bean property</jc>
+ *
+ * 		<jk>public</jk> SurrogateClass(NormalClass normalClass) {
+ * 			<jk>this</jk>.surrogateField = normalClass.normalField;
+ * 		}
+ * 	}
+ * </p>
+ * <p>
+ * Optionally, a public static method can be used to unfilter a class during parsing:
+ * <p class='bcode'>
+ * 	<jk>public class</jk> SurrogateClass {
+ * 		...
+ * 		<jk>public static</jk> NormalClass <jsm>toNormalClass</jsm>(SurrogateClass surrogateClass) {
+ * 			<jk>return new</jk> NormalClass(surrogateClass.filteredField);
+ * 		}
+ * 	}
+ * </p>
+ * <p>
+ * Surrogate classes must conform to the following:
+ * <ul>
+ * 	<li>It must have a one or more public constructors that take in a single parameter whose type is the normal types.
+ * 		(It is possible to define a class as a surrogate for multiple class types by using multiple constructors with
+ * 		different parameter types).
+ * 	<li>It optionally can have a public static method that takes in a single parameter whose type is the filtered type
+ * 		and returns an instance of the normal type.  This is called the unfilter method.  The method can be called anything.
+ * 	<li>If an unfilter method is present, the class must also contain a no-arg constructor (so that the filtered class
+ * 		can be instantiated by the parser before being converted into the normal class by the unfilter method).
+ * </ul>
+ * <p>
+ * Surrogate classes are associated with serializers and parsers using the {@link CoreApi#addFilters(Class...)} method.
+ * <p class='bcode'>
+ * 	<ja>@Test</ja>
+ * 	<jk>public void</jk> test() <jk>throws</jk> Exception {
+ * 		JsonSerializer s = <jk>new</jk> JsonSerializer.Simple().addFilters(Surrogate.<jk>class</jk>);
+ * 		JsonParser p = <jk>new</jk> JsonParser().addFilters(Surrogate.<jk>class</jk>);
+ * 		String r;
+ * 		Normal n = Normal.<jsm>create</jsm>();
+ *
+ * 		r = s.serialize(n);
+ * 		assertEquals(<js>"{f2:'f1'}"</js>, r);
+ *
+ * 		n = p.parse(r, Normal.<jk>class</jk>);
+ * 		assertEquals(<js>"f1"</js>, n.f1);
+ * 	}
+ *
+ * 	<jc>// The normal class</jc>
+ * 	<jk>public class</jk> Normal {
+ * 		<jk>public</jk> String f1;
+ *
+ * 		<jk>public static</jk> Normal <jsm>create</jsm>() {
+ * 			Normal n = <jk>new</jk> Normal();
+ * 			n.f1 = <js>"f1"</js>;
+ * 			<jk>return</jk> n;
+ * 		}
+ * 	}
+ *
+ * 	<jc>// The surrogate class</jc>
+ * 	<jk>public static class</jk> Surrogate {
+ * 		<jk>public</jk> String f2;
+ *
+ * 		<jc>// Surrogate constructor</jc>
+ * 		<jk>public</jk> Surrogate(Normal n) {
+ * 			f2 = n.f1;
+ * 		}
+ *
+ * 		<jc>// Constructor used during parsing (only needed if unfilter method specified)</jc>
+ * 		<jk>public</jk> Surrogate() {}
+ *
+ * 		<jc>// Unfilter method (optional)</jc>
+ * 		<jk>public static</jk> Normal <jsm>toNormal</jsm>(Surrogate f) {
+ * 			Normal n = <jk>new</jk> Normal();
+ * 			n.f1 = f.f2;
+ * 			<jk>return</jk> n;
+ * 		}
+ * 	}
+ * </p>
+ * <p>
+ * It should be noted that a surrogate class is functionally equivalent to the following {@link PojoFilter} implementation:
+ * <p class='bcode'>
+ * 	<jk>public static class</jk> SurrogateFilter <jk>extends</jk> PojoFilter&lt;Normal,Surrogate&gt; {
+ * 		<jk>public</jk> Surrogate filter(Normal n) <jk>throws</jk> SerializeException {
+ * 			<jk>return new</jk> Surrogate(n);
+ * 		}
+ * 		<jk>public</jk> Normal unfilter(Surrogate s, ClassMeta<?> hint) <jk>throws</jk> ParseException {
+ * 			<jk>return</jk> Surrogate.<jsm>toNormal</jsm>(s);
+ * 		}
+ * 	}
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type that this filter applies to.
+ * @param <F> The filtered class type.
+ */
+public class SurrogateFilter<T,F> extends PojoFilter<T,F> {
+
+	private Constructor<F> constructor;   // public F(T t);
+	private Method unfilterMethod;        // public static T valueOf(F f);
+
+	/**
+	 * Constructor.
+	 *
+	 * @param forClass The normal class.
+	 * @param constructor The constructor on the surrogate class that takes the normal class as a parameter.
+	 * @param unfilterMethod The static method that converts surrogate objects into normal objects.
+	 */
+	protected SurrogateFilter(Class<T> forClass, Constructor<F> constructor, Method unfilterMethod) {
+		super(forClass, constructor.getDeclaringClass());
+		this.constructor = constructor;
+		this.unfilterMethod = unfilterMethod;
+	}
+
+	/**
+	 * Given the specified surrogate class, return the list of POJO filters.
+	 * A filter is returned for each public 1-arg constructor found.
+	 * Returns an empty list if no public 1-arg constructors are found.
+	 *
+	 * @param c The surrogate class.
+	 * @return The list of POJO filters that apply to this class.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public static List<SurrogateFilter<?,?>> findFilters(Class<?> c) {
+		List<SurrogateFilter<?,?>> l = new LinkedList<SurrogateFilter<?,?>>();
+		for (Constructor<?> cc : c.getConstructors()) {
+			if (cc.getAnnotation(BeanIgnore.class) == null) {
+				Class<?>[] pt = cc.getParameterTypes();
+
+				// Only constructors with one parameter.
+				// Ignore instance class constructors.
+				if (pt.length == 1 && pt[0] != c.getDeclaringClass()) {
+					int mod = cc.getModifiers();
+					if (Modifier.isPublic(mod)) {  // Only public constructors.
+
+						// Find the unfilter method if there is one.
+						Method unfilterMethod = null;
+						for (Method m : c.getMethods()) {
+							if (pt[0].equals(m.getReturnType())) {
+								Class<?>[] mpt = m.getParameterTypes();
+								if (mpt.length == 1 && mpt[0].equals(c)) { // Only methods with one parameter and where the return type matches this class.
+									int mod2 = m.getModifiers();
+									if (Modifier.isPublic(mod2) && Modifier.isStatic(mod2))  // Only public static methods.
+										unfilterMethod = m;
+								}
+							}
+						}
+
+						l.add(new SurrogateFilter(pt[0], cc, unfilterMethod));
+					}
+				}
+			}
+		}
+		return l;
+	}
+
+	@Override /* PojoFilter */
+	public F filter(T o) throws SerializeException {
+		try {
+			return constructor.newInstance(o);
+		} catch (Exception e) {
+			throw new SerializeException(e);
+		}
+	}
+
+	@Override /* PojoFilter */
+	@SuppressWarnings("unchecked")
+	public T unfilter(F f, ClassMeta<?> hint) throws ParseException {
+		if (unfilterMethod == null)
+			throw new ParseException("static valueOf({0}) method not implement on surrogate class ''{1}''", f.getClass().getName(), getNormalClass().getName());
+		try {
+			return (T)unfilterMethod.invoke(null, f);
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.dnx
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.dnx b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.dnx
new file mode 100755
index 0000000..72c091b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.dnx
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--xtools2_universal_type_manager-->
+<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.mmi.ui.signatures.diagram" version="7.0.0"><feature description="" name="Rational Modeling Platform (com.ibm.xtools.rmp)" url="" version="7.0.0"/></signature>?>
+<umlnotation:UMLDiagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:uml="http://www.eclipse.org/uml2/3.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.3/Umlnotation" xmi:id="_14FVwJJREeKbSvxwiT0Fog" type="Class" name="classes.dnx">
+  <eAnnotations xmi:id="_14FVwZJREeKbSvxwiT0Fog" source="com.ibm.xtools.common.ui.reduction.editingCapabilities">
+    <details xmi:id="_14FVwpJREeKbSvxwiT0Fog" key="com.ibm.xtools.viz.java.webservice.capability" value="1"/>
+    <details xmi:id="_14FVw5JREeKbSvxwiT0Fog" key="com.ibm.xtools.activities.javaVisualizerActivity" value="1"/>
+  </eAnnotations>
+  <children xmi:type="umlnotation:UMLShape" xmi:id="_3ZQ0oJJREeKbSvxwiT0Fog" fontName="Segoe UI" fontHeight="8" showListSignature="true" fillColor="14286847" transparency="0" lineColor="3394764" lineWidth="1" roundedBendpointsRadius="4">
+    <children xmi:type="notation:DecorationNode" xmi:id="_3ZSCwJJREeKbSvxwiT0Fog" type="ImageCompartment">
+      <layoutConstraint xmi:type="notation:Size" xmi:id="_3ZSCwZJREeKbSvxwiT0Fog" width="1320" height="1320"/>
+    </children>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_3ZSCwpJREeKbSvxwiT0Fog" type="Stereotype"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_3ZSp0JJREeKbSvxwiT0Fog" type="Name"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_3ZSp0ZJREeKbSvxwiT0Fog" type="Parent"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_3ZSp0pJREeKbSvxwiT0Fog" visible="false" type="ANNOTATION_COMPARTMENT"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_3ZSp05JREeKbSvxwiT0Fog" visible="false" type="ANNOTATED_ATTRIBUTE_COMPARTMENT"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_3ZTQ4JJREeKbSvxwiT0Fog" visible="false" type="ANNOTATED_OPERATION_COMPARTMENT" filtering="Manual">
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=Filter%5Esign=(QClass%3C*%3E;Z)V%5Bjsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=forClass%5Esign=()QClass%3C*%3E;%5Bjsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=isBeanFilter%5Esign=()Z%5Bjsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+    </children>
+    <element xmi:type="uml:Class" href="mmi:///#jsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D$uml.Class"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3ZQ0oZJREeKbSvxwiT0Fog" x="9193" y="3170"/>
+  </children>
+  <children xmi:type="umlnotation:UMLShape" xmi:id="_64c4UJJREeKbSvxwiT0Fog" fontName="Segoe UI" fontHeight="8" showListSignature="true" fillColor="14286847" transparency="0" lineColor="3394764" lineWidth="1" roundedBendpointsRadius="4">
+    <children xmi:type="notation:DecorationNode" xmi:id="_64dfYJJREeKbSvxwiT0Fog" type="ImageCompartment">
+      <layoutConstraint xmi:type="notation:Size" xmi:id="_64dfYZJREeKbSvxwiT0Fog" width="1320" height="1320"/>
+    </children>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_64dfYpJREeKbSvxwiT0Fog" type="Stereotype"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_64dfY5JREeKbSvxwiT0Fog" type="Name"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_64dfZJJREeKbSvxwiT0Fog" type="Parent"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_64eGcJJREeKbSvxwiT0Fog" visible="false" type="ANNOTATION_COMPARTMENT"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_64eGcZJREeKbSvxwiT0Fog" visible="false" type="ANNOTATED_ATTRIBUTE_COMPARTMENT" collapsed="true" filtering="Manual">
+      <filteredObjects xmi:type="uml:Property" href="mmi:///#jfield%5Ename=normalClass%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Property"/>
+      <filteredObjects xmi:type="uml:Property" href="mmi:///#jfield%5Ename=filteredClass%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Property"/>
+    </children>
+    <children xmi:type="notation:ListCompartment" xmi:id="_64eGcpJREeKbSvxwiT0Fog" type="ANNOTATED_OPERATION_COMPARTMENT" filtering="Manual">
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=PojoFilter%5Esign=()V%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=forClass%5Esign=()QClass%3C*%3E;%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=getNormalClass%5Esign=()QClass%3CQT;%3E;%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=getFilteredClass%5Esign=()QClass%3CQF;%3E;%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=toString%5Esign=()QString;%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+    </children>
+    <children xmi:type="notation:SemanticListCompartment" xmi:id="_64hJwJJREeKbSvxwiT0Fog" visible="false" type="TemplateCompartment">
+      <element xmi:type="uml:RedefinableTemplateSignature" href="mmi:///#jtsig%5Ename=PojoFilter%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.RedefinableTemplateSignature"/>
+    </children>
+    <element xmi:type="uml:Class" href="mmi:///#jsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D$uml.Class"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_64c4UZJREeKbSvxwiT0Fog" x="11095" y="6974"/>
+  </children>
+  <children xmi:type="umlnotation:UMLShape" xmi:id="_aiL3oJJ9EeKbSvxwiT0Fog" fontName="Segoe UI" fontHeight="8" fillColor="14286847" transparency="0" lineColor="3394764" lineWidth="1" roundedBendpointsRadius="4">
+    <children xmi:type="notation:DecorationNode" xmi:id="_aiMesJJ9EeKbSvxwiT0Fog" type="ImageCompartment">
+      <layoutConstraint xmi:type="notation:Size" xmi:id="_aiMesZJ9EeKbSvxwiT0Fog" width="1320" height="1320"/>
+    </children>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_aiMespJ9EeKbSvxwiT0Fog" type="Stereotype"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_aiMes5J9EeKbSvxwiT0Fog" type="Name"/>
+    <children xmi:type="notation:BasicDecorationNode" xmi:id="_aiNFwJJ9EeKbSvxwiT0Fog" type="Parent"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_aiNFwZJ9EeKbSvxwiT0Fog" visible="false" type="ANNOTATION_COMPARTMENT"/>
+    <children xmi:type="notation:ListCompartment" xmi:id="_aiNFwpJ9EeKbSvxwiT0Fog" visible="false" type="ANNOTATED_ATTRIBUTE_COMPARTMENT" filtering="Manual">
+      <filteredObjects xmi:type="uml:Property" href="mmi:///#jfield%5Ename=properties%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Property"/>
+      <filteredObjects xmi:type="uml:Property" href="mmi:///#jfield%5Ename=excludeProperties%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Property"/>
+    </children>
+    <children xmi:type="notation:ListCompartment" xmi:id="_aiNFw5J9EeKbSvxwiT0Fog" type="ANNOTATED_OPERATION_COMPARTMENT" filtering="Manual">
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=BeanFilter%5Esign=()V%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=BeanFilter%5Esign=(QClass%3CQT;%3E;)V%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setProperties%5Esign=(%255bQString;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setExcludeProperties%5Esign=(%255bQString;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setPropertyNamer%5Esign=(QClass%3C+QPropertyNamer;%3E;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setSubTypeProperty%5Esign=(QString;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setSubTypes%5Esign=(QLinkedHashMap%3CQClass%3C*%3E;QString;%3E;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=addSubType%5Esign=(QClass%3C*%3E;QString;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+      <filteredObjects xmi:type="uml:Operation" href="mmi:///#jmethod%5Ename=setInterfaceClass%5Esign=(QClass%3C*%3E;)QBeanFilter%3CQT;%3E;%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Operation"/>
+    </children>
+    <children xmi:type="notation:SemanticListCompartment" xmi:id="_aiRXMJJ9EeKbSvxwiT0Fog" visible="false" type="TemplateCompartment">
+      <element xmi:type="uml:RedefinableTemplateSignature" href="mmi:///#jtsig%5Ename=BeanFilter%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.RedefinableTemplateSignature"/>
+    </children>
+    <element xmi:type="uml:Class" href="mmi:///#jsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D$uml.Class"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aiL3oZJ9EeKbSvxwiT0Fog" x="4755" y="6023"/>
+  </children>
+  <element xsi:nil="true"/>
+  <edges xmi:type="umlnotation:UMLConnector" xmi:id="_681pEJJREeKbSvxwiT0Fog" source="_64c4UJJREeKbSvxwiT0Fog" target="_3ZQ0oJJREeKbSvxwiT0Fog" fontName="Segoe UI" fontHeight="8" roundedBendpointsRadius="4" routing="Rectilinear" lineColor="8421504" lineWidth="1" showStereotype="Text">
+    <children xmi:type="notation:DecorationNode" xmi:id="_682QIJJREeKbSvxwiT0Fog" type="NameLabel">
+      <children xmi:type="notation:BasicDecorationNode" xmi:id="_682QIpJREeKbSvxwiT0Fog" type="Stereotype"/>
+      <children xmi:type="notation:BasicDecorationNode" xmi:id="_682QI5JREeKbSvxwiT0Fog" type="Name"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_682QIZJREeKbSvxwiT0Fog" y="-186"/>
+    </children>
+    <element xmi:type="uml:Generalization" href="mmi:///#jgen%5Bjsrctype%5Ename=PojoFilter%5Bjcu%5Ename=PojoFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D%5Bjsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Generalization"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_681pEZJREeKbSvxwiT0Fog" points="[-1858, -950, 1012, 1758]$[-1858, -1283, 1012, 1425]$[-2510, -1283, 360, 1425]$[-2510, -2247, 360, 461]"/>
+  </edges>
+  <edges xmi:type="umlnotation:UMLConnector" xmi:id="_ani4wJJ9EeKbSvxwiT0Fog" source="_aiL3oJJ9EeKbSvxwiT0Fog" target="_3ZQ0oJJREeKbSvxwiT0Fog" fontName="Segoe UI" fontHeight="8" roundedBendpointsRadius="4" routing="Rectilinear" lineColor="8421504" lineWidth="1" showStereotype="Text">
+    <children xmi:type="notation:DecorationNode" xmi:id="_anjf0JJ9EeKbSvxwiT0Fog" type="NameLabel">
+      <children xmi:type="notation:BasicDecorationNode" xmi:id="_anjf0pJ9EeKbSvxwiT0Fog" type="Stereotype"/>
+      <children xmi:type="notation:BasicDecorationNode" xmi:id="_anjf05J9EeKbSvxwiT0Fog" type="Name"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_anjf0ZJ9EeKbSvxwiT0Fog" y="-186"/>
+    </children>
+    <element xmi:type="uml:Generalization" href="mmi:///#jgen%5Bjsrctype%5Ename=BeanFilter%5Bjcu%5Ename=BeanFilter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D%5Bjsrctype%5Ename=Filter%5Bjcu%5Ename=Filter.java%5Bjpack%5Ename=com.ibm.juno.core.filter%5Bjsrcroot%5Esrcfolder=src%5Bproject%5Eid=com.ibm.juno%5D%5D%5D%5D%5D$uml.Generalization"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ani4wZJ9EeKbSvxwiT0Fog" points="[1044, -950, -2481, 1758]$[1044, -1283, -2481, 1425]$[2925, -1283, -600, 1425]$[2925, -2247, -600, 461]"/>
+  </edges>
+</umlnotation:UMLDiagram>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.png
new file mode 100755
index 0000000..0a2ef0d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/doc-files/classes.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/package.html
new file mode 100755
index 0000000..60ca7d2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/package.html
@@ -0,0 +1,764 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Filter API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Filters'>Filters</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#BeanFilters'>BeanFilter Class</a></p>
+		<li><p><a class='doclink' href='#PojoFilters'>PojoFilter Class</a></p>
+		<li><p><a class='doclink' href='#PojoFilters_OneWay'>One-Way PojoFilters</a></p>
+		<li><p><a class='doclink' href='#StopClasses'>Stop Classes</a></p>
+		<li><p><a class='doclink' href='#SurrogateClasses'>Surrogate Classes</a></p>
+		<li><p><a class='doclink' href='#ToObjectMaps'>Serializing to ObjectMaps</a></p>
+	</ol>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Filters"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Filters</h2>
+<div class='topic'>
+	<p>
+		By default, the Juno framework can serialize and parse a wide variety of POJOs out-of-the-box.  
+		However, a <code>Filter</code> API is provided to tailor how certain Java objects are handled by the framework.
+		The class hierarchy is shown here:
+	</p>
+	<ul class='spaced-list'>
+		<li>{@link com.ibm.juno.core.filter.Filter} - Top-level interface for all filters.
+	<ul>
+		<li>{@link com.ibm.juno.core.filter.BeanFilter} - Filters that alter the way beans are handled.
+		<li>{@link com.ibm.juno.core.filter.PojoFilter} - Filters that transform non-serializable POJOs into serializable POJOs during serialization 
+			(and optionally vis-versa during parsing).
+		</ul>
+	</ul>
+	<p>
+		Filters are added to serializers and parsers in a variety of ways:
+	</p> 
+	<ul>
+		<li>{@link com.ibm.juno.core.serializer.Serializer#addFilters(Class[])} - On serializers.
+		<li>{@link com.ibm.juno.core.serializer.SerializerGroup#addFilters(Class[])} - On groups of serializers.
+		<li>{@link com.ibm.juno.core.parser.Parser#addFilters(Class[])} - On parsers.
+		<li>{@link com.ibm.juno.core.parser.ParserGroup#addFilters(Class[])} - On groups of parsers.
+		<li>{@link com.ibm.juno.client.RestClient#addFilters(Class[])} - On the serializer and parser registered on a REST client.
+		<li>{@link com.ibm.juno.server.annotation.RestResource#filters() @RestResource.filters()} - On all serializers and parsers defined on a REST servlet.
+		<li>{@link com.ibm.juno.server.annotation.RestMethod#filters() @RestMethod.filters()} - On all serializers and parsers defined on a method in a REST servlet.
+		<li>{@link com.ibm.juno.server.jaxrs.JunoProvider#filters()} - On all serializers and parsers defined on a JAX-RS provider.
+	</ul>
+	<p>
+		Filters (typically <code>PojoFilters</code>) can also be associated with classes through the {@link com.ibm.juno.core.annotation.Filter @Filter} annotation. 
+	</p>
+		
+	<!-- ======================================================================================================== -->
+	<a id="BeanFilters"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - BeanFilter Class</h3>
+	<div class='topic'>
+		<p>
+			Bean filters are used to tailor how Juno handles bean classes.
+			They can be used for the following purposes:
+		</p>
+		<ul>
+			<li>Include or exclude which properties are exposed in beans, or the order those properties are serialized.
+			<li>Define property-namers for customizing bean property names.
+			<li>Define bean subtypes.
+			<li>Define bean interface classes.
+		</ul>
+		<p>
+			It should be noted that the {@link com.ibm.juno.core.annotation.Bean @Bean} annotation provides equivalent functionality
+				through annotations.  
+			However, the <code>BeanFilter</code> class allows you to provide the same features when you do
+				not have access to the source code.
+		<p>
+		<h5 class='topic'>Examples</h5>
+
+		<h6 class='topic'>Explicitly specify which properties are visible on a bean class</h6>
+		<p class='bcode'>
+	<jc>// Define filter that orders properties by "age" then "name"</jc>
+	<jk>public class</jk> MyFilter <jk>extends</jk> BeanFilter&ltPerson&gt; {
+		<jk>public</jk> MyFilter() {
+			setProperties(<js>"age"</js>,<js>"name"</js>);
+		}
+	}
+	
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyFilter.<jk>class</jk>);
+	Person p = getPerson();
+	String json = s.serialize(p);  <jc>// Prints "{age:45,name:'John Smith'}"</jc>
+		</p>
+		<p>
+			Note that this is equivalent to specifying the following annotation on the bean class:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(properties={<js>"age"</js>,<js>"name"</js>})
+	<jk>public class</jk> Person {
+		...
+	}
+		</p>
+
+		<h6 class='topic'>Exclude which properties are visible on a bean class</h6>
+		<p class='bcode'>
+	<jc>// Define filter that excludes "name"</jc>
+	<jk>public class</jk> MyFilter <jk>extends</jk> BeanFilter&ltPerson&gt; {
+		<jk>public</jk> MyFilter() {
+			setExcludeProperties(<js>"name"</js>);
+		}
+	}
+	
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyFilter.<jk>class</jk>);
+	Person p = getPerson();
+	String json = s.serialize(p);  <jc>// Prints "{age:45}"</jc>
+		</p>
+		<p>
+			Note that this is equivalent to specifying the following annotation on the bean class:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(excludeProperties={<js>"name"</js>})
+	<jk>public class</jk> Person {
+		...
+	}
+		</p>
+
+		<h6 class='topic'>Define specialized property namers</h6>
+		<p class='bcode'>
+	<jc>// Define filter with our own property namer.</jc>
+	<jk>public class</jk> MyFilter <jk>extends</jk> BeanFilter&ltPerson&gt; {
+		<jk>public</jk> MyFilter() {
+			setPropertyNamer(UpperCasePropertyNamer.<jk>class</jk>);
+		}
+	}
+
+	<jc>// Define property namer that upper-cases the property names</jc>	
+	<jk>public class</jk> UpperCasePropertyNamer <jk>implements</jk> PropertyNamer {
+	
+		<ja>@Override</ja>
+		<jk>public</jk> String getPropertyName(String name) {
+			<jk>return</jk> name.toUpperCase();
+		}
+	}
+	
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyFilter.<jk>class</jk>);
+	Person person = getPerson();
+	String json = s.serialize(p);  <jc>// Prints "{AGE:45,NAME:'John Smith'}"</jc>
+	
+	<jc>// Parse back into bean</jc>
+	ReaderParser p = <jk>new</jk> JsonParser().addFilters(MyFilter.<jk>class</jk>);
+	person = p.parse(json, Person.class); <jc>// Read back into original object</jc>
+		</p>
+		<p>
+			Note that this is equivalent to specifying the following annotation on the bean class:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(propertyNamer=UpperCasePropertyNamer.<jk>class</jk>)
+	<jk>public class</jk> Person {
+		...
+	}
+		</p>
+		
+		<h6 class='topic'>Define bean subtypes</h6>
+		<p>
+			Juno allows you to losslessly serialize and parse abstract class fields back into the original 
+				concrete objects by defining a subtype attribute and a list of subtypes/ids.
+		</p>
+		<p>
+			For example, let's define the following parent class with two subclasses:
+		</p>
+		<p class='bcode'>
+	<jc>// Abstract parent class</jc>
+	<jk>public abstract class</jk> MyClass {
+		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
+	}
+
+	<jc>// Subclass 1</jc>
+	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
+	}
+	
+	<jc>// Subclass 2</jc>
+	<jk>public class</jk> MyClassBaz <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>baz</jf>=<js>"baz"</js>;
+	}
+		</p>
+		<p>
+			Normally, when parsing a serialized <code>MyClass</code> object, the parser does not know what subtype to create.
+			This can be fixed by defining the following filter:
+		</p>		
+		<p class='bcode'>
+	<jc>// Define filter with our own property namer.</jc>
+	<jk>public class</jk> MyClassFilter <jk>extends</jk> BeanFilter&ltMyClass&gt; {
+		<jk>public</jk> MyClassFilter() {
+			setSubTypeProperty(<js>"subType"</js>);
+			addSubType(MyClassBar.<jk>class</jk>, <js>"BAR"</js>);
+			addSubType(MyClassBaz.<jk>class</jk>, <js>"BAZ"</js>);
+		}
+	}
+		</p>
+		<p>
+			When serialized, the serialized bean will include a <code>"subType"</code> attribute that identifies the subclass, and
+				allows it to be parsed back into the original subclass.
+		</p>
+		<p class='bcode'>
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyClassFilter.<jk>class</jk>);
+	MyClass c = <jk>new</jk> MyClassBar();
+	String json = s.serialize(p);  <jc>// Prints "{subType:'BAR',foo:'foo',bar:'bar'}"</jc>
+	
+	<jc>// Parse back into bean</jc>
+	ReaderParser p = <jk>new</jk> JsonParser().addFilters(MyClassFilter.<jk>class</jk>);
+	c = p.parse(json, MyClass.<jk>class</jk>); <jc>// c is an instance of MyClassBar</jc>
+		</p>	
+		<p>
+			It should be noted that the sub type attribute is always rendered first in the JSON object so 
+				that the bean object can be instantiated before the real properties are set on it during parsing.  
+			Beans with subtypes are thus 'lazy-instantiated' when the sub type attribute is set.
+			If the sub type attribute is not listed first, the parser will still be able to parse the input,
+			but with reduced efficiency since it must cache the incoming data until the bean can be instantiated.
+		</p>
+		<p>
+			Note that this filter is equivalent to specifying the following annotation on the bean class:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(
+		subTypeProperty=<js>"subType"</js>,
+		subTypes={
+			<ja>@BeanSubType</ja>(type=MyClassBar.<jk>class</jk>, id=<js>"BAR"</js>),
+			<ja>@BeanSubType</ja>(type=MyClassBaz.<jk>class</jk>, id=<js>"BAZ"</js>)
+		}
+	)
+	<jk>public abstract class</jk> MyClass {
+		...
+	}
+		</p>
+			
+		<h6 class='topic'>Limiting bean properties to parent bean classes</h6>
+		<p>
+			Occassionally, you may want to limit bean properties to some parent interface.
+			For example, in the <code>RequestEchoResource</code> class in the sample war file, we serialize instances of
+				<code>HttpServletRequest</code> and <code>HttpServletResponse</code>.
+			However, we really only want to serialize the properties defined on those specific APIs, not 
+				vendor-specific methods on the instances of those classes.
+			This can be done through the <code>interfaceClass</code> property of a bean filter.
+		</p>
+		<p>
+			For example, let's define the following parent class and subclass:
+		</p>
+		<p class='bcode'>
+	<jc>// Abstract parent class</jc>
+	<jk>public abstract class</jk> MyClass {
+		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
+	}
+
+	<jc>// Subclass 1</jc>
+	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
+	}
+		</p>
+		<p>
+			Suppose we only want to render the properties defined on <code>MyClass</code>, not those defined on child classes.
+			To do so, we can define the following filter:
+		</p>
+		<p class='bcode'>
+	<jc>// Define filter that limits properties to only those defined on MyClass</jc>
+	<jk>public class</jk> MyClassFilter <jk>extends</jk> BeanFilter&ltMyClass&gt; {
+		<jk>public</jk> MyClassFilter() {
+			setInterfaceClass(MyClass.<jk>class</jk>);
+		}
+	}
+		</p>
+		<p>
+			When serialized, the serialized bean will only include properties defined on the parent class.
+		</p>
+		<p class='bcode'>
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyClassFilter.<jk>class</jk>);
+	MyClass c = <jk>new</jk> MyClassBar();
+	String json = s.serialize(p);  <jc>// Prints "{foo:'foo'}"</jc>
+		</p>	
+		<p>
+			The equivalent can be done through an annotation on the parent class, which applies to all child classes:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(interfaceClass=MyClass.<jk>class</jk>)
+	<jk>public abstract class</jk> MyClass {
+		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
+	}
+		</p>
+		<p>
+			The annotation can also be applied on the individual child classes, like so...
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(interfaceClass=MyClass.<jk>class</jk>)
+	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
+	}
+		</p>
+		<p>
+			Also, the <code>addFilters(...)</code> methods will automatically interpret any non-<code>Filter</code> classes
+				passed in as meaning interface classes.  
+			So in the previous example, the <code>BeanFilter</code> class could have been avoided altogether by just 
+				passing in <code>MyClass.<jk>class</jk></code> to the serializer, like so:
+		</p>
+		<p class='bcode'>
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyClass.<jk>class</jk>);
+		</p>
+		<p>
+			In fact, this is the shortcut used in the <code>RequestEchoResource</code> sample class:
+		</p>
+		<p class='bcode'>
+	<ja>@RestResource</ja>(
+		filters={
+			<jc>// Interpret these as their parent classes, not subclasses</jc>
+			HttpServletRequest.<jk>class</jk>, HttpSession.<jk>class</jk>, ServletContext.<jk>class</jk>
+		}
+	)
+	<jk>public class</jk> RequestEchoResource <jk>extends</jk> RestServletDefault {
+		</p>
+		
+		<h6 class='topic'>Allowing non-public bean classes/methods/fields to be used by the framework</h6>
+		<p>
+			By default, only public classes are interpreted as beans.  Non-public classes are treated as 'other' POJOs that
+			are typically just serialized to strings using the <code>toString()</code> method.
+			Likewise, by default, only public fields/methods are interpreted as bean properties.
+		</p>
+		<p>
+			The following bean context properties can be used to allow non-public classes/methods/fields to be
+			used by the framework:
+		</p>
+		<ul>
+			<li>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanClassVisibility}
+			<li>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanConstructorVisibility}
+			<li>{@link com.ibm.juno.core.BeanContextProperties#BEAN_methodVisibility}
+			<li>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanFieldVisibility}
+		</ul>
+		<p>
+			Also, specifying a {@link com.ibm.juno.core.annotation.BeanProperty @BeanProperty} annotation on non-public getters/setters/fields
+				will also allow them to be detected by the framework.
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> MyBean {
+		<jc>// A bean property</jc>
+		<jk>public int</jk> f1;    
+		
+		<jc>// Not a bean property</jc>
+		<ja>@BeanIgnore</ja>
+		<jk>public int</jk> f2;     
+		
+		<jc>// A bean property</jc>
+		<ja>@BeanProperty</ja>    
+		<jk>protected int</jk> f3;  
+		
+		<jc>// A bean property</jc>
+		<ja>@BeanProperty</ja>    
+		<jk>private int</jk> getF3() {...}
+	}
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="PojoFilters"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - PojoFilter Class</h3>
+	<div class='topic'>
+		<p>
+			{@link com.ibm.juno.core.filter.PojoFilter PojoFilters} are a critical component of the Juno architecture.  
+			They allow the Juno serializers and parsers to be extended to handle virtually any kind of Java object. 
+		</p>
+		<p>
+			As explained in the overview, Juno has built-in support for serializing and parsing specific kinds of objects, like primitive objects, bean, maps, collections, and arrays.  
+			Other kinds of POJOs, such as {@code Date} objects, cannot be serialized properly, since they are not true beans.  
+			This is where <code>PojoFilters</code> come into play.
+		</p>
+		<p>
+			The purpose of an <code>PojoFilter</code> is to convert a non-serializable object to a serializable surrogate form during serialization, and to optionally convert that surrogate form back into the original object during parsing.
+		</p>
+		<p>
+			For example, the following filter can be used to convert {@link java.util.Date} objects to ISO8601 strings during serialization, and {@link java.util.Date} objects from ISO8601 string during parsing:
+		</p>
+		<p class='bcode'>
+	<jc>// Sample filter for converting Dates to ISO8601 strings.</jc>
+	<jk>public class</jk> MyDateFilter <jk>extends</jk> PojoFilter&lt;Date,String&gt; {
+		
+		<jc>// ISO8601 formatter.</jc>
+		<jk>private</jk> DateFormat <jf>format</jf> = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
+		
+		<jd>/** Converts a Date object to an ISO8601 string. */</jd>
+		<ja>@Override</ja>
+		<jk>public</jk> String filter(Date o) {
+			<jk>return</jk> <jf>format</jf>.format(o);
+		}
+		
+		<jd>/** Converts an ISO8601 string to a Date object. */</jd>
+		<ja>@Override</ja>
+		<jk>public</jk> Date unfilter(String o, ClassMeta&lt;?&gt; hint) <jk>throws</jk> ParseException {
+			<jk>try</jk> {
+				<jk>return</jk> <jf>format</jf>.parse(o);
+			} <jk>catch</jk> (java.text.ParseException e) {
+				<jk>throw new</jk> ParseException(e);
+			}
+		}
+	}
+		</p>
+		<p>
+			The filter above can then be associated with serializers and parsers as the following example shows:
+		</p>
+		<p class='bcode'>
+	<jc>// Sample bean with a Date field.</jc>
+	<jk>public class</jk> MyBean {
+		<jk>public</jk> Date <jf>date</jf> = <jk>new</jk> Date(112, 2, 3, 4, 5, 6);
+	}
+
+	<jc>// Create a new JSON serializer, associate our date filter with it, and serialize a sample bean.</jc>
+	Serializer serializer = <jk>new</jk> JsonSerializer().addFilters(MyDateFilter.<jk>class</jk>);
+	String json = serializer.serialize(<jk>new</jk> MyBean());	<jc>// == "{date:'2012-03-03T04:05:06-0500'}"</jc>
+	
+	<jc>// Create a JSON parser, associate our date filter with it, and reconstruct our bean (including the date).</jc>
+	ReaderParser parser = <jk>new</jk> JsonParser().addFilters(MyDateFilter.<jk>class</jk>);
+	MyBean bean = parser.parse(json, MyBean.<jk>class</jk>);
+	<jk>int</jk> day = bean.<jf>date</jf>.getDay(); 						<jc>// == 3</jc>
+		</p>
+		<p>
+			In addition, the {@link com.ibm.juno.core.BeanMap#get(Object)} and {@link com.ibm.juno.core.BeanMap#put(String,Object)} methods will automatically convert to filtered values as the following example shows:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a new bean context and add our filter.</jc>
+	BeanContext beanContext = <jk>new</jk> BeanContext().addFilters(MyDateFilter.<jk>class</jk>);
+
+	<jc>// Create a new bean.</jc>
+	MyBean myBean = <jk>new</jk> MyBean();
+
+	<jc>// Wrap it in a bean map.</jc>
+	BeanMap&lt;Bean&gt; beanMap = beanContext.forBean(myBean);
+
+	<jc>// Use the get() method to get the date field as an ISO8601 string.</jc>
+	String date = (String)beanMap.get(<js>"date"</js>);				<jc>// == "2012-03-03T04:05:06-0500"</jc> 
+	
+	<jc>// Use the put() method to set the date field to an ISO8601 string.</jc>
+	beanMap.put(<js>"date"</js>, <js>"2013-01-01T12:30:00-0500"</js>);	<jc>// Set it to a new value.</jc> 
+	
+	<jc>// Verify that the date changed on the original bean.</jc>
+	<jk>int</jk> year = myBean.<jf>date</jf>.getYear(); 								<jc>// == 113</jc>
+		</p>
+		<p>
+			Another example of a <code>PojoFilter</code> is one that converts <code><jk>byte</jk>[]</code> arrays to BASE64-encoded strings:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> ByteArrayBase64Filter <jk>extends</jk> PojoFilter&lt;<jk>byte</jk>[],String&gt; {
+	
+		<ja>@Override</ja>
+		<jk>public</jk> String filter(<jk>byte</jk>[] b) <jk>throws</jk> SerializeException {
+			<jk>try</jk> {
+				ByteArrayOutputStream baos = <jk>new</jk> ByteArrayOutputStream();
+				OutputStream b64os = MimeUtility.encode(baos, <js>"base64"</js>);
+				b64os.write(b);
+				b64os.close();
+				<jk>return new</jk> String(baos.toByteArray());
+			} <jk>catch</jk> (Exception e) {
+				<jk>throw new</jk> SerializeException(e);
+			}
+		}
+		
+		<ja>@Override</ja>
+		<jk>public byte</jk>[] unfilter(String s, ClassMeta&lt;?&gt; hint) <jk>throws</jk> ParseException {
+			<jk>try</jk> {
+				<jk>byte</jk>[] b = s.getBytes();
+				ByteArrayInputStream bais = <jk>new</jk> ByteArrayInputStream(b);
+				InputStream b64is = MimeUtility.decode(bais, <js>"base64"</js>);
+				<jk>byte</jk>[] tmp = <jk>new byte</jk>[b.length];
+				<jk>int</jk> n = b64is.read(tmp);
+				<jk>byte</jk>[] res = <jk>new byte</jk>[n];
+				System.<jsm>arraycopy</jsm>(tmp, 0, res, 0, n);
+				<jk>return</jk> res;
+			} <jk>catch</jk> (Exception e) {
+				<jk>throw new</jk> ParseException(e);
+			}
+		}
+	}
+		</p>
+		<p>
+			The following example shows the BASE64 filter in use:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a JSON serializer and register the BASE64 encoding filter with it.</jc>
+	Serializer serializer = <jk>new</jk> JsonSerializer().addFilters(ByteArrayBase64Filter.<jk>class</jk>);
+	ReaderParser parser = <jk>new</jk> JsonParser().addFilters(ByteArrayBase64Filter.<jk>class</jk>);
+	
+	<jk>byte</jk>[] a1 = {1,2,3};
+	String s1 = serializer.serialize(a1);		<jc>// Produces "'AQID'"</jc>
+	a1 = parser.parse(s1, <jk>byte</jk>[].<jk>class</jk>);		<jc>// Reproduces {1,2,3}</jc>
+	
+	<jk>byte</jk>[][] a2 = {{1,2,3},{4,5,6},<jk>null</jk>};
+	String s2 = serializer.serialize(a2);		<jc>// Produces "['AQID','BAUG',null]"</jc>
+	a2 = parser.parse(s2, <jk>byte</jk>[][].<jk>class</jk>);		<jc>// Reproduces {{1,2,3},{4,5,6},null}</jc>
+		</p>
+		<p>
+			It should be noted that the sample filters shown above have already been implemented in the {@link com.ibm.juno.core.filters} package.
+			The following are a list of out-of-the-box filters:
+		</p>
+		<ul>
+			<li>{@link com.ibm.juno.core.filters.ByteArrayBase64Filter} - Converts byte arrays to BASE64 encoded strings.
+			<li>{@link com.ibm.juno.core.filters.CalendarFilter} - Filters for converting <code>Calendar</code> objects to various date format strings.
+			<li>{@link com.ibm.juno.core.filters.DateFilter} - Filters for converting <code>Date</code> objects to various date format strings.
+			<li>{@link com.ibm.juno.core.filters.EnumerationFilter} - Filters for converting <code>Enumeration</code> objects to arrays.
+			<li>{@link com.ibm.juno.core.filters.IteratorFilter} - Filters for converting <code>Iterator</code> objects to arrays.
+			<li>{@link com.ibm.juno.core.filters.ReaderFilter} - Filters for converting <code>Readers</code> to objects before serialization.
+			<li>{@link com.ibm.juno.core.filters.XMLGregorianCalendarFilter} - Filters for converting <code>XMLGregorianCalendar</code> objects to ISO8601 strings.
+		</ul>
+		
+		<h6 class='topic'>Valid filtered class types</h6>
+		<p>
+			The filtered class type can be any serializable class type as defined in the <a href='../package-summary.html#PojoCategories'>POJO categories</a> table.
+		</p>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="PojoFilters_OneWay"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - One-Way PojoFilters</h3>
+	<div class='topic'>
+		<p>
+			In the previous section, we defined two-way filters, meaning filters where the original objects could be reconstructing during parsing.  However, there are certain kinds of POJOs that we may want to support for serializing, but that are not possible to reconstruct during parsing.  For these, we can use one-way object filters.
+		</p>
+		<p>
+			A one-way object filter is simply an object filter that only implements the {@code filter()} method.  The {@code unfilter()} method is simply left unimplemented.
+		</p>
+		<p>
+			An example of a one-way filter would be one that allows {@code Iterators} to be serialized as JSON arrays.  It can make sense to be able to render {@code Iterators} as arrays, but in general it's not possible to reconstruct an {@code Iterator} during parsing. 
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> IteratorFilter <jk>extends</jk> PojoFilter&lt;Iterator,List&gt; {
+		
+		<ja>@Override</ja>
+		<jk>public</jk> List filter(Iterator o) {
+			List l = <jk>new</jk> LinkedList();
+			<jk>while</jk> (o.hasNext())
+				l.add(o.next());
+			<jk>return</jk> l;
+		}
+	}
+		</p>
+		<p>
+			Here is an example of our one-way filter being used.  Note that trying to parse the original object will cause a {@link com.ibm.juno.core.parser.ParseException} to be thrown.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a JSON serializer that can serialize Iterators.</jc>
+	Serializer serializer = <jk>new</jk> JsonSerializer().addFilters(IteratorFilter.<jk>class</jk>);
+	
+	<jc>// Construct an iterator we want to serialize.</jc>
+	Iterator iterator = <jk>new</jk> ObjectList(1,2,3).iterator();
+	
+	<jc>// Serialize our Iterator</jc>
+	String s = serializer.serialize(iterator);		<jc>// Produces "[1,2,3]"</jc>
+	
+	<jc>// Try to parse it.</jc>
+	ReaderParser parser = <jk>new</jk> JsonParser().addFilters(IteratorFilter.<jk>class</jk>);
+	iterator = parser.parse(s, Iterator.<jk>class</jk>);		<jc>// Throws ParseException!!!</jc>
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="StopClasses"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.4 - Stop Classes</h3>
+	<div class='topic'>
+		<p>
+			Occassionally, you may want to limit bean properties to only those defined on a parent class or interface.  
+			There are a couple of ways of doing this.
+		</p>
+		<p>
+			For example, let's define the following parent class and subclass:
+		</p>
+		<p class='bcode'>
+	<jc>// Abstract parent class</jc>
+	<jk>public abstract class</jk> MyClass {
+		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
+	}
+
+	<jc>// Subclass 1</jc>
+	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
+	}
+		</p>
+		<p>
+			Suppose we only want to render the properties defined on <code>MyClass</code>, not those defined on child classes. 
+			To do so, we can define the following filter:
+		</p>
+		<p class='bcode'>
+	<jc>// Define filter that limits properties to only those defined on MyClass</jc>
+	<jk>public class</jk> MyClassFilter <jk>extends</jk> BeanFilter&ltMyClass&gt; {
+		<jk>public</jk> MyClassFilter() {
+			setInterfaceClass(MyClass.<jk>class</jk>);
+		}
+	}
+		</p>
+		<p>
+			When serialized, the serialized bean will only include properties defined on the parent class.
+		</p>
+		<p class='bcode'>
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyClassFilter.<jk>class</jk>);
+	MyClass c = <jk>new</jk> MyClassBar();
+	String json = s.serialize(p);  <jc>// Prints "{foo:'foo'}"</jc>
+		</p>	
+		<p>
+			The equivalent can be done through an annotation on the parent class, which applies to all child classes:
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(interfaceClass=MyClass.<jk>class</jk>)
+	<jk>public abstract class</jk> MyClass {
+		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
+	}
+		</p>
+		<p>
+			The annotation can also be applied on the individual child classes, like so...
+		</p>
+		<p class='bcode'>
+	<ja>@Bean</ja>(interfaceClass=MyClass.<jk>class</jk>)
+	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
+		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
+	}
+		</p>
+		<p>
+			Also, the <code>addFilters()</code> methods will automatically interpret any non-Filter classes passed in as meaning interface classes. 
+			So in the previous example, the <code>BeanFilter</code> class could have been avoided altogether by just passing in <code>MyClass.<jk>class</jk></code> to the serializer, like so:
+		</p>
+		<p class='bcode'>
+	<jc>// Serialize to JSON</jc>
+	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(MyClass.<jk>class</jk>);
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="SurrogateClasses"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.5 - Surrogate Classes</h3>
+	<div class='topic'>
+		<p>
+			Surrogate classes are very similar in concept to one-way <code>PojoFilters</code> except they represent a simpler syntax.
+		</p>
+		<p>
+			For example, let's say we want to be able to serialize the following class, but it's not serializable for some reason (for example, there are no
+			properties exposed):  
+		<p class='bcode'>
+	<jk>public class</jk> MyNonSerializableClass {
+		<jk>protected</jk> String <jf>foo</jf>;
+	}
+		</p>
+		<p>
+			This could be solved with the following <code>PojoFilter</code>.
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> MySerializableSurrogate {
+		<jk>public</jk> String <jf>foo</jf>;
+	}
+		
+	<jk>public class</jk> MyFilter <jk>extends</jk> PojoFilter&lt;MyNonSerializableClass,MySerializableSurrogate&gt; {
+		
+		<ja>@Override</ja>
+		<jk>public</jk> MySerializableSurrogate filter(MyNonSerializableClass o) {
+			MySerializableSurrogate s = <jk>new</jk> MySerializableSurrogate();
+			s.<jf>foo</jf> = o.<jf>foo</jf>;
+			<jk>return</jk> s;
+		}
+	}
+		</p>
+		<p>
+			However, the same can be accomplished by using a surrogate class that simply contains a constructor with the non-serializable class as an argument:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> MySerializableSurrogate {
+		<jk>public</jk> String <jf>foo</jf>;
+		
+		<jk>public</jk> MySerializableSurrogate(MyNonSerializableClass c) {
+			<jk>this</jk>.<jf>foo</jf> = c.<jf>foo</jf>;
+		}
+	}
+		</p>
+		<p>
+			The surrogate class is registered just like any other filter:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a JSON serializer that can serialize Iterators.</jc>
+	Serializer serializer = <jk>new</jk> JsonSerializer().addFilters(MySerializableSurrogate.<jk>class</jk>);
+		</p>
+		<p>
+			When the serializer encounters the non-serializable class, it will serialize an instance of the surrogate instead.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="ToObjectMaps"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.6 - Serializing to ObjectMaps</h3>
+	<div class='topic'>
+	<div class='topic'>
+		<p>
+			A shortcut method for filtering is provided that can often be simpler than defining filters.
+			In this case, we add methods to our class to serialize to {@link com.ibm.juno.core.ObjectMap ObjectMaps}
+		</p>
+		<p>
+		<p class='bcode'>
+	<jk>public class</jk> MyClass {
+		<jk>private</jk> String <jf>f1</jf>;
+		
+		<jc>// Constructor that takes in an ObjectMap</jc>
+		<jk>public</jk> MyClass(ObjectMap m) {
+			<jf>f1</jf> = m.getString(<js>"f1"</js>);
+		}
+		
+		<jc>// Method that converts object to an ObjectMap</jc>
+		<jk>public</jk> ObjectMap toObjectMap() {
+			<jk>return new</jk> ObjectMap().append(<js>"f1"</js>, <jf>f1</jf>);
+		}
+		</p>
+		<p>
+			The <code>toObjectMap()</code> method will automatically be used during serialization, and 
+			the constructor will automatically be used during parsing.
+			This will work for all serializers and parsers.
+		</p>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.class
new file mode 100755
index 0000000..5314954
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.java
new file mode 100755
index 0000000..9d26786
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/BeanStringFilter.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+
+/**
+ * Transforms beans into {@link String Strings} by simply calling the {@link Object#toString()} method.
+ * <p>
+ * 	Allows you to specify classes that should just be converted to {@code Strings} instead of potentially
+ * 	being turned into Maps by the {@link BeanContext} (or worse, throwing {@link BeanRuntimeException BeanRuntimeExceptions}).
+ * <p>
+ * 	This is usually a one-way filter.
+ * 	Beans serialized as strings cannot be reconstituted using a parser unless it is a <a class='doclink' href='../package-summary.html#PojoCategories'>Type 5 POJO</a>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the bean.
+ */
+public class BeanStringFilter<T> extends PojoFilter<T,String> {
+
+	/**
+	 * Converts the specified bean to a {@link String}.
+	 */
+	@Override /* PojoFilter */
+	public String filter(T o) {
+		return o.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.class
new file mode 100755
index 0000000..86985c7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.java
new file mode 100755
index 0000000..3382ffb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ByteArrayBase64Filter.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Transforms <code><jk>byte</jk>[]</code> arrays to BASE-64 encoded {@link String Strings}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ByteArrayBase64Filter extends PojoFilter<byte[],String> {
+
+	/**
+	 * Converts the specified <code><jk>byte</jk>[]</code> to a {@link String}.
+	 */
+	@Override /* PojoFilter */
+	public String filter(byte[] b) throws SerializeException {
+		try {
+			return StringUtils.base64Encode(b);
+		} catch (Exception e) {
+			throw new SerializeException(e);
+		}
+	}
+
+	/**
+	 * Converts the specified {@link String} to a <code><jk>byte</jk>[]</code>.
+	 */
+	@Override /* PojoFilter */
+	public byte[] unfilter(String s, ClassMeta<?> hint) throws ParseException {
+		try {
+			return StringUtils.base64Decode(s);
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DT.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DT.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DT.class
new file mode 100755
index 0000000..c723505
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DT.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DTZ.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DTZ.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DTZ.class
new file mode 100755
index 0000000..1ac8054
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ISO8601DTZ.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Medium.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Medium.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Medium.class
new file mode 100755
index 0000000..afb00ca
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Medium.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822D.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822D.class
new file mode 100755
index 0000000..8c219ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DT.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DT.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DT.class
new file mode 100755
index 0000000..257f747
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DT.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DTZ.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DTZ.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DTZ.class
new file mode 100755
index 0000000..c3f9e2f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$RFC2822DTZ.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Simple.class
new file mode 100755
index 0000000..d3e015f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ToString.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ToString.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ToString.class
new file mode 100755
index 0000000..151b15e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter$ToString.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.class
new file mode 100755
index 0000000..98a12e5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.class differ


[25/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.java
new file mode 100755
index 0000000..3b107b5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.cognos;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents a Cognos dataset.
+ * <p>
+ * 	When serialized to XML, creates the following construct (example pulled from <code>AddressBookResource</code>):
+ * <p class='bcode'>
+ * 	<xt>&lt;?xml</xt> <xa>version</xa>=<xs>'1.0'</xs> <xa>encoding</xa>=<xs>'UTF-8'</xs><xt>?&gt;</xt>
+ * 	<xt>&lt;c:dataset <xa>xmlns:c</xa>=<xs>'http://developer.cognos.com/schemas/xmldata/1/'</xs>&gt;</xt>
+ * 		<xt>&lt;c:metadata&gt;</xt>
+ * 			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'name'</xs> <xa>type</xa>=<xs>'xs:String'</xs> <xa>length</xa>=<xs>'255'</xs><xt>/&gt;</xt>
+ * 			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'age'</xs> <xa>type</xa>=<xs>'xs:int'</xs><xt>/&gt;</xt>
+ * 			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'numAddresses'</xs> <xa>type</xa>=<xs>'xs:int'</xs><xt>/&gt;</xt>
+ * 		<xt>&lt;/c:metadata&gt;</xt>
+ * 		<xt>&lt;c:data&gt;</xt>
+ * 			<xt>&lt;c:row&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>Barack Obama<xt>&lt;/c:value&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>52<xt>&lt;/c:value&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>2<xt>&lt;/c:value&gt;</xt>
+ * 			<xt>&lt;/c:row&gt;</xt>
+ * 			<xt>&lt;c:row&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>George Walker Bush<xt>&lt;/c:value&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>67<xt>&lt;/c:value&gt;</xt>
+ * 				<xt>&lt;c:value&gt;</xt>2<xt>&lt;/c:value&gt;</xt>
+ * 			<xt>&lt;/c:row&gt;</xt>
+ * 		<xt>&lt;/c:data&gt;</xt>
+ * 	<xt>&lt;/c:dataset&gt;</xt>
+ * </p>
+ * <p>
+ * 	Only 2-dimentional POJOs (arrays or collections of maps or beans) can be serialized to Cognos.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p>
+ * 	The construct shown above is a serialized <code>AddressBook</code> object which is a subclass of <code>LinkedList&lt;Person&gt;</code>.
+ * 	The code for generating the XML is as follows...
+ * </p>
+ * <p class='bcode'>
+ * 	Column[] items = {
+ * 		<jk>new</jk> Column(<js>"name"</js>, <js>"xs:String"</js>, 255),
+ * 		<jk>new</jk> Column(<js>"age"</js>, <js>"xs:int"</js>),
+ * 		<jk>new</jk> Column(<js>"numAddresses"</js>, <js>"xs:int"</js>)
+ * 			.addFilter(
+ * 				<jk>new</jk> PojoFilter&ltPerson,Integer&gt;() {
+ * 					<ja>@Override</ja>
+ * 					<jk>public</jk> Integer filter(Person p) {
+ * 						<jk>return</jk> p.<jf>addresses</jf>.size();
+ * 					}
+ * 				}
+ * 			)
+ * 	};
+ *
+ * 	DataSet ds = <jk>new</jk> DataSet(items, <jsf>addressBook</jsf>, BeanContext.<jsf>DEFAULT</jsf>);
+ *
+ * 	String xml = XmlSerializer.<jsf>DEFAULT_SQ</jsf>.serialize(ds);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="dataset")
+@SuppressWarnings("unchecked")
+public class DataSet {
+
+	private Column[] metaData;
+	private List<Row> data;
+
+	/** Bean constructor. */
+	public DataSet() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param columns The meta-data that represents the columns in the dataset.
+	 * @param o The POJO being serialized to Cognos.
+	 * 	Must be an array/collection of beans/maps.
+	 * @param beanContext The bean context used to convert POJOs to strings.
+	 * @throws Exception An error occurred trying to serialize the POJO.
+	 */
+	public DataSet(Column[] columns, Object o, BeanContext beanContext) throws Exception {
+		metaData = columns;
+		data = new LinkedList<Row>();
+		if (o != null) {
+			if (o.getClass().isArray())
+				o = Arrays.asList((Object[])o);
+			if (o instanceof Collection) {
+				Collection<?> c = (Collection<?>)o;
+				for (Object o2 : c) {
+					Row r = new Row();
+					Map<?,?> m = null;
+					if (o2 instanceof Map)
+						m = (Map<?,?>)o2;
+					else
+						m = beanContext.forBean(o2);
+					for (Column col : columns) {
+						Object v;
+						if (col.filter != null)
+							v = col.filter.filter(o2);
+						else
+							v = m.get(col.getName());
+						r.add(v == null ? null : v.toString());
+					}
+					data.add(r);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Represents a row of data.
+	 * <p>
+	 * 	When serialized to XML, creates the following construct (example pulled from <code>AddressBookResource</code>):
+	 * <p class='bcode'>
+	 * 	<xt>&lt;row&gt;</xt>
+	 * 		<xt>&lt;value&gt;</xt>Barack Obama<xt>&lt;/value&gt;</xt>
+	 * 		<xt>&lt;value&gt;</xt>52<xt>&lt;/value&gt;</xt>
+	 * 		<xt>&lt;value&gt;</xt>2<xt>&lt;/value&gt;</xt>
+	 * 	<xt>&lt;/row&gt;</xt>
+	 * </p>
+	 *
+	 * @author James Bognar (jbognar@us.ibm.com)
+	 */
+	@Xml(name="row", childName="value")
+	public static class Row extends LinkedList<String> {
+		private static final long serialVersionUID = 1L;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>metadata</property>.
+	 *
+	 * @return The value of the <property>metadata</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@BeanProperty(name="metadata")
+	public Column[] getMetaData() {
+		return metaData;
+	}
+
+	/**
+	 * Bean property setter:  <property>metadata</property>.
+	 *
+	 * @param metaData The new value for the <property>metadata</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	@BeanProperty(name="metadata")
+	public DataSet setMetaData(Column[] metaData) {
+		this.metaData = metaData;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>data</property>.
+	 *
+	 * @return The value of the <property>data</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@BeanProperty(name="data")
+	public List<Row> getData() {
+		return data;
+	}
+
+	/**
+	 * Bean property setter:  <property>data</property>.
+	 *
+	 * @param data The new value for the <property>data</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	@BeanProperty(name="data")
+	public DataSet setData(List<Row> data) {
+		this.data = data;
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/HTML.png
new file mode 100755
index 0000000..fd63c23
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/JSON.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/JSON.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/JSON.png
new file mode 100755
index 0000000..44785ad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/JSON.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/RDFXML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/RDFXML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/RDFXML.png
new file mode 100755
index 0000000..081e949
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/doc-files/RDFXML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.class
new file mode 100755
index 0000000..76e935c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.java
new file mode 100755
index 0000000..9919e9b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package-info.java
@@ -0,0 +1,13 @@
+/* *****************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+// XML namespaces used in this package
+@XmlSchema(prefix="cognos", namespace="http://developer.cognos.com/schemas/xmldata/1/")
+package com.ibm.juno.core.dto.cognos;
+import com.ibm.juno.core.xml.annotation.*;
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package.html
new file mode 100755
index 0000000..2b7cf71
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/package.html
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Cognos Data Transfer Objects</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#CognosSerializer'>Cognos serialization support</a></p>
+	<li><p><a class='doclink' href='#CognosParser'>Cognos parsing support</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="CognosSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Cognos serialization support</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.dto.cognos.DataSet} class is a DTO used to convert POJO models directly to Cognos-XML.
+	</p>
+	<p>
+		Because of the nature of the Cognos XML syntax, only <i>2-dimensional</i> POJO data structures can be serialized to Cognos-XML.
+	</p>
+	<p>
+		For example...
+	</p>
+	<ul class='normal'>
+		<li><code>Collection&lt;Bean&gt;</code>
+		<li><code>Collection&lt;Map&gt;</code>
+		<li>{@code MyBean[]}
+		<li>{@code HashMap[]}
+	</ul>
+	<h6 class='topic'>Example</h6>
+	<p>
+		The following example shows how to generate Cognos-XML from a POJO.  
+		The example uses the <a class='doclink' href='../../doc-files/AddressBook.html'>AddressBook</a> sample POJO.
+		It should be noted that since the {@code AddressBook} class is a subclass of {@code LinkedList}, it fulfills
+			the requirement of being a tabular data structure.  
+	</p>
+	<p class='bcode'>
+	<jc>// Create our POJO with some entries.</jc>
+	AddressBook addressBook = <jk>new</jk> AddressBook();
+	addressBook.add(
+		<jk>new</jk> Person(<js>"Barack Obama"</js>, <js>"Aug 4, 1961"</js>,
+			<jk>new</jk> Address(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>true</jk>),
+			<jk>new</jk> Address(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, <js>"IL"</js>, 60615, <jk>false</jk>)
+		)
+	);
+	addressBook.add(
+		<jk>new</jk> Person(<js>"George Walker Bush"</js>, <js>"Jul 6, 1946"</js>,
+			<jk>new</jk> Address(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, <js>"TX"</js>, 76638, <jk>true</jk>),
+			<jk>new</jk> Address(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>false</jk>)
+		)
+	);
+
+	<jc>// Define the Cognos metadata</jc>
+	Column[] items = {
+		<jk>new</jk> Column(<js>"name"</js>, <js>"xs:String"</js>, 255),
+		<jk>new</jk> Column(<js>"age"</js>, <js>"xs:int"</js>),
+		<jk>new</jk> Column(<js>"numAddresses"</js>, <js>"xs:int"</js>)
+			.addFilter(
+				<jk>new</jk> PojoFilter&ltPerson,Integer&gt;() {
+					<ja>@Override</ja>
+					<jk>public</jk> Integer filter(Person p) {
+						<jk>return</jk> p.<jf>addresses</jf>.size();
+					}
+				}
+			)
+	};
+	
+	<jc>// Create the Cognos DataSet object</jc>
+	DataSet ds = <jk>new</jk> DataSet(items, <jsf>addressBook</jsf>, BeanContext.<jsf>DEFAULT</jsf>);
+	
+	<jc>// Serialize it to XML</jc>
+	String xml = XmlSerializer.<jsf>DEFAULT_SQ</jsf>.serialize(ds);
+	</p>
+	<p>
+		When run, this code produces the following XML...
+	</p>
+	<p class='bcode'>
+	<xt>&lt;?xml</xt> <xa>version</xa>=<xs>'1.0'</xs> <xa>encoding</xa>=<xs>'UTF-8'</xs><xt>?&gt;</xt>
+	<xt>&lt;c:dataset <xa>xmlns:c</xa>=<xs>'http://developer.cognos.com/schemas/xmldata/1/'</xs>&gt;</xt>
+		<xt>&lt;c:metadata&gt;</xt>
+			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'name'</xs> <xa>type</xa>=<xs>'xs:String'</xs> <xa>length</xa>=<xs>'255'</xs><xt>/&gt;</xt>
+			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'age'</xs> <xa>type</xa>=<xs>'xs:int'</xs><xt>/&gt;</xt>
+			<xt>&lt;c:item</xt> <xa>name</xa>=<xs>'numAddresses'</xs> <xa>type</xa>=<xs>'xs:int'</xs><xt>/&gt;</xt>
+		<xt>&lt;/c:metadata&gt;</xt>
+		<xt>&lt;c:data&gt;</xt>
+			<xt>&lt;c:row&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>Barack Obama<xt>&lt;/c:value&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>52<xt>&lt;/c:value&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>2<xt>&lt;/c:value&gt;</xt>
+			<xt>&lt;/c:row&gt;</xt>
+			<xt>&lt;c:row&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>George Walker Bush<xt>&lt;/c:value&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>67<xt>&lt;/c:value&gt;</xt>
+				<xt>&lt;c:value&gt;</xt>2<xt>&lt;/c:value&gt;</xt>
+			<xt>&lt;/c:row&gt;</xt>
+		<xt>&lt;/c:data&gt;</xt>
+	<xt>&lt;/c:dataset&gt;</xt>
+	</p>
+	<h6 class='topic'>Other data formats</h6>
+	<p>
+		The following shows examples of what this data structure looks like when serialized to other formats:
+	</p>
+	<h6 class='figure'>HTML</h6>
+	<img class='bordered' src='doc-files/HTML.png'>
+	<h6 class='figure'>JSON</h6>
+	<img class='bordered' src='doc-files/JSON.png'>
+	<h6 class='figure'>RDF/XML</h6>
+	<img class='bordered' src='doc-files/RDFXML.png'>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="CognosParser"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - Cognos parsing support</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.dto.cognos.DataSet} class can be reconstructed from Cognos/XML using one of the standard XML parsers.
+	</p>
+	<h6 class='topic'>Example</h6>
+	<p class='bcode'>
+	<jc>// Parse XML back into original DataSet</jc> 
+	DataSet ds = XmlParser.<jsf>DEFAULT</jsf>.parse(xml, DataSet.<jk>class</jk>);
+	</p>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.class
new file mode 100755
index 0000000..0ad6388
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.java
new file mode 100755
index 0000000..c9daf4c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonType.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+/**
+ * Represents possible JSON types in the JSON-Schema core specification.
+ * <p>
+ * 	Implements custom <code>toString()</code> and <code>fromString(String)</code> methods
+ * 		that override the default serialization/parsing behavior of <code>Enum</code> types
+ * 		so that they are represented in lowercase form (as per the specification).
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ * 	// Produces 'number', not 'NUMBER'.
+ * 	String json = JsonSerializer.DEFAULT.serialize(JsonType.NUMBER);
+ * </p>
+ *
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.jsonschema} for usage information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum JsonType {
+
+	/** array */
+	ARRAY("array"),
+
+	/** boolean */
+	BOOLEAN("boolean"),
+
+	/** integer */
+	INTEGER("integer"),
+
+	/** null */
+	NULL("null"),
+
+	/** number */
+	NUMBER("number"),
+
+	/** object */
+	OBJECT("object"),
+
+	/** string */
+	STRING("string"),
+
+	/** any */
+	ANY("any");
+
+	private final String value;	// The serialized format of the enum.
+
+	private JsonType(String value) {
+		this.value = value;
+	}
+
+	/**
+	 * Returns the lowercase form of this enum that's compatible with the JSON-Schema specification.
+	 */
+	@Override /* Object */
+	public String toString() {
+		return value;
+	}
+
+	/**
+	 * Converts the specified lowercase form of the enum back into an <code>Enum</code>.
+	 *
+	 * @param value The lowercase form of the enum (e.g. <js>"array"</js>).
+	 * @return The matching <code>Enum</code>, or <jk>null</jk> if no match found.
+	 */
+	public static JsonType fromString(String value) {
+		if (value == null || value.length() < 4)
+			return null;
+		char c = value.charAt(0);
+		if (c == 'a') {
+			if (value.equals("array"))
+			return ARRAY;
+			if (value.equals("any"))
+				return ANY;
+		}
+		if (c == 'b' && value.equals("boolean"))
+			return BOOLEAN;
+		if (c == 'i' && value.equals("integer"))
+			return INTEGER;
+		if (c == 'n') {
+			c = value.charAt(2);
+			if (c == 'l' && value.equals("null"))
+				return NULL;
+			if (c == 'm' && value.equals("number"))
+				return NUMBER;
+			return null;
+		}
+		if (c == 'o' && value.equals("object"))
+			return OBJECT;
+		if (c == 's' && value.equals("string"))
+			return STRING;
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.class
new file mode 100755
index 0000000..5a10330
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.java
new file mode 100755
index 0000000..d383162
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/JsonTypeArray.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.util.*;
+
+/**
+ * Represents a list of {@link JsonType} objects.
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.jsonschema} for usage information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonTypeArray extends LinkedList<JsonType> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Default constructor.
+	 */
+	public JsonTypeArray() {}
+
+	/**
+	 * Constructor with predefined types to add to this list.
+	 *
+	 * @param types The list of types to add to the list.
+	 */
+	public JsonTypeArray(JsonType...types) {
+		addAll(types);
+	}
+
+	/**
+	 * Convenience method for adding one or more {@link JsonType} objects to
+	 * 	this array.
+	 *
+	 * @param types The {@link JsonType} objects to add to this array.
+	 * @return This object (for method chaining).
+	 */
+	public JsonTypeArray addAll(JsonType...types) {
+		for (JsonType t : types)
+			add(t);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample$1.class
new file mode 100755
index 0000000..d967e1c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.class
new file mode 100755
index 0000000..375479e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.java
new file mode 100755
index 0000000..636755d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Sample.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.io.*;
+import java.net.*;
+
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.utils.*;
+
+@SuppressWarnings("serial")
+class Sample {
+
+	public static void main(String[] args) {
+
+		// Create a SchemaMap for looking up schemas.
+		SchemaMap schemaMap = new SchemaMap() {
+
+			@Override /* SchemaMap */
+			public Schema load(URI uri) {
+				Reader r = null;
+				try {
+					r = new InputStreamReader(uri.toURL().openStream(), IOUtils.UTF8);
+					Schema s = JsonParser.DEFAULT.parse(r, -1, Schema.class);
+					return s;
+				} catch (Exception e) {
+					throw new RuntimeException(e);
+				} finally {
+					if (r != null) {
+						try {
+							r.close();
+						} catch (IOException e) {
+						}
+					}
+				}
+			}
+		};
+
+		// Get schema from the schema map.
+		Schema purchaseOrderSchema = schemaMap.get("http://www.ibm.com/purchase-order/PurchaseOrder#");
+
+		JsonType streetType = purchaseOrderSchema
+			.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"
+
+		JsonType productIdType = purchaseOrderSchema
+			.getProperty("product")                              // Get "product" property
+			.getItemsAsSchemaArray()                             // Get "items".
+			.get(0)                                              // Get first entry.
+			.resolve()                                           // Resolve to Product schema.
+			.getProperty("productId")                            // Get "productId" property.
+			.getTypeAsJsonType();                                // Get data type.
+		System.err.println("productIdType=" + productIdType);   // Prints "productIdType=number"
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaArrayFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaArrayFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaArrayFilter.class
new file mode 100755
index 0000000..740164b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaArrayFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaFilter.class
new file mode 100755
index 0000000..f3f9e32
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$BooleanOrSchemaFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$JsonTypeOrJsonTypeArrayFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$JsonTypeOrJsonTypeArrayFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$JsonTypeOrJsonTypeArrayFilter.class
new file mode 100755
index 0000000..df1cabb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$JsonTypeOrJsonTypeArrayFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$SchemaOrSchemaArrayFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$SchemaOrSchemaArrayFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$SchemaOrSchemaArrayFilter.class
new file mode 100755
index 0000000..6000f8b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema$SchemaOrSchemaArrayFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.class
new file mode 100755
index 0000000..496ead5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.java
new file mode 100755
index 0000000..7772f05
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/Schema.java
@@ -0,0 +1,1392 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.net.URI;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents a top-level schema object bean in the JSON-Schema core specification.
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.jsonschema} for usage information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="schema")
+@SuppressWarnings("hiding")
+public class Schema {
+	private String name;                                   // Property name.  Not serialized.
+	private URI id;
+	private URI schemaVersion;
+	private String title;
+	private String description;
+	private JsonType typeJsonType;                         // JsonType representation of type
+	private JsonTypeArray typeJsonTypeArray;               // JsonTypeArray representation of type
+	private Map<String,Schema> definitions;
+	private Map<String,Schema> properties;
+	private Map<String,Schema> patternProperties;
+	private Map<String,Schema> dependencies;
+	private Schema itemsSchema;                            // Schema representation of items
+	private SchemaArray itemsSchemaArray;                  // SchemaArray representation of items
+	private Number multipleOf;
+	private Number maximum;
+	private Boolean exclusiveMaximum;
+	private Number minimum;
+	private Boolean exclusiveMinimum;
+	private Integer maxLength;
+	private Integer minLength;
+	private String pattern;
+	private Boolean additionalItemsBoolean;                // Boolean representation of additionalItems
+	private SchemaArray additionalItemsSchemaArray;        // SchemaArray representation of additionalItems
+	private Integer maxItems;
+	private Integer minItems;
+	private Boolean uniqueItems;
+	private Integer maxProperties;
+	private Integer minProperties;
+	private List<String> required;
+	private Boolean additionalPropertiesBoolean;           // Boolean representation of additionalProperties
+	private Schema additionalPropertiesSchema;             // Schema representation of additionalProperties
+	private List<String> _enum;
+	private List<Schema> allOf;
+	private List<Schema> anyOf;
+	private List<Schema> oneOf;
+	private Schema not;
+	private URI ref;
+	private SchemaMap schemaMap;
+	private Schema master = this;
+
+	/**
+	 * Default constructor.
+	 */
+	public Schema() {}
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>name</property>.
+	 *
+	 * @return The value of the <property>name</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@BeanIgnore
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Bean property setter:  <property>name</property>.
+	 *
+	 * @param name The new value for the <property>name</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	@BeanIgnore
+	public Schema setName(String name) {
+		this.name = name;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>id</property>.
+	 *
+	 * @return The value of the <property>id</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public URI getId() {
+		return id;
+	}
+
+	/**
+	 * Bean property setter:  <property>id</property>.
+	 *
+	 * @param id The new value for the <property>id</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setId(URI id) {
+		this.id = id;
+		return this;
+	}
+
+	/**
+	 * Bean property setter:  <property>id</property>.
+	 *
+	 * @param id The new value for the <property>id</property> property on this bean.
+	 * The parameter must be a valid URI.  It can be <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setId(String id) {
+		return setId(id == null ? null : URI.create(id));
+	}
+
+	/**
+	 * Bean property getter:  <property>$schema</property>.
+	 *
+	 * @return The value of the <property>$schema</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@BeanProperty(name="$schema")
+	public URI getSchemaVersionUri() {
+		return schemaVersion;
+	}
+
+	/**
+	 * Bean property setter:  <property>$schema</property>.
+	 *
+	 * @param schemaVersion The new value for the <property>schemaVersion</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	@BeanProperty(name="$schema")
+	public Schema setSchemaVersionUri(URI schemaVersion) {
+		this.schemaVersion = schemaVersion;
+		return this;
+	}
+
+	/**
+	 * Bean property setter:  <property>schemaVersion</property>.
+	 *
+	 * @param schemaVersion The new value for the <property>schemaVersion</property> property on this bean.
+	 * The parameter must be a valid URI.  It can be <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setSchemaVersionUri(String schemaVersion) {
+		return setSchemaVersionUri(schemaVersion == null ? null : URI.create(schemaVersion));
+	}
+
+	/**
+	 * Bean property getter:  <property>title</property>.
+	 *
+	 * @return The value of the <property>title</property> property, or <jk>null</jk> if it is not set.
+	 */
+	public String getTitle() {
+		return title;
+	}
+
+	/**
+	 * Bean property setter:  <property>title</property>.
+	 *
+	 * @param title The new value for the <property>title</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setTitle(String title) {
+		this.title = title;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>description</property>.
+	 *
+	 * @return The value of the <property>description</property> property, or <jk>null</jk> if it is not set.
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * Bean property setter:  <property>description</property>.
+	 *
+	 * @param description The new value for the <property>description</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setDescription(String description) {
+		this.description = description;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>type</property>.
+	 *
+	 * @return The value of the <property>type</property> property on this bean, or <jk>null</jk> if it is not set.
+	 * Can be either a {@link JsonType} or {@link JsonTypeArray} depending on what value was used to set it.
+	 */
+	@BeanProperty(filter=JsonTypeOrJsonTypeArrayFilter.class)
+	public Object getType() {
+		if (typeJsonType != null)
+			return typeJsonType;
+		return typeJsonTypeArray;
+	}
+
+	/**
+	 * Bean property getter:  <property>type</property>.
+	 * <p>
+	 * Convenience method for returning the <property>type</property> property when it is a {@link JsonType} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonTypeArray}.
+	 */
+	@BeanIgnore
+	public JsonType getTypeAsJsonType() {
+		return typeJsonType;
+	}
+
+	/**
+	 * Bean property getter:  <property>type</property>.
+	 * <p>
+	 * Convenience method for returning the <property>type</property> property when it is a {@link JsonTypeArray} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonType}.
+	 */
+	@BeanIgnore
+	public JsonTypeArray getTypeAsJsonTypeArray() {
+		return typeJsonTypeArray;
+	}
+
+	/**
+	 * Bean property setter:  <property>type</property>.
+	 *
+	 * @param type The new value for the <property>type</property> property on this bean.
+	 * This object must be of type {@link JsonType} or {@link JsonTypeArray}.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If invalid object type passed in.
+	 */
+	public Schema setType(Object type) {
+		this.typeJsonType = null;
+		this.typeJsonTypeArray = null;
+		if (type != null) {
+			if (type instanceof JsonType)
+				this.typeJsonType = (JsonType)type;
+			else if (type instanceof JsonTypeArray)
+				this.typeJsonTypeArray = (JsonTypeArray)type;
+			else
+				throw new BeanRuntimeException(SchemaProperty.class, "Invalid attribute type ''{0}'' passed in.  Must be one of the following:  SimpleType, SimpleTypeArray", type.getClass().getName());
+		}
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>type</property>.
+	 *
+	 * @param types The list of items to append to the <property>type</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addTypes(JsonType...types) {
+		if (this.typeJsonTypeArray == null)
+			this.typeJsonTypeArray = new JsonTypeArray();
+		this.typeJsonTypeArray.addAll(types);
+		return this;
+	}
+
+	/**
+	 * Used during parsing to convert the <property>type</property> property to the correct class type.
+	 * <ul>
+	 * 	<li>If parsing a JSON-array, converts to a {@link JsonTypeArray}.
+	 * 	<li>If parsing a JSON-object, converts to a {@link JsonType}.
+	 * </ul>
+	 * Serialization method is a no-op.
+	 */
+	public static class JsonTypeOrJsonTypeArrayFilter extends PojoFilter<Object,Object> {
+
+		@Override /* PojoFilter */
+		public Object filter(Object o) throws SerializeException {
+			return o;
+		}
+
+		@Override /* PojoFilter */
+		public Object unfilter(Object o, ClassMeta<?> hint) throws ParseException {
+			BeanContext bc = getBeanContext();
+			ClassMeta<?> cm = (o instanceof Collection ? bc.getClassMeta(JsonTypeArray.class) : bc.getClassMeta(JsonType.class));
+			return bc.convertToType(o, cm);
+		}
+	}
+
+	/**
+	 * Bean property getter:  <property>definitions</property>.
+	 *
+	 * @return The value of the <property>definitions</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Map<String,Schema> getDefinitions() {
+		return definitions;
+	}
+
+	/**
+	 * Bean property setter:  <property>definitions</property>.
+	 *
+	 * @param definitions The new value for the <property>definitions</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setDefinitions(Map<String,Schema> definitions) {
+		this.definitions = definitions;
+		if (definitions != null)
+			setMasterOn(definitions.values());
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>definitions</property>.
+	 *
+	 * @param name The key in the definitions map entry.
+	 * @param definition The value in the definitions map entry.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addDefinition(String name, Schema definition) {
+		if (this.definitions == null)
+			this.definitions = new LinkedHashMap<String,Schema>();
+		this.definitions.put(name, definition);
+		setMasterOn(definition);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>properties</property>.
+	 *
+	 * @return The value of the <property>properties</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Map<String,Schema> getProperties() {
+		return properties;
+	}
+
+	/**
+	 * Returns the property with the specified name.
+	 * This is equivalent to calling <property>getProperty(name, <jk>false</jk>)</property>.
+	 *
+	 * @param name The property name.
+	 * @return The property with the specified name, or <jk>null</jk> if no property is specified.
+	 */
+	public Schema getProperty(String name) {
+		return getProperty(name, false);
+	}
+
+	/**
+	 * Returns the property with the specified name.
+	 * If <property>resolve</property> is <jk>true</jk>, the property object will automatically be
+	 * 	resolved by calling {@link #resolve()}.
+	 * Therefore, <property>getProperty(name, <jk>true</jk>)</property> is equivalent to calling
+	 * 	<property>getProperty(name).resolve()</property>, except it's safe from a potential <property>NullPointerException</property>.
+	 *
+	 * @param name The property name.
+	 * @param resolve If <jk>true</jk>, calls {@link #resolve()} on object before returning.
+	 * @return The property with the specified name, or <jk>null</jk> if no property is specified.
+	 */
+	public Schema getProperty(String name, boolean resolve) {
+		if (properties == null)
+			return null;
+		Schema s = properties.get(name);
+		if (s == null)
+			return null;
+		if (resolve)
+			s = s.resolve();
+		return s;
+	}
+
+	/**
+	 * Bean property setter:  <property>properties</property>.
+	 *
+	 * @param properties The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setProperties(Map<String,Schema> properties) {
+		this.properties = properties;
+		if (properties != null)
+			for (Map.Entry<String,Schema> e : properties.entrySet()) {
+				Schema value = e.getValue();
+				setMasterOn(value);
+				value.setName(e.getKey());
+			}
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>properties</property>.
+	 * <p>
+	 * Properties must have their <property>name</property> property set on them when using this method.
+	 *
+	 * @param properties The list of items to append to the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If property is found without a set <property>name</property> property.
+	 */
+	public Schema addProperties(Schema...properties) {
+		if (this.properties == null)
+			this.properties = new LinkedHashMap<String,Schema>();
+		for (Schema p : properties) {
+			if (p.getName() == null)
+				throw new BeanRuntimeException(Schema.class, "Invalid property passed to Schema.addProperties().  Property name was null.");
+			setMasterOn(p);
+			this.properties.put(p.getName(), p);
+		}
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>patternProperties</property>.
+	 *
+	 * @return The value of the <property>patternProperties</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Map<String,Schema> getPatternProperties() {
+		return patternProperties;
+	}
+
+	/**
+	 * Bean property setter:  <property>patternProperties</property>.
+	 *
+	 * @param patternProperties The new value for the <property>patternProperties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setPatternProperties(Map<String,Schema> patternProperties) {
+		this.patternProperties = patternProperties;
+		if (patternProperties != null)
+			for (Map.Entry<String,Schema> e : patternProperties.entrySet()) {
+				Schema s = e.getValue();
+				setMasterOn(s);
+				s.setName(e.getKey());
+			}
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>patternProperties</property>.
+	 * <p>
+	 * Properties must have their <property>name</property> property set to the pattern string when using this method.
+	 *
+	 * @param properties The list of items to append to the <property>patternProperties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If property is found without a set <property>name</property> property.
+	 */
+	public Schema addPatternProperties(SchemaProperty...properties) {
+		if (this.patternProperties == null)
+			this.patternProperties = new LinkedHashMap<String,Schema>();
+		for (Schema p : properties) {
+			if (p.getName() == null)
+				throw new BeanRuntimeException(Schema.class, "Invalid property passed to Schema.addProperties().  Property name was null.");
+			setMasterOn(p);
+			this.patternProperties.put(p.getName(), p);
+		}
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>dependencies</property>.
+	 *
+	 * @return The value of the <property>dependencies</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Map<String,Schema> getDependencies() {
+		return dependencies;
+	}
+
+	/**
+	 * Bean property setter:  <property>dependencies</property>.
+	 *
+	 * @param dependencies The new value for the <property>dependencies</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setDependencies(Map<String,Schema> dependencies) {
+		this.dependencies = dependencies;
+		if (dependencies != null)
+			setMasterOn(dependencies.values());
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>dependencies</property>.
+	 *
+	 * @param name The key of the entry in the dependencies map.
+	 * @param dependency The value of the entry in the dependencies map.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addDependency(String name, Schema dependency) {
+		if (this.dependencies == null)
+			this.dependencies = new LinkedHashMap<String,Schema>();
+		this.dependencies.put(name, dependency);
+		setMasterOn(dependency);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>items</property>.
+	 *
+	 * @return The value of the <property>items</property> property on this bean, or <jk>null</jk> if it is not set.
+	 * Can be either a {@link Schema} or {@link SchemaArray} depending on what value was used to set it.
+	 */
+	@BeanProperty(filter=SchemaOrSchemaArrayFilter.class)
+	public Object getItems() {
+		if (itemsSchema != null)
+			return itemsSchema;
+		return itemsSchemaArray;
+	}
+
+	/**
+	 * Bean property getter:  <property>items</property>.
+	 * <p>
+	 * Convenience method for returning the <property>items</property> property when it is a {@link Schema} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link SchemaArray}.
+	 */
+	@BeanIgnore
+	public Schema getItemsAsSchema() {
+		return itemsSchema;
+	}
+
+	/**
+	 * Bean property getter:  <property>items</property>.
+	 * <p>
+	 * Convenience method for returning the <property>items</property> property when it is a {@link SchemaArray} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Schema}.
+	 */
+	@BeanIgnore
+	public SchemaArray getItemsAsSchemaArray() {
+		return itemsSchemaArray;
+	}
+
+	/**
+	 * Used during parsing to convert the <property>items</property> property to the correct class type.
+	 * <ul>
+	 * 	<li>If parsing a JSON-array, converts to a {@link SchemaArray}.
+	 * 	<li>If parsing a JSON-object, converts to a {@link Schema}.
+	 * </ul>
+	 * Serialization method is a no-op.
+	 */
+	public static class SchemaOrSchemaArrayFilter extends PojoFilter<Object,Object> {
+
+		@Override /* PojoFilter */
+		public Object filter(Object o) throws SerializeException {
+			return o;
+		}
+
+		@Override /* PojoFilter */
+		public Object unfilter(Object o, ClassMeta<?> hint) throws ParseException {
+			BeanContext bc = getBeanContext();
+			ClassMeta<?> cm = (o instanceof Collection ? bc.getClassMeta(SchemaArray.class) : bc.getClassMeta(Schema.class));
+			return bc.convertToType(o, cm);
+		}
+	}
+
+	/**
+	 * Bean property setter:  <property>items</property>.
+	 *
+	 * @param items The new value for the <property>items</property> property on this bean.
+	 * This object must be of type {@link Schema} or {@link SchemaArray}.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If invalid object type passed in.
+	 */
+	public Schema setItems(Object items) {
+		this.itemsSchema = null;
+		this.itemsSchemaArray = null;
+		if (items != null) {
+			if (items instanceof Schema) {
+				this.itemsSchema = (Schema)items;
+				setMasterOn(this.itemsSchema);
+			} else if (items instanceof SchemaArray) {
+				this.itemsSchemaArray = (SchemaArray)items;
+				setMasterOn(this.itemsSchemaArray);
+			} else
+				throw new BeanRuntimeException(SchemaProperty.class, "Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Schema, SchemaArray", items.getClass().getName());
+		}
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>items</property>.
+	 *
+	 * @param items The list of items to append to the <property>items</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addItems(Schema...items) {
+		if (this.itemsSchemaArray == null)
+			this.itemsSchemaArray = new SchemaArray();
+		this.itemsSchemaArray.addAll(items);
+		setMasterOn(items);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>multipleOf</property>.
+	 *
+	 * @return The value of the <property>multipleOf</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Number getMultipleOf() {
+		return multipleOf;
+	}
+
+	/**
+	 * Bean property setter:  <property>multipleOf</property>.
+	 *
+	 * @param multipleOf The new value for the <property>multipleOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMultipleOf(Number multipleOf) {
+		this.multipleOf = multipleOf;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>maximum</property>.
+	 *
+	 * @return The value of the <property>maximum</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Number getMaximum() {
+		return maximum;
+	}
+
+	/**
+	 * Bean property setter:  <property>maximum</property>.
+	 *
+	 * @param maximum The new value for the <property>maximum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMaximum(Number maximum) {
+		this.maximum = maximum;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>exclusiveMaximum</property>.
+	 *
+	 * @return The value of the <property>exclusiveMaximum</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Boolean isExclusiveMaximum() {
+		return exclusiveMaximum;
+	}
+
+	/**
+	 * Bean property setter:  <property>exclusiveMaximum</property>.
+	 *
+	 * @param exclusiveMaximum The new value for the <property>exclusiveMaximum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setExclusiveMaximum(Boolean exclusiveMaximum) {
+		this.exclusiveMaximum = exclusiveMaximum;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>minimum</property>.
+	 *
+	 * @return The value of the <property>minimum</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Number getMinimum() {
+		return minimum;
+	}
+
+	/**
+	 * Bean property setter:  <property>minimum</property>.
+	 *
+	 * @param minimum The new value for the <property>minimum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMinimum(Number minimum) {
+		this.minimum = minimum;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>exclusiveMinimum</property>.
+	 *
+	 * @return The value of the <property>exclusiveMinimum</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Boolean isExclusiveMinimum() {
+		return exclusiveMinimum;
+	}
+
+	/**
+	 * Bean property setter:  <property>exclusiveMinimum</property>.
+	 *
+	 * @param exclusiveMinimum The new value for the <property>exclusiveMinimum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setExclusiveMinimum(Boolean exclusiveMinimum) {
+		this.exclusiveMinimum = exclusiveMinimum;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>maxLength</property>.
+	 *
+	 * @return The value of the <property>maxLength</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMaxLength() {
+		return maxLength;
+	}
+
+	/**
+	 * Bean property setter:  <property>maxLength</property>.
+	 *
+	 * @param maxLength The new value for the <property>maxLength</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMaxLength(Integer maxLength) {
+		this.maxLength = maxLength;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>minLength</property>.
+	 *
+	 * @return The value of the <property>minLength</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMinLength() {
+		return minLength;
+	}
+
+	/**
+	 * Bean property setter:  <property>minLength</property>.
+	 *
+	 * @param minLength The new value for the <property>minLength</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMinLength(Integer minLength) {
+		this.minLength = minLength;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>pattern</property>.
+	 *
+	 * @return The value of the <property>pattern</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public String getPattern() {
+		return pattern;
+	}
+
+	/**
+	 * Bean property setter:  <property>pattern</property>.
+	 *
+	 * @param pattern The new value for the <property>pattern</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setPattern(String pattern) {
+		this.pattern = pattern;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalItems</property>.
+	 *
+	 * @return The value of the <property>additionalItems</property> property on this bean, or <jk>null</jk> if it is not set.
+	 * Can be either a {@link Boolean} or {@link SchemaArray} depending on what value was used to set it.
+	 */
+	@BeanProperty(filter=BooleanOrSchemaArrayFilter.class)
+	public Object getAdditionalItems() {
+		if (additionalItemsBoolean != null)
+			return additionalItemsBoolean;
+		return additionalItemsSchemaArray;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalItems</property>.
+	 * <p>
+	 * Convenience method for returning the <property>additionalItems</property> property when it is a {@link Boolean} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link SchemaArray}.
+	 */
+	@BeanIgnore
+	public Boolean getAdditionalItemsAsBoolean() {
+		return additionalItemsBoolean;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalItems</property>.
+	 * <p>
+	 * Convenience method for returning the <property>additionalItems</property> property when it is a {@link SchemaArray} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Boolean}.
+	 */
+	@BeanIgnore
+	public List<Schema> getAdditionalItemsAsSchemaArray() {
+		return additionalItemsSchemaArray;
+	}
+
+	/**
+	 * Bean property setter:  <property>additionalItems</property>.
+	 *
+	 * @param additionalItems The new value for the <property>additionalItems</property> property on this bean.
+	 * This object must be of type {@link Boolean} or {@link SchemaArray}.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If invalid object type passed in.
+	 */
+	public Schema setAdditionalItems(Object additionalItems) {
+		this.additionalItemsBoolean = null;
+		this.additionalItemsSchemaArray = null;
+		if (additionalItems != null) {
+			if (additionalItems instanceof Boolean)
+				this.additionalItemsBoolean = (Boolean)additionalItems;
+			else if (additionalItems instanceof SchemaArray) {
+				this.additionalItemsSchemaArray = (SchemaArray)additionalItems;
+				setMasterOn(this.additionalItemsSchemaArray);
+			} else
+				throw new BeanRuntimeException(SchemaProperty.class, "Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Boolean, SchemaArray", additionalItems.getClass().getName());
+		}
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>additionalItems</property>.
+	 *
+	 * @param additionalItems The list of items to append to the <property>additionalItems</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addAdditionalItems(Schema...additionalItems) {
+		if (this.additionalItemsSchemaArray == null)
+			this.additionalItemsSchemaArray = new SchemaArray();
+		this.additionalItemsSchemaArray.addAll(additionalItems);
+		setMasterOn(additionalItems);
+		return this;
+	}
+
+	/**
+	 * Used during parsing to convert the <property>additionalItems</property> property to the correct class type.
+	 * <ul>
+	 * 	<li>If parsing a JSON-array, converts to a {@link SchemaArray}.
+	 * 	<li>If parsing a JSON-boolean, converts to a {@link Boolean}.
+	 * </ul>
+	 * Serialization method is a no-op.
+	 */
+	public static class BooleanOrSchemaArrayFilter extends PojoFilter<Object,Object> {
+
+		@Override /* PojoFilter */
+		public Object filter(Object o) throws SerializeException {
+			return o;
+		}
+
+		@Override /* PojoFilter */
+		public Object unfilter(Object o, ClassMeta<?> hint) throws ParseException {
+			BeanContext bc = getBeanContext();
+			ClassMeta<?> cm = (o instanceof Collection ? bc.getClassMeta(SchemaArray.class) : bc.getClassMeta(Boolean.class));
+			return bc.convertToType(o, cm);
+		}
+	}
+
+	/**
+	 * Bean property getter:  <property>maxItems</property>.
+	 *
+	 * @return The value of the <property>maxItems</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMaxItems() {
+		return maxItems;
+	}
+
+	/**
+	 * Bean property setter:  <property>maxItems</property>.
+	 *
+	 * @param maxItems The new value for the <property>maxItems</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMaxItems(Integer maxItems) {
+		this.maxItems = maxItems;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>minItems</property>.
+	 *
+	 * @return The value of the <property>minItems</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMinItems() {
+		return minItems;
+	}
+
+	/**
+	 * Bean property setter:  <property>minItems</property>.
+	 *
+	 * @param minItems The new value for the <property>minItems</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMinItems(Integer minItems) {
+		this.minItems = minItems;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>uniqueItems</property>.
+	 *
+	 * @return The value of the <property>uniqueItems</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Boolean getUniqueItems() {
+		return uniqueItems;
+	}
+
+	/**
+	 * Bean property setter:  <property>uniqueItems</property>.
+	 *
+	 * @param uniqueItems The new value for the <property>uniqueItems</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setUniqueItems(Boolean uniqueItems) {
+		this.uniqueItems = uniqueItems;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>maxProperties</property>.
+	 *
+	 * @return The value of the <property>maxProperties</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMaxProperties() {
+		return maxProperties;
+	}
+
+	/**
+	 * Bean property setter:  <property>maxProperties</property>.
+	 *
+	 * @param maxProperties The new value for the <property>maxProperties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMaxProperties(Integer maxProperties) {
+		this.maxProperties = maxProperties;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>minProperties</property>.
+	 *
+	 * @return The value of the <property>minProperties</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Integer getMinProperties() {
+		return minProperties;
+	}
+
+	/**
+	 * Bean property setter:  <property>minProperties</property>.
+	 *
+	 * @param minProperties The new value for the <property>minProperties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setMinProperties(Integer minProperties) {
+		this.minProperties = minProperties;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>required</property>.
+	 *
+	 * @return The value of the <property>required</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public List<String> getRequired() {
+		return required;
+	}
+
+	/**
+	 * Bean property setter:  <property>required</property>.
+	 *
+	 * @param required The new value for the <property>required</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setRequired(List<String> required) {
+		this.required = required;
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>required</property>.
+	 *
+	 * @param required The list of items to append to the <property>required</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addRequired(List<String> required) {
+		if (this.required == null)
+			this.required = new LinkedList<String>();
+		for (String r : required)
+			this.required.add(r);
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>required</property>.
+	 *
+	 * @param required The list of items to append to the <property>required</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addRequired(String...required) {
+		if (this.required == null)
+			this.required = new LinkedList<String>();
+		for (String r : required)
+			this.required.add(r);
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>required</property>.
+	 *
+	 * @param properties The list of items to append to the <property>required</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addRequired(SchemaProperty...properties) {
+		if (this.required == null)
+			this.required = new LinkedList<String>();
+		for (SchemaProperty p : properties)
+			this.required.add(p.getName());
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalProperties</property>.
+	 *
+	 * @return The value of the <property>additionalProperties</property> property on this bean, or <jk>null</jk> if it is not set.
+	 * Can be either a {@link Boolean} or {@link SchemaArray} depending on what value was used to set it.
+	 */
+	@BeanProperty(filter=BooleanOrSchemaFilter.class)
+	public Object getAdditionalProperties() {
+		if (additionalPropertiesBoolean != null)
+			return additionalItemsBoolean;
+		return additionalPropertiesSchema;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalProperties</property>.
+	 * <p>
+	 * Convenience method for returning the <property>additionalProperties</property> property when it is a {@link Boolean} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Schema}.
+	 */
+	@BeanIgnore
+	public Boolean getAdditionalPropertiesAsBoolean() {
+		return additionalPropertiesBoolean;
+	}
+
+	/**
+	 * Bean property getter:  <property>additionalProperties</property>.
+	 * <p>
+	 * Convenience method for returning the <property>additionalProperties</property> property when it is a {@link Schema} value.
+	 *
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Boolean}.
+	 */
+	@BeanIgnore
+	public Schema getAdditionalPropertiesAsSchema() {
+		return additionalPropertiesSchema;
+	}
+
+	/**
+	 * Bean property setter:  <property>additionalProperties</property>.
+	 *
+	 * @param additionalProperties The new value for the <property>additionalProperties</property> property on this bean.
+	 * This object must be of type {@link Boolean} or {@link Schema}.
+	 * @return This object (for method chaining).
+	 * @throws BeanRuntimeException If invalid object type passed in.
+	 */
+	public Schema setAdditionalProperties(Object additionalProperties) {
+		this.additionalPropertiesBoolean = null;
+		this.additionalPropertiesSchema = null;
+		if (additionalProperties != null) {
+			if (additionalProperties instanceof Boolean)
+				this.additionalPropertiesBoolean = (Boolean)additionalProperties;
+			else if (additionalProperties instanceof Schema) {
+				this.additionalPropertiesSchema = (Schema)additionalProperties;
+				setMasterOn(this.additionalPropertiesSchema);
+			} else
+				throw new BeanRuntimeException(SchemaProperty.class, "Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Boolean, Schema", additionalProperties.getClass().getName());
+		}
+		return this;
+	}
+
+	/**
+	 * Used during parsing to convert the <property>additionalProperties</property> property to the correct class type.
+	 * <ul>
+	 * 	<li>If parsing a JSON-object, converts to a {@link Schema}.
+	 * 	<li>If parsing a JSON-boolean, converts to a {@link Boolean}.
+	 * </ul>
+	 * Serialization method is a no-op.
+	 */
+	public static class BooleanOrSchemaFilter extends PojoFilter<Object,Object> {
+
+		@Override /* PojoFilter */
+		public Object filter(Object o) throws SerializeException {
+			return o;
+		}
+
+		@Override /* PojoFilter */
+		public Object unfilter(Object o, ClassMeta<?> hint) throws ParseException {
+			BeanContext bc = getBeanContext();
+			ClassMeta<?> cm = (o instanceof Boolean ? bc.getClassMeta(Boolean.class) : bc.getClassMeta(Schema.class));
+			return bc.convertToType(o, cm);
+		}
+	}
+
+	/**
+	 * Bean property getter:  <property>enum</property>.
+	 *
+	 * @return The value of the <property>enum</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public List<String> getEnum() {
+		return _enum;
+	}
+
+	/**
+	 * Bean property setter:  <property>enum</property>.
+	 *
+	 * @param _enum The new value for the <property>enum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setEnum(List<String> _enum) {
+		this._enum = _enum;
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>enum</property>.
+	 *
+	 * @param _enum The list of items to append to the <property>enum</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addEnum(String..._enum) {
+		if (this._enum == null)
+			this._enum = new LinkedList<String>();
+		for (String e : _enum)
+			this._enum.add(e);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>allOf</property>.
+	 *
+	 * @return The value of the <property>allOf</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public List<Schema> getAllOf() {
+		return allOf;
+	}
+
+	/**
+	 * Bean property setter:  <property>allOf</property>.
+	 *
+	 * @param allOf The new value for the <property>allOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setAllOf(List<Schema> allOf) {
+		this.allOf = allOf;
+		setMasterOn(allOf);
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>allOf</property>.
+	 *
+	 * @param allOf The list of items to append to the <property>allOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addAllOf(Schema...allOf) {
+		if (this.allOf == null)
+			this.allOf = new LinkedList<Schema>();
+		setMasterOn(allOf);
+		for (Schema s : allOf)
+			this.allOf.add(s);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>anyOf</property>.
+	 *
+	 * @return The value of the <property>anyOf</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public List<Schema> getAnyOf() {
+		return anyOf;
+	}
+
+	/**
+	 * Bean property setter:  <property>anyOf</property>.
+	 *
+	 * @param anyOf The new value of the <property>anyOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setAnyOf(List<Schema> anyOf) {
+		this.anyOf = anyOf;
+		setMasterOn(anyOf);
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>anyOf</property>.
+	 *
+	 * @param anyOf The list of items to append to the <property>anyOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addAnyOf(Schema...anyOf) {
+		if (this.anyOf == null)
+			this.anyOf = new LinkedList<Schema>();
+		setMasterOn(anyOf);
+		for (Schema s : anyOf)
+			this.anyOf.add(s);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>oneOf</property>.
+	 *
+	 * @return The value of the <property>oneOf</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public List<Schema> getOneOf() {
+		return oneOf;
+	}
+
+	/**
+	 * Bean property setter:  <property>oneOf</property>.
+	 *
+	 * @param oneOf The new value for the <property>oneOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setOneOf(List<Schema> oneOf) {
+		this.oneOf = oneOf;
+		setMasterOn(oneOf);
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>oneOf</property>.
+	 *
+	 * @param oneOf The list of items to append to the <property>oneOf</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema addOneOf(Schema...oneOf) {
+		if (this.oneOf == null)
+			this.oneOf = new LinkedList<Schema>();
+		setMasterOn(oneOf);
+		for (Schema s : oneOf)
+			this.oneOf.add(s);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>not</property>.
+	 *
+	 * @return The value of the <property>not</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public Schema getNot() {
+		return not;
+	}
+
+	/**
+	 * Bean property setter:  <property>not</property>.
+	 *
+	 * @param not The new value for the <property>not</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setNot(Schema not) {
+		this.not = not;
+		setMasterOn(not);
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>$ref</property>.
+	 *
+	 * @return The value of the <property>$ref</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@BeanProperty(name="$ref")
+	public URI getRef() {
+		return ref;
+	}
+
+	/**
+	 * Bean property setter:  <property>$ref</property>.
+	 *
+	 * @param ref The new value for the <property>$ref</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	@BeanProperty(name="$ref")
+	public Schema setRef(URI ref) {
+		this.ref = ref;
+		return this;
+	}
+
+	private void setMasterOn(Schema s) {
+		if (s != null)
+			s.setMaster(this);
+	}
+
+	private void setMasterOn(Schema[] ss) {
+		if (ss != null)
+			for (Schema s : ss)
+				setMasterOn(s);
+	}
+
+	private void setMasterOn(Collection<Schema> ss) {
+		if (ss != null)
+			for (Schema s : ss)
+				setMasterOn(s);
+	}
+
+	private void setMasterOn(SchemaArray ss) {
+		if (ss != null)
+			for (Schema s : ss)
+				setMasterOn(s);
+	}
+
+	/**
+	 * Sets the master schema for this schema and all child schema objects.
+	 * <p>
+	 * All child elements in a schema should point to a single "master" schema in order to
+	 * 	locate registered SchemaMap objects for resolving external schemas.
+	 *
+	 * @param master The master schema to associate on this and all children.  Can be <jk>null</jk>.
+	 */
+	protected void setMaster(Schema master) {
+		this.master = master;
+		if (definitions != null)
+			for (Schema s : definitions.values())
+				s.setMaster(master);
+		if (properties != null)
+			for (Schema s : properties.values())
+				s.setMaster(master);
+		if (patternProperties != null)
+			for (Schema s : patternProperties.values())
+				s.setMaster(master);
+		if (dependencies != null)
+			for (Schema s : dependencies.values())
+				s.setMaster(master);
+		if (itemsSchema != null)
+			itemsSchema.setMaster(master);
+		if (itemsSchemaArray != null)
+			for (Schema s : itemsSchemaArray)
+				s.setMaster(master);
+		if (additionalItemsSchemaArray != null)
+			for (Schema s : additionalItemsSchemaArray)
+				s.setMaster(master);
+		if (additionalPropertiesSchema != null)
+			additionalPropertiesSchema.setMaster(master);
+		if (allOf != null)
+			for (Schema s : allOf)
+				s.setMaster(master);
+		if (anyOf != null)
+			for (Schema s : anyOf)
+				s.setMaster(master);
+		if (oneOf != null)
+			for (Schema s : oneOf)
+				s.setMaster(master);
+		if (not != null)
+			not.setMaster(master);
+	}
+
+
+	/**
+	 * Bean property setter:  <property>$ref</property>.
+	 *
+	 * @param ref The new value for the <property>$ref</property> property on this bean.
+	 * The parameter must be a valid URI.  It can be <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setRef(String ref) {
+		return setRef(ref == null ? null : URI.create(ref));
+	}
+
+	/**
+	 * If this schema is a reference to another schema (i.e. has its <property>$ref</property> property set),
+	 * 	this method will retrieve the referenced schema from the schema map registered with this schema.
+	 * If this schema is not a reference, or no schema map is registered with this schema, this method
+	 * 	is a no-op and simply returns this object.
+	 *
+	 * @return The referenced schema, or <jk>null</jk>.
+	 */
+	public Schema resolve() {
+		if (ref == null || master.schemaMap == null)
+			return this;
+		return master.schemaMap.get(ref);
+	}
+
+	/**
+	 * Associates a schema map with this schema for resolving other schemas identified
+	 * 	through <property>$ref</property> properties.
+	 *
+	 * @param schemaMap The schema map to associate with this schema.  Can be <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public Schema setSchemaMap(SchemaMap schemaMap) {
+		this.schemaMap = schemaMap;
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.class
new file mode 100755
index 0000000..3ca3475
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.java
new file mode 100755
index 0000000..a789d1b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaArray.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.util.*;
+
+/**
+ * Represents a list of {@link Schema} objects.
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.jsonschema} for usage information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SchemaArray extends LinkedList<Schema> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Default constructor.
+	 */
+	public SchemaArray() {}
+
+	/**
+	 * Constructor with predefined types to add to this list.
+	 *
+	 * @param schemas The list of schemas in this array.
+	 */
+	public SchemaArray(Schema...schemas) {
+		addAll(schemas);
+	}
+
+	/**
+	 * Convenience method for adding one or more {@link Schema} objects to
+	 * 	this array.
+	 *
+	 * @param schemas The {@link Schema} objects to add to this array.
+	 * @return This object (for method chaining).
+	 */
+	public SchemaArray addAll(Schema...schemas) {
+		for (Schema s : schemas)
+			add(s);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.class
new file mode 100755
index 0000000..6af7a4e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.java
new file mode 100755
index 0000000..225cd2f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaMap.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.io.*;
+import java.net.*;
+import java.util.concurrent.*;
+
+import com.ibm.juno.core.json.*;
+
+/**
+ * A container for retrieving JSON {@link Schema} objects by URI.
+ * <p>
+ * 	Subclasses must implement one of the following methods to load schemas from external sources:
+ * <ul>
+ * 	<li>{@link #getReader(URI)} - If schemas should be loaded from readers and automatically parsed.
+ * 	<li>{@link #load(URI)} - If you want control over construction of {@link Schema} objects.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class SchemaMap extends ConcurrentHashMap<URI,Schema> {
+
+	private static final long serialVersionUID = 1L;
+
+	@Override /* Map */
+	public Schema get(Object uri) {
+		if (uri == null)
+			return null;
+		return get(URI.create(uri.toString()));
+	}
+
+	/**
+	 * Return the {@link Schema} object at the specified URI.
+	 * If this schema object has not been loaded yet, calls {@link #load(URI)}.
+	 *
+	 * @param uri The URI of the schema to retrieve.
+	 * @return The Schema, or <jk>null</jk> if schema was not located and could not be loaded.
+	 */
+	public Schema get(URI uri) {
+		Schema s = super.get(uri);
+		if (s != null)
+			return s;
+		synchronized(this) {
+			s = load(uri);
+			if (s != null) {
+				// Note:  Can't use add(Schema...) since the ID property may not be set.
+				s.setSchemaMap(this);
+				put(uri, s);
+			}
+			return s;
+		}
+	}
+
+	/**
+	 * Convenience method for prepopulating this map with the specified schemas.
+	 * <p>
+	 * The schemas passed in through this method MUST have their ID properties set.
+	 *
+	 * @param schemas The set of schemas to add to this map.
+	 * @return This object (for method chaining).
+	 * @throws RuntimeException If one or more schema objects did not have their ID property set.
+	 */
+	public SchemaMap add(Schema...schemas) {
+		for (Schema schema : schemas) {
+			if (schema.getId() == null)
+				throw new RuntimeException("Schema with no ID passed to SchemaMap.add(Schema...)");
+			put(schema.getId(), schema);
+			schema.setSchemaMap(this);
+		}
+		return this;
+	}
+
+	/**
+	 * Subclasses must implement either this method or {@link #getReader(URI)} to load the schema with the specified URI.
+	 * It's up to the implementer to decide where these come from.
+	 * <p>
+	 * The default implementation calls {@link #getReader(URI)} and parses the schema document.
+	 * If {@link #getReader(URI)} returns <jk>null</jk>, this method returns <jk>null</jk> indicating this is an unreachable document.
+	 *
+	 * @param uri The URI to load the schema from.
+	 * @return The parsed schema.
+	 */
+	public Schema load(URI uri) {
+		Reader r = getReader(uri);
+		if (r == null)
+			return null;
+		try {
+			return JsonParser.DEFAULT.parse(r, -1, Schema.class);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			try {
+				r.close();
+			} catch (IOException e) {
+				// Ignore
+			}
+		}
+	}
+
+	/**
+	 * Subclasses must implement either this method or {@link #load(URI)} to load the schema with the specified URI.
+	 * It's up to the implementer to decide where these come from.
+	 * <p>
+	 * The default implementation returns <jk>null</jk>.
+	 *
+	 * @param uri The URI to connect to and retrieve the contents.
+	 * @return The reader from reading the specified URI.
+	 */
+	public Reader getReader(URI uri) {
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.class
new file mode 100755
index 0000000..6392fc1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.class differ


[35/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/BrokenCognosOutput.txt
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/BrokenCognosOutput.txt b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/BrokenCognosOutput.txt
new file mode 100755
index 0000000..948fe0b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/BrokenCognosOutput.txt
@@ -0,0 +1 @@
+{"filterResultSet":{"secondaryOperations":[{"value":"RELEASE"}],"locationReference":[{"ref":"R1","di":"Type","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[1]/listColumnTitle/contents/textItem"},{"ref":"R2","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[1]/listColumnTitle"},{"ref":"R3","di":"ID","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[2]/listColumnTitle/contents/textItem"},{"ref":"R4","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[2]/listColumnTitle"},{"ref":"R5","di":"Name","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[3]/listColumnTitle/contents/textItem"},{"ref":"R6","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[3]/listColumnTitle"},{"ref":"R7","di":"CrossTrack URL","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listCo
 lumns/listColumn[4]/listColumnTitle/contents/textItem"},{"ref":"R8","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[4]/listColumnTitle"},{"ref":"R9","di":"Tooltip","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[5]/listColumnTitle/contents/textItem"},{"ref":"R10","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[5]/listColumnTitle"},{"ref":"R11","di":"Full Path","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[6]/listColumnTitle/contents/textItem"},{"ref":"R12","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[6]/listColumnTitle"},{"ref":"R13","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[7]/listColumnTitle/contents/textItem"},{"ref":"R14","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[7]/listColumnTitle"},{"ref":"R1
 5","di":"Risk Name","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[8]/listColumnTitle/contents/textItem"},{"ref":"R16","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[8]/listColumnTitle"},{"ref":"R17","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[9]/listColumnTitle/contents/textItem"},{"ref":"R18","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[9]/listColumnTitle"},{"ref":"R19","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[10]/listColumnTitle/contents/textItem"},{"ref":"R20","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[10]/listColumnTitle"},{"ref":"R21","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[11]/listColumnTitle/contents/textItem"},{"ref":"R22","loc":"./layouts/layout/reportPages/page/pageBody/conte
 nts/list/listColumns/listColumn[11]/listColumnTitle"},{"ref":"R23","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[12]/listColumnTitle/contents/textItem"},{"ref":"R24","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[12]/listColumnTitle"},{"ref":"R25","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[13]/listColumnTitle/contents/textItem"},{"ref":"R26","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[13]/listColumnTitle"},{"ref":"R27","di":"Control Name","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[14]/listColumnTitle/contents/textItem"},{"ref":"R28","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[14]/listColumnTitle"},{"ref":"R29","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[15]/listColumnTitle/contents/textItem
 "},{"ref":"R30","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[15]/listColumnTitle"},{"ref":"R31","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[16]/listColumnTitle/contents/textItem"},{"ref":"R32","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[16]/listColumnTitle"},{"ref":"R33","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[17]/listColumnTitle/contents/textItem"},{"ref":"R34","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[17]/listColumnTitle"},{"ref":"R35","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[18]/listColumnTitle/contents/textItem"},{"ref":"R36","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[18]/listColumnTitle"},{"ref":"R37","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColum
 ns"},{"ref":"R38","di":"Type","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[1]/listColumnBody/contents/textItem"},{"ref":"R39","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[1]/listColumnBody"},{"ref":"R40","di":"ID","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[2]/listColumnBody/contents/textItem"},{"ref":"R41","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[2]/listColumnBody"},{"ref":"R42","di":"Name","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[3]/listColumnBody/contents/textItem"},{"ref":"R43","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[3]/listColumnBody"},{"ref":"R44","di":"CrossTrack URL","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[4]/listColumnBody/contents/textItem"},{"ref":"R45","loc":"./la
 youts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[4]/listColumnBody"},{"ref":"R46","di":"Tooltip","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[5]/listColumnBody/contents/textItem"},{"ref":"R47","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[5]/listColumnBody"},{"ref":"R48","di":"Full Path","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[6]/listColumnBody/contents/textItem"},{"ref":"R49","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[6]/listColumnBody"},{"ref":"R50","di":"Risk ID","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[7]/listColumnBody/contents/textItem"},{"ref":"R51","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[7]/listColumnBody"},{"ref":"R52","di":"Risk Name","loc":"./layouts/layout/reportPages/page/pageBody/
 contents/list/listColumns/listColumn[8]/listColumnBody/contents/textItem"},{"ref":"R53","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[8]/listColumnBody"},{"ref":"R54","di":"Risk CrossTrack URL","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[9]/listColumnBody/contents/textItem"},{"ref":"R55","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[9]/listColumnBody"},{"ref":"R56","di":"Risk Tooltip","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[10]/listColumnBody/contents/textItem"},{"ref":"R57","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[10]/listColumnBody"},{"ref":"R58","di":"Risk Status","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[11]/listColumnBody/contents/textItem"},{"ref":"R59","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/li
 stColumns/listColumn[11]/listColumnBody"},{"ref":"R60","di":"Risk Full Path","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[12]/listColumnBody/contents/textItem"},{"ref":"R61","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[12]/listColumnBody"},{"ref":"R62","di":"Control ID","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[13]/listColumnBody/contents/textItem"},{"ref":"R63","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[13]/listColumnBody"},{"ref":"R64","di":"Control Name","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[14]/listColumnBody/contents/textItem"},{"ref":"R65","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[14]/listColumnBody"},{"ref":"R66","di":"Control CrossTrack URL","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColu
 mns/listColumn[15]/listColumnBody/contents/textItem"},{"ref":"R67","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[15]/listColumnBody"},{"ref":"R68","di":"Control Tooltip","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[16]/listColumnBody/contents/textItem"},{"ref":"R69","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[16]/listColumnBody"},{"ref":"R70","di":"Control Status","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[17]/listColumnBody/contents/textItem"},{"ref":"R71","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[17]/listColumnBody"},{"ref":"R72","di":"Control Full Path","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/listColumn[18]/listColumnBody/contents/textItem"},{"ref":"R73","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns/list
 Column[18]/listColumnBody"},{"ref":"R74","loc":"./layouts/layout/reportPages/page/pageBody/contents/list/listColumns"},{"ref":"R75","loc":"./layouts/layout/reportPages/page/pageBody/contents/list"},{"ref":"R76","loc":"./layouts/layout/reportPages/page/pageBody"},{"ref":"R77","loc":"./layouts/layout/reportPages/page"},{"ref":"R78","loc":"./layouts/layout/reportPages/page"}],"filterResult":[{"filterType":"OBJECT_ID","filterValue":"Process Data","reportElement":[{"lst":{"id":"Process Data","ref":"R75","style":["S75"],"colTitle":[{"ref":"R2","style":["S2"],"item":[{"txt":{"ref":"R1","ctx":"1","style":["S1"],"val":"Type","valTyp":"text"}}]},{"ref":"R4","style":["S4"],"item":[{"txt":{"ref":"R3","ctx":"2","style":["S3"],"val":"ID","valTyp":"text"}}]},{"ref":"R6","style":["S6"],"item":[{"txt":{"ref":"R5","ctx":"3","style":["S5"],"val":"Name","valTyp":"text"}}]},{"ref":"R8","style":["S8"],"item":[{"txt":{"ref":"R7","ctx":"4","style":["S7"],"val":"CrossTrack URL","valTyp":"text"}}]},{"ref":"R
 10","style":["S10"],"item":[{"txt":{"ref":"R9","ctx":"5","style":["S9"],"val":"Tooltip","valTyp":"text"}}]},{"ref":"R12","style":["S12"],"item":[{"txt":{"ref":"R11","ctx":"6","style":["S11"],"val":"Full Path","valTyp":"text"}}]},{"ref":"R14","style":["S14"],"item":[{"txt":{"ref":"R13","ctx":"7","style":["S13"],"val":"Risk ID","valTyp":"text"}}]},{"ref":"R16","style":["S16"],"item":[{"txt":{"ref":"R15","ctx":"8","style":["S15"],"val":"Risk Name","valTyp":"text"}}]},{"ref":"R18","style":["S18"],"item":[{"txt":{"ref":"R17","ctx":"9","style":["S17"],"val":"Risk CrossTrack URL","valTyp":"text"}}]},{"ref":"R20","style":["S20"],"item":[{"txt":{"ref":"R19","ctx":"10","style":["S19"],"val":"Risk Tooltip","valTyp":"text"}}]},{"ref":"R22","style":["S22"],"item":[{"txt":{"ref":"R21","ctx":"11","style":["S21"],"val":"Risk Status","valTyp":"text"}}]},{"ref":"R24","style":["S24"],"item":[{"txt":{"ref":"R23","ctx":"12","style":["S23"],"val":"Risk Full Path","valTyp":"text"}}]},{"ref":"R26","style":
 ["S26"],"item":[{"txt":{"ref":"R25","ctx":"13","style":["S25"],"val":"Control ID","valTyp":"text"}}]},{"ref":"R28","style":["S28"],"item":[{"txt":{"ref":"R27","ctx":"14","style":["S27"],"val":"Control Name","valTyp":"text"}}]},{"ref":"R30","style":["S30"],"item":[{"txt":{"ref":"R29","ctx":"15","style":["S29"],"val":"Control CrossTrack URL","valTyp":"text"}}]},{"ref":"R32","style":["S32"],"item":[{"txt":{"ref":"R31","ctx":"16","style":["S31"],"val":"Control Tooltip","valTyp":"text"}}]},{"ref":"R34","style":["S34"],"item":[{"txt":{"ref":"R33","ctx":"17","style":["S33"],"val":"Control Status","valTyp":"text"}}]},{"ref":"R36","style":["S36"],"item":[{"txt":{"ref":"R35","ctx":"18","style":["S35"],"val":"Control Full Path","valTyp":"text"}}]}],"group":{"row":[{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36","style":["S38"],"val":"P","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","c
 tx":"20:19:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36","style":["S40"],"val":"685","valTyp":"number","fmtVal":"685","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"21:19:20:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36","style":["S42"],"val":"Get ready to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"22:19:20:21:23:24:25:26:27:28:29:30:31:32:33:34:35:36","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=685","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"23:19:20:21:22:24:25:26:27:28:29:30:31:32:33:34:35:36","style":["S46"],"val":"Created by Emily for Testing. This would hold all the subprocesses that I need to get ready to work in the morning","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"24:19:20:21:22:23:25:26:27:28:29:30:31:32:33:34:35:36","style":["S48"],"val
 ":"/Emily/Get ready to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"25:19:20:21:22:23:24:26:27:28:29:30:31:32:33:34:35:36","style":["S50"],"val":,"valErrorState":"NULL","valTyp":"number"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"26:19:20:21:22:23:24:25:27:28:29:30:31:32:33:34:35:36","style":["S52"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"27:19:20:21:22:23:24:25:26:28:29:30:31:32:33:34:35:36","style":["S54"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"28:19:20:21:22:23:24:25:26:27:29:30:31:32:33:34:35:36","style":["S56"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"29:19:20:21:22:23:24:25:26:27:28:30:31:32:33:34:35:36","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":
 ["S61"],"item":[{"txt":{"ref":"R60","ctx":"30:19:20:21:22:23:24:25:26:27:28:29:31:32:33:34:35:36","style":["S60"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"31:19:20:21:22:23:24:25:26:27:28:29:30:32:33:34:35:36","style":["S62"],"val":,"valErrorState":"NULL","valTyp":"number"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"32:19:20:21:22:23:24:25:26:27:28:29:30:31:33:34:35:36","style":["S64"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"33:19:20:21:22:23:24:25:26:27:28:29:30:31:32:34:35:36","style":["S66"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"34:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:35:36","style":["S68"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"35:19:20:21:22:23:24:25:26:
 27:28:29:30:31:32:33:34:36","style":["S70"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"36:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35","style":["S72"],"val":,"valErrorState":"NULL","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"38:37:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54","style":["S40"],"val":"688","valTyp":"number","fmtVal":"688","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"39:37:38:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54","style":["S42"],"val":"Blowdry my hair","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"40:37:38:39:41:42:43:44:45:46:47:48:49:50:51:52:53:54","style":["S44"],"val":"ht
 tp://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=688","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"41:37:38:39:40:42:43:44:45:46:47:48:49:50:51:52:53:54","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"42:37:38:39:40:41:43:44:45:46:47:48:49:50:51:52:53:54","style":["S48"],"val":"/Emily/Get ready to work/Blowdry my hair","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"43:37:38:39:40:41:42:44:45:46:47:48:49:50:51:52:53:54","style":["S50"],"val":"701","valTyp":"number","fmtVal":"701","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"44:37:38:39:40:41:42:43:45:46:47:48:49:50:51:52:53:54","style":["S52"],"val":"R1","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"45:37:38:39:40:41:42:43:44:46:47:48:49:50:51:52:53:54","style":[
 "S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=701","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"46:37:38:39:40:41:42:43:44:45:47:48:49:50:51:52:53:54","style":["S56"],"val":"Broken hair dryer","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"47:37:38:39:40:41:42:43:44:45:46:48:49:50:51:52:53:54","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"48:37:38:39:40:41:42:43:44:45:46:47:49:50:51:52:53:54","style":["S60"],"val":"/Emily/Get ready to work/Broken hair dryer","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"49:37:38:39:40:41:42:43:44:45:46:47:48:50:51:52:53:54","style":["S62"],"val":"741","valTyp":"number","fmtVal":"741","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"50:37:38:39:40:41:42:43:44:45:4
 6:47:48:49:51:52:53:54","style":["S64"],"val":"C1","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"51:37:38:39:40:41:42:43:44:45:46:47:48:49:50:52:53:54","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=741","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"52:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:53:54","style":["S68"],"val":"Buy new hair dryer","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"53:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:54","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"54:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53","style":["S72"],"val":"/Emily/Get ready to work/Broken hair dryer/Buy new hair dryer","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"55:56:57:58:59:60:61:62:63:
 64:65:66:67:68:69:70:71:72","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"56:55:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72","style":["S40"],"val":"689","valTyp":"number","fmtVal":"689","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"57:55:56:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72","style":["S42"],"val":"Brush my teeth","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"58:55:56:57:59:60:61:62:63:64:65:66:67:68:69:70:71:72","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=689","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"59:55:56:57:58:60:61:62:63:64:65:66:67:68:69:70:71:72","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"60:55:56:57:58:59:61:62:63:64:65:66:67
 :68:69:70:71:72","style":["S48"],"val":"/Emily/Get ready to work/Brush my teeth","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"61:55:56:57:58:59:60:62:63:64:65:66:67:68:69:70:71:72","style":["S50"],"val":"703","valTyp":"number","fmtVal":"703","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"62:55:56:57:58:59:60:61:63:64:65:66:67:68:69:70:71:72","style":["S52"],"val":"R2","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"63:55:56:57:58:59:60:61:62:64:65:66:67:68:69:70:71:72","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=703","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"64:55:56:57:58:59:60:61:62:63:65:66:67:68:69:70:71:72","style":["S56"],"val":"Broken tooth brush","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"65:55:56:57:58:59:60:61:62
 :63:64:66:67:68:69:70:71:72","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"66:55:56:57:58:59:60:61:62:63:64:65:67:68:69:70:71:72","style":["S60"],"val":"/Emily/Get ready to work/Broken tooth brush","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"67:55:56:57:58:59:60:61:62:63:64:65:66:68:69:70:71:72","style":["S62"],"val":"750","valTyp":"number","fmtVal":"750","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"68:55:56:57:58:59:60:61:62:63:64:65:66:67:69:70:71:72","style":["S64"],"val":"C2","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"69:55:56:57:58:59:60:61:62:63:64:65:66:67:68:70:71:72","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=750","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"70:55:5
 6:57:58:59:60:61:62:63:64:65:66:67:68:69:71:72","style":["S68"],"val":"Buy tooth brush","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"71:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:72","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"72:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71","style":["S72"],"val":"/Emily/Get ready to work/Broken tooth brush/Buy tooth brush","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"73:56:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"56:73:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89","style":["S40"],"val":"689","valTyp":"number","fmtVal":"689","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"74:73:56:75:76:77:78:79:80:81
 :82:83:84:85:86:87:88:89","style":["S42"],"val":"Brush my teeth","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"75:73:56:74:76:77:78:79:80:81:82:83:84:85:86:87:88:89","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=689","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"76:73:56:74:75:77:78:79:80:81:82:83:84:85:86:87:88:89","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"77:73:56:74:75:76:78:79:80:81:82:83:84:85:86:87:88:89","style":["S48"],"val":"/Emily/Get ready to work/Brush my teeth","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"78:73:56:74:75:76:77:79:80:81:82:83:84:85:86:87:88:89","style":["S50"],"val":"725","valTyp":"number","fmtVal":"725","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"79
 :73:56:74:75:76:77:78:80:81:82:83:84:85:86:87:88:89","style":["S52"],"val":"R3","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"80:73:56:74:75:76:77:78:79:81:82:83:84:85:86:87:88:89","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=725","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"81:73:56:74:75:76:77:78:79:80:82:83:84:85:86:87:88:89","style":["S56"],"val":"Out of tooth paste","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"82:73:56:74:75:76:77:78:79:80:81:83:84:85:86:87:88:89","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"83:73:56:74:75:76:77:78:79:80:81:82:84:85:86:87:88:89","style":["S60"],"val":"/Emily/Get ready to work/Out of tooth paste","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"84:73:56:74:75:76:77
 :78:79:80:81:82:83:85:86:87:88:89","style":["S62"],"val":"753","valTyp":"number","fmtVal":"753","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"85:73:56:74:75:76:77:78:79:80:81:82:83:84:86:87:88:89","style":["S64"],"val":"C16","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"86:73:56:74:75:76:77:78:79:80:81:82:83:84:85:87:88:89","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=753","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"87:73:56:74:75:76:77:78:79:80:81:82:83:84:85:86:88:89","style":["S68"],"val":"Buy toothpaste","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"88:73:56:74:75:76:77:78:79:80:81:82:83:84:85:86:87:89","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"89:73:56:74:75:76:77:78:79:80:81:82:
 83:84:85:86:87:88","style":["S72"],"val":"/Emily/Get ready to work/Out of tooth paste/Buy toothpaste","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"90:91:92:93:94:95:25:96:97:98:99:100:31:101:102:103:104:105","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"91:90:92:93:94:95:25:96:97:98:99:100:31:101:102:103:104:105","style":["S40"],"val":"690","valTyp":"number","fmtVal":"690","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"92:90:91:93:94:95:25:96:97:98:99:100:31:101:102:103:104:105","style":["S42"],"val":"Check for weather","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"93:90:91:92:94:95:25:96:97:98:99:100:31:101:102:103:104:105","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=690","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":
 [{"txt":{"ref":"R46","ctx":"94:90:91:92:93:95:25:96:97:98:99:100:31:101:102:103:104:105","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"95:90:91:92:93:94:25:96:97:98:99:100:31:101:102:103:104:105","style":["S48"],"val":"/Emily/Get ready to work/Check for weather","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"25:90:91:92:93:94:95:96:97:98:99:100:31:101:102:103:104:105","style":["S50"],"val":,"valErrorState":"NULL","valTyp":"number","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"96:90:91:92:93:94:95:25:97:98:99:100:31:101:102:103:104:105","style":["S52"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"97:90:91:92:93:94:95:25:96:98:99:100:31:101:102:103:104:105","style":["S54"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R57","style"
 :["S57"],"item":[{"txt":{"ref":"R56","ctx":"98:90:91:92:93:94:95:25:96:97:99:100:31:101:102:103:104:105","style":["S56"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"99:90:91:92:93:94:95:25:96:97:98:100:31:101:102:103:104:105","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"100:90:91:92:93:94:95:25:96:97:98:99:31:101:102:103:104:105","style":["S60"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"31:90:91:92:93:94:95:25:96:97:98:99:100:101:102:103:104:105","style":["S62"],"val":,"valErrorState":"NULL","valTyp":"number","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"101:90:91:92:93:94:95:25:96:97:98:99:100:31:102:103:104:105","style":["S64"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R67","style":["S6
 7"],"item":[{"txt":{"ref":"R66","ctx":"102:90:91:92:93:94:95:25:96:97:98:99:100:31:101:103:104:105","style":["S66"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"103:90:91:92:93:94:95:25:96:97:98:99:100:31:101:102:104:105","style":["S68"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"104:90:91:92:93:94:95:25:96:97:98:99:100:31:101:102:103:105","style":["S70"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"105:90:91:92:93:94:95:25:96:97:98:99:100:31:101:102:103:104","style":["S72"],"val":,"valErrorState":"NULL","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"
 107:106:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123","style":["S40"],"val":"691","valTyp":"number","fmtVal":"691","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"108:106:107:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123","style":["S42"],"val":"Cook breakfast","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"109:106:107:108:110:111:112:113:114:115:116:117:118:119:120:121:122:123","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=691","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"110:106:107:108:109:111:112:113:114:115:116:117:118:119:120:121:122:123","style":["S46"],"val":"Hey this is the subprocess for cook breakfast. What I usually eat for breakfast: bacon bacon bacon","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"111:106:107:108:109:110:112
 :113:114:115:116:117:118:119:120:121:122:123","style":["S48"],"val":"/Emily/Get ready to work/Cook breakfast","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"112:106:107:108:109:110:111:113:114:115:116:117:118:119:120:121:122:123","style":["S50"],"val":"705","valTyp":"number","fmtVal":"705","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"113:106:107:108:109:110:111:112:114:115:116:117:118:119:120:121:122:123","style":["S52"],"val":"R4","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"114:106:107:108:109:110:111:112:113:115:116:117:118:119:120:121:122:123","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=705","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"115:106:107:108:109:110:111:112:113:114:116:117:118:119:120:121:122:123","style":["S56"],"val":"Burn the breakfast","valTyp":
 "text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"116:106:107:108:109:110:111:112:113:114:115:117:118:119:120:121:122:123","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"117:106:107:108:109:110:111:112:113:114:115:116:118:119:120:121:122:123","style":["S60"],"val":"/Emily/Get ready to work/Burn the breakfast","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"118:106:107:108:109:110:111:112:113:114:115:116:117:119:120:121:122:123","style":["S62"],"val":"780","valTyp":"number","fmtVal":"780","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"119:106:107:108:109:110:111:112:113:114:115:116:117:118:120:121:122:123","style":["S64"],"val":"C3","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"120:106:107:108:109:110:111:112:113:114:115:116:117:118:119:121:122:123",
 "style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=780","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"121:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:122:123","style":["S68"],"val":"throw it away","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"122:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:123","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"123:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122","style":["S72"],"val":"/Emily/Get ready to work/Burn the breakfast/throw it away","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"124:107:125:126:127:128:129:130:131:132:133:134:31:135:136:137:138:139","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R4
 0","ctx":"107:124:125:126:127:128:129:130:131:132:133:134:31:135:136:137:138:139","style":["S40"],"val":"691","valTyp":"number","fmtVal":"691","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"125:124:107:126:127:128:129:130:131:132:133:134:31:135:136:137:138:139","style":["S42"],"val":"Cook breakfast","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"126:124:107:125:127:128:129:130:131:132:133:134:31:135:136:137:138:139","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=691","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"127:124:107:125:126:128:129:130:131:132:133:134:31:135:136:137:138:139","style":["S46"],"val":"Hey this is the subprocess for cook breakfast. What I usually eat for breakfast: bacon bacon bacon","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"128:124:107:125:126:1
 27:129:130:131:132:133:134:31:135:136:137:138:139","style":["S48"],"val":"/Emily/Get ready to work/Cook breakfast","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"129:124:107:125:126:127:128:130:131:132:133:134:31:135:136:137:138:139","style":["S50"],"val":"711","valTyp":"number","fmtVal":"711","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"130:124:107:125:126:127:128:129:131:132:133:134:31:135:136:137:138:139","style":["S52"],"val":"R5","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"131:124:107:125:126:127:128:129:130:132:133:134:31:135:136:137:138:139","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=711","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"132:124:107:125:126:127:128:129:130:131:133:134:31:135:136:137:138:139","style":["S56"],"val":"Forgot to turn off the stove
 ","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"133:124:107:125:126:127:128:129:130:131:132:134:31:135:136:137:138:139","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"134:124:107:125:126:127:128:129:130:131:132:133:31:135:136:137:138:139","style":["S60"],"val":"/Emily/Get ready to work/Forgot to turn off the stove","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"31:124:107:125:126:127:128:129:130:131:132:133:134:135:136:137:138:139","style":["S62"],"val":,"valErrorState":"NULL","valTyp":"number","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"135:124:107:125:126:127:128:129:130:131:132:133:134:31:136:137:138:139","style":["S64"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"136:124:107:125:126:127:128:129:13
 0:131:132:133:134:31:135:137:138:139","style":["S66"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"137:124:107:125:126:127:128:129:130:131:132:133:134:31:135:136:138:139","style":["S68"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"138:124:107:125:126:127:128:129:130:131:132:133:134:31:135:136:137:139","style":["S70"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"139:124:107:125:126:127:128:129:130:131:132:133:134:31:135:136:137:138","style":["S72"],"val":,"valErrorState":"NULL","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"140:107:141:142:143:144:145:146:147:148:149:150:151:152:153:154:155:156","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"107:140:141:142:143:144:145:1
 46:147:148:149:150:151:152:153:154:155:156","style":["S40"],"val":"691","valTyp":"number","fmtVal":"691","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"141:140:107:142:143:144:145:146:147:148:149:150:151:152:153:154:155:156","style":["S42"],"val":"Cook breakfast","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"142:140:107:141:143:144:145:146:147:148:149:150:151:152:153:154:155:156","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=691","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"143:140:107:141:142:144:145:146:147:148:149:150:151:152:153:154:155:156","style":["S46"],"val":"Hey this is the subprocess for cook breakfast. What I usually eat for breakfast: bacon bacon bacon","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"144:140:107:141:142:143:145:146:147:148:149:150:151:152:
 153:154:155:156","style":["S48"],"val":"/Emily/Get ready to work/Cook breakfast","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"145:140:107:141:142:143:144:146:147:148:149:150:151:152:153:154:155:156","style":["S50"],"val":"715","valTyp":"number","fmtVal":"715","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"146:140:107:141:142:143:144:145:147:148:149:150:151:152:153:154:155:156","style":["S52"],"val":"R6","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"147:140:107:141:142:143:144:145:146:148:149:150:151:152:153:154:155:156","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=715","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"148:140:107:141:142:143:144:145:146:147:149:150:151:152:153:154:155:156","style":["S56"],"val":"No food in the fridge","valTyp":"text"}}]},{"ref":"R59","s
 tyle":["S59"],"item":[{"txt":{"ref":"R58","ctx":"149:140:107:141:142:143:144:145:146:147:148:150:151:152:153:154:155:156","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"150:140:107:141:142:143:144:145:146:147:148:149:151:152:153:154:155:156","style":["S60"],"val":"/Emily/Get ready to work/No food in the fridge","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"151:140:107:141:142:143:144:145:146:147:148:149:150:152:153:154:155:156","style":["S62"],"val":"775","valTyp":"number","fmtVal":"775","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"152:140:107:141:142:143:144:145:146:147:148:149:150:151:153:154:155:156","style":["S64"],"val":"C10","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"153:140:107:141:142:143:144:145:146:147:148:149:150:151:152:154:155:156","style":["S66"],"val":
 "http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=775","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"154:140:107:141:142:143:144:145:146:147:148:149:150:151:152:153:155:156","style":["S68"],"val":"Stock up the fridge","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"155:140:107:141:142:143:144:145:146:147:148:149:150:151:152:153:154:156","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"156:140:107:141:142:143:144:145:146:147:148:149:150:151:152:153:154:155","style":["S72"],"val":"/Emily/Get ready to work/No food in the fridge/Stock up the fridge","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"157:107:158:159:160:161:162:163:164:165:166:167:31:168:169:170:171:172","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx
 ":"107:157:158:159:160:161:162:163:164:165:166:167:31:168:169:170:171:172","style":["S40"],"val":"691","valTyp":"number","fmtVal":"691","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"158:157:107:159:160:161:162:163:164:165:166:167:31:168:169:170:171:172","style":["S42"],"val":"Cook breakfast","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"159:157:107:158:160:161:162:163:164:165:166:167:31:168:169:170:171:172","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=691","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"160:157:107:158:159:161:162:163:164:165:166:167:31:168:169:170:171:172","style":["S46"],"val":"Hey this is the subprocess for cook breakfast. What I usually eat for breakfast: bacon bacon bacon","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"161:157:107:158:159:160:162:
 163:164:165:166:167:31:168:169:170:171:172","style":["S48"],"val":"/Emily/Get ready to work/Cook breakfast","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"162:157:107:158:159:160:161:163:164:165:166:167:31:168:169:170:171:172","style":["S50"],"val":"727","valTyp":"number","fmtVal":"727","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"163:157:107:158:159:160:161:162:164:165:166:167:31:168:169:170:171:172","style":["S52"],"val":"R7","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"164:157:107:158:159:160:161:162:163:165:166:167:31:168:169:170:171:172","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=727","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"165:157:107:158:159:160:161:162:163:164:166:167:31:168:169:170:171:172","style":["S56"],"val":"power outage","valTyp":"text"}}]},{
 "ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"166:157:107:158:159:160:161:162:163:164:165:167:31:168:169:170:171:172","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"167:157:107:158:159:160:161:162:163:164:165:166:31:168:169:170:171:172","style":["S60"],"val":"/Emily/Get ready to work/power outage","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"31:157:107:158:159:160:161:162:163:164:165:166:167:168:169:170:171:172","style":["S62"],"val":,"valErrorState":"NULL","valTyp":"number","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"168:157:107:158:159:160:161:162:163:164:165:166:167:31:169:170:171:172","style":["S64"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"169:157:107:158:159:160:161:162:163:164:165:166:167:31:168:170:171:172","
 style":["S66"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"170:157:107:158:159:160:161:162:163:164:165:166:167:31:168:169:171:172","style":["S68"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"171:157:107:158:159:160:161:162:163:164:165:166:167:31:168:169:170:172","style":["S70"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"172:157:107:158:159:160:161:162:163:164:165:166:167:31:168:169:170:171","style":["S72"],"val":,"valErrorState":"NULL","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"173:174:175:176:177:178:179:180:181:182:183:184:31:185:186:187:188:189","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:173:175:176:177:178:179:180:181:182:183:184:31:185:186:187:188:18
 9","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"175:173:174:176:177:178:179:180:181:182:183:184:31:185:186:187:188:189","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"176:173:174:175:177:178:179:180:181:182:183:184:31:185:186:187:188:189","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"177:173:174:175:176:178:179:180:181:182:183:184:31:185:186:187:188:189","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"178:173:174:175:176:177:179:180:181:182:183:184:31:185:186:187:188:189","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["
 S51"],"item":[{"txt":{"ref":"R50","ctx":"179:173:174:175:176:177:178:180:181:182:183:184:31:185:186:187:188:189","style":["S50"],"val":"699","valTyp":"number","fmtVal":"699","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"180:173:174:175:176:177:178:179:181:182:183:184:31:185:186:187:188:189","style":["S52"],"val":"R8","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"181:173:174:175:176:177:178:179:180:182:183:184:31:185:186:187:188:189","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=699","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"182:173:174:175:176:177:178:179:180:181:183:184:31:185:186:187:188:189","style":["S56"],"val":"bad road condition","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"183:173:174:175:176:177:178:179:180:181:182:184:31:185:186:187:188:189","style":["
 S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"184:173:174:175:176:177:178:179:180:181:182:183:31:185:186:187:188:189","style":["S60"],"val":"/Emily/Get ready to work/bad road condition","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"31:173:174:175:176:177:178:179:180:181:182:183:184:185:186:187:188:189","style":["S62"],"val":,"valErrorState":"NULL","valTyp":"number","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"185:173:174:175:176:177:178:179:180:181:182:183:184:31:186:187:188:189","style":["S64"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"186:173:174:175:176:177:178:179:180:181:182:183:184:31:185:187:188:189","style":["S66"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"187:173:17
 4:175:176:177:178:179:180:181:182:183:184:31:185:186:188:189","style":["S68"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"188:173:174:175:176:177:178:179:180:181:182:183:184:31:185:186:187:189","style":["S70"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"189:173:174:175:176:177:178:179:180:181:182:183:184:31:185:186:187:188","style":["S72"],"val":,"valErrorState":"NULL","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"190:174:191:192:193:194:195:196:197:198:199:200:201:202:203:204:205:206","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:190:191:192:193:194:195:196:197:198:199:200:201:202:203:204:205:206","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item
 ":[{"txt":{"ref":"R42","ctx":"191:190:174:192:193:194:195:196:197:198:199:200:201:202:203:204:205:206","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"192:190:174:191:193:194:195:196:197:198:199:200:201:202:203:204:205:206","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"193:190:174:191:192:194:195:196:197:198:199:200:201:202:203:204:205:206","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"194:190:174:191:192:193:195:196:197:198:199:200:201:202:203:204:205:206","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"195:190:174:191:192:193:194:196:197:198:199:200:201:202:203:204:205:206","style":["S50"],"va
 l":"707","valTyp":"number","fmtVal":"707","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"196:190:174:191:192:193:194:195:197:198:199:200:201:202:203:204:205:206","style":["S52"],"val":"R9","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"197:190:174:191:192:193:194:195:196:198:199:200:201:202:203:204:205:206","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=707","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"198:190:174:191:192:193:194:195:196:197:199:200:201:202:203:204:205:206","style":["S56"],"val":"Flat tires","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"199:190:174:191:192:193:194:195:196:197:198:200:201:202:203:204:205:206","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"200:190:174:191:
 192:193:194:195:196:197:198:199:201:202:203:204:205:206","style":["S60"],"val":"/Emily/Get ready to work/Flat tires","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"201:190:174:191:192:193:194:195:196:197:198:199:200:202:203:204:205:206","style":["S62"],"val":"756","valTyp":"number","fmtVal":"756","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"202:190:174:191:192:193:194:195:196:197:198:199:200:201:203:204:205:206","style":["S64"],"val":"C4","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"203:190:174:191:192:193:194:195:196:197:198:199:200:201:202:204:205:206","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=756","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"204:190:174:191:192:193:194:195:196:197:198:199:200:201:202:203:205:206","style":["S68"],"val":"Change new tires","val
 Typ":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"205:190:174:191:192:193:194:195:196:197:198:199:200:201:202:203:204:206","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"206:190:174:191:192:193:194:195:196:197:198:199:200:201:202:203:204:205","style":["S72"],"val":"/Emily/Get ready to work/Flat tires/Change new tires","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"207:174:208:209:210:211:195:212:213:214:215:216:217:218:219:220:221:222","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:207:208:209:210:211:195:212:213:214:215:216:217:218:219:220:221:222","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"208:207:174:209:210:211:195:212:213:214:215:216:217:218:
 219:220:221:222","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"209:207:174:208:210:211:195:212:213:214:215:216:217:218:219:220:221:222","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"210:207:174:208:209:211:195:212:213:214:215:216:217:218:219:220:221:222","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"211:207:174:208:209:210:195:212:213:214:215:216:217:218:219:220:221:222","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"195:207:174:208:209:210:211:212:213:214:215:216:217:218:219:220:221:222","style":["S50"],"val":"707","valTyp":"number","fmtVal":"707","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref
 ":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"212:207:174:208:209:210:211:195:213:214:215:216:217:218:219:220:221:222","style":["S52"],"val":"R9","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"213:207:174:208:209:210:211:195:212:214:215:216:217:218:219:220:221:222","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=707","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"214:207:174:208:209:210:211:195:212:213:215:216:217:218:219:220:221:222","style":["S56"],"val":"Flat tires","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"215:207:174:208:209:210:211:195:212:213:214:216:217:218:219:220:221:222","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"216:207:174:208:209:210:211:195:212:213:214:215:217:218:219:220:221:222","style":["S60"],"val":"/Emily
 /Get ready to work/Flat tires","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"217:207:174:208:209:210:211:195:212:213:214:215:216:218:219:220:221:222","style":["S62"],"val":"758","valTyp":"number","fmtVal":"758","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"218:207:174:208:209:210:211:195:212:213:214:215:216:217:219:220:221:222","style":["S64"],"val":"C5","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"219:207:174:208:209:210:211:195:212:213:214:215:216:217:218:220:221:222","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=758","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"220:207:174:208:209:210:211:195:212:213:214:215:216:217:218:219:221:222","style":["S68"],"val":"Check the alignment regularly","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70",
 "ctx":"221:207:174:208:209:210:211:195:212:213:214:215:216:217:218:219:220:222","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"222:207:174:208:209:210:211:195:212:213:214:215:216:217:218:219:220:221","style":["S72"],"val":"/Emily/Get ready to work/Flat tires/Check the alignment regularly","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"223:174:224:225:226:227:195:228:229:230:231:232:233:234:235:236:237:238","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:223:224:225:226:227:195:228:229:230:231:232:233:234:235:236:237:238","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"224:223:174:225:226:227:195:228:229:230:231:232:233:234:235:236:237:238","style":["S42"],"val":"Drive to work","valT
 yp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"225:223:174:224:226:227:195:228:229:230:231:232:233:234:235:236:237:238","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"226:223:174:224:225:227:195:228:229:230:231:232:233:234:235:236:237:238","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"227:223:174:224:225:226:195:228:229:230:231:232:233:234:235:236:237:238","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"195:223:174:224:225:226:227:228:229:230:231:232:233:234:235:236:237:238","style":["S50"],"val":"707","valTyp":"number","fmtVal":"707","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"2
 28:223:174:224:225:226:227:195:229:230:231:232:233:234:235:236:237:238","style":["S52"],"val":"R9","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"229:223:174:224:225:226:227:195:228:230:231:232:233:234:235:236:237:238","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=707","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"230:223:174:224:225:226:227:195:228:229:231:232:233:234:235:236:237:238","style":["S56"],"val":"Flat tires","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"231:223:174:224:225:226:227:195:228:229:230:232:233:234:235:236:237:238","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"232:223:174:224:225:226:227:195:228:229:230:231:233:234:235:236:237:238","style":["S60"],"val":"/Emily/Get ready to work/Flat tires","valTyp":"text"}}]},{"ref":"R
 63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"233:223:174:224:225:226:227:195:228:229:230:231:232:234:235:236:237:238","style":["S62"],"val":"760","valTyp":"number","fmtVal":"760","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"234:223:174:224:225:226:227:195:228:229:230:231:232:233:235:236:237:238","style":["S64"],"val":"C6","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"235:223:174:224:225:226:227:195:228:229:230:231:232:233:234:236:237:238","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=760","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"236:223:174:224:225:226:227:195:228:229:230:231:232:233:234:235:237:238","style":["S68"],"val":"Check the tires pressure regularly","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"237:223:174:224:225:226:227:195:228:229:230:231:
 232:233:234:235:236:238","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"238:223:174:224:225:226:227:195:228:229:230:231:232:233:234:235:236:237","style":["S72"],"val":"/Emily/Get ready to work/Flat tires/Check the tires pressure regularly","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"239:174:240:241:242:243:244:245:246:247:248:249:250:251:252:253:254:255","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:239:240:241:242:243:244:245:246:247:248:249:250:251:252:253:254:255","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"240:239:174:241:242:243:244:245:246:247:248:249:250:251:252:253:254:255","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item"
 :[{"txt":{"ref":"R44","ctx":"241:239:174:240:242:243:244:245:246:247:248:249:250:251:252:253:254:255","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"242:239:174:240:241:243:244:245:246:247:248:249:250:251:252:253:254:255","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"243:239:174:240:241:242:244:245:246:247:248:249:250:251:252:253:254:255","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"244:239:174:240:241:242:243:245:246:247:248:249:250:251:252:253:254:255","style":["S50"],"val":"713","valTyp":"number","fmtVal":"713","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"245:239:174:240:241:242:243:244:246:247:248:249:250
 :251:252:253:254:255","style":["S52"],"val":"R10","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"246:239:174:240:241:242:243:244:245:247:248:249:250:251:252:253:254:255","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=713","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"247:239:174:240:241:242:243:244:245:246:248:249:250:251:252:253:254:255","style":["S56"],"val":"Low on gas","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"248:239:174:240:241:242:243:244:245:246:247:249:250:251:252:253:254:255","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"249:239:174:240:241:242:243:244:245:246:247:248:250:251:252:253:254:255","style":["S60"],"val":"/Emily/Get ready to work/Low on gas","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","
 ctx":"250:239:174:240:241:242:243:244:245:246:247:248:249:251:252:253:254:255","style":["S62"],"val":"766","valTyp":"number","fmtVal":"766","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"251:239:174:240:241:242:243:244:245:246:247:248:249:250:252:253:254:255","style":["S64"],"val":"C9","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"252:239:174:240:241:242:243:244:245:246:247:248:249:250:251:253:254:255","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=766","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"253:239:174:240:241:242:243:244:245:246:247:248:249:250:251:252:254:255","style":["S68"],"val":"fill up the car","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"254:239:174:240:241:242:243:244:245:246:247:248:249:250:251:252:253:255","style":["S70"],"val":"Not Determined","val
 Typ":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"255:239:174:240:241:242:243:244:245:246:247:248:249:250:251:252:253:254","style":["S72"],"val":"/Emily/Get ready to work/Low on gas/fill up the car","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"256:174:257:258:259:260:261:262:263:264:265:266:267:268:269:270:271:272","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:256:257:258:259:260:261:262:263:264:265:266:267:268:269:270:271:272","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"257:256:174:258:259:260:261:262:263:264:265:266:267:268:269:270:271:272","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"258:256:174:257:259:260:261:262:263:264:265:266:267:268:26
 9:270:271:272","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"259:256:174:257:258:260:261:262:263:264:265:266:267:268:269:270:271:272","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"260:256:174:257:258:259:261:262:263:264:265:266:267:268:269:270:271:272","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"261:256:174:257:258:259:260:262:263:264:265:266:267:268:269:270:271:272","style":["S50"],"val":"717","valTyp":"number","fmtVal":"717","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"262:256:174:257:258:259:260:261:263:264:265:266:267:268:269:270:271:272","style":["S52"],"val":"R11","valTyp":"text"}}]},{"ref":"R55","sty
 le":["S55"],"item":[{"txt":{"ref":"R54","ctx":"263:256:174:257:258:259:260:261:262:264:265:266:267:268:269:270:271:272","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=717","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"264:256:174:257:258:259:260:261:262:263:265:266:267:268:269:270:271:272","style":["S56"],"val":"other car problem","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"265:256:174:257:258:259:260:261:262:263:264:266:267:268:269:270:271:272","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"266:256:174:257:258:259:260:261:262:263:264:265:267:268:269:270:271:272","style":["S60"],"val":"/Emily/Get ready to work/other car problem","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"267:256:174:257:258:259:260:261:262:263:264:265:266:268:269:270:271
 :272","style":["S62"],"val":"772","valTyp":"number","fmtVal":"772","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"268:256:174:257:258:259:260:261:262:263:264:265:266:267:269:270:271:272","style":["S64"],"val":"C11","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"269:256:174:257:258:259:260:261:262:263:264:265:266:267:268:270:271:272","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=772","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"270:256:174:257:258:259:260:261:262:263:264:265:266:267:268:269:271:272","style":["S68"],"val":"Regular maintainence on the car","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"271:256:174:257:258:259:260:261:262:263:264:265:266:267:268:269:270:272","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"t
 xt":{"ref":"R72","ctx":"272:256:174:257:258:259:260:261:262:263:264:265:266:267:268:269:270:271","style":["S72"],"val":"/Emily/Get ready to work/other car problem/Regular maintainence on the car","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"273:174:274:275:276:277:261:278:279:280:281:282:283:284:285:286:287:288","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"174:273:274:275:276:277:261:278:279:280:281:282:283:284:285:286:287:288","style":["S40"],"val":"692","valTyp":"number","fmtVal":"692","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"274:273:174:275:276:277:261:278:279:280:281:282:283:284:285:286:287:288","style":["S42"],"val":"Drive to work","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"275:273:174:274:276:277:261:278:279:280:281:282:283:284:285:286:287:288","style":["S44"],"v
 al":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=692","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"276:273:174:274:275:277:261:278:279:280:281:282:283:284:285:286:287:288","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"277:273:174:274:275:276:261:278:279:280:281:282:283:284:285:286:287:288","style":["S48"],"val":"/Emily/Get ready to work/Drive to work","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"261:273:174:274:275:276:277:278:279:280:281:282:283:284:285:286:287:288","style":["S50"],"val":"717","valTyp":"number","fmtVal":"717","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"278:273:174:274:275:276:277:261:279:280:281:282:283:284:285:286:287:288","style":["S52"],"val":"R11","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref"
 :"R54","ctx":"279:273:174:274:275:276:277:261:278:280:281:282:283:284:285:286:287:288","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=717","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"280:273:174:274:275:276:277:261:278:279:281:282:283:284:285:286:287:288","style":["S56"],"val":"other car problem","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"281:273:174:274:275:276:277:261:278:279:280:282:283:284:285:286:287:288","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"282:273:174:274:275:276:277:261:278:279:280:281:283:284:285:286:287:288","style":["S60"],"val":"/Emily/Get ready to work/other car problem","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"283:273:174:274:275:276:277:261:278:279:280:281:282:284:285:286:287:288","style":["S62"],"val":"777"
 ,"valTyp":"number","fmtVal":"777","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"284:273:174:274:275:276:277:261:278:279:280:281:282:283:285:286:287:288","style":["S64"],"val":"C12","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"285:273:174:274:275:276:277:261:278:279:280:281:282:283:284:286:287:288","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=777","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"286:273:174:274:275:276:277:261:278:279:280:281:282:283:284:285:287:288","style":["S68"],"val":"Subscribe to CAA","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"287:273:174:274:275:276:277:261:278:279:280:281:282:283:284:285:286:288","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"288:273:174:274:275:276:
 277:261:278:279:280:281:282:283:284:285:286:287","style":["S72"],"val":"/Emily/Get ready to work/other car problem/Subscribe to CAA","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"289:290:291:292:293:294:295:296:297:298:299:300:301:302:303:304:305:306","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"290:289:291:292:293:294:295:296:297:298:299:300:301:302:303:304:305:306","style":["S40"],"val":"693","valTyp":"number","fmtVal":"693","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"291:289:290:292:293:294:295:296:297:298:299:300:301:302:303:304:305:306","style":["S42"],"val":"Feed the cats","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"292:289:290:291:293:294:295:296:297:298:299:300:301:302:303:304:305:306","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resou
 rce.do?fileId=693","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"293:289:290:291:292:294:295:296:297:298:299:300:301:302:303:304:305:306","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"294:289:290:291:292:293:295:296:297:298:299:300:301:302:303:304:305:306","style":["S48"],"val":"/Emily/Get ready to work/Feed the cats","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"295:289:290:291:292:293:294:296:297:298:299:300:301:302:303:304:305:306","style":["S50"],"val":"719","valTyp":"number","fmtVal":"719","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"296:289:290:291:292:293:294:295:297:298:299:300:301:302:303:304:305:306","style":["S52"],"val":"R12","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"297:289:290:291:292:293:294:295:296:298:299:300:3
 01:302:303:304:305:306","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=719","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"298:289:290:291:292:293:294:295:296:297:299:300:301:302:303:304:305:306","style":["S56"],"val":"Out of cat food","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"299:289:290:291:292:293:294:295:296:297:298:300:301:302:303:304:305:306","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"300:289:290:291:292:293:294:295:296:297:298:299:301:302:303:304:305:306","style":["S60"],"val":"/Emily/Get ready to work/Out of cat food","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"301:289:290:291:292:293:294:295:296:297:298:299:300:302:303:304:305:306","style":["S62"],"val":"738","valTyp":"number","fmtVal":"738","fmtPatrn":"#0","exclPatrn":"\\#0
 "}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"302:289:290:291:292:293:294:295:296:297:298:299:300:301:303:304:305:306","style":["S64"],"val":"C13","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"303:289:290:291:292:293:294:295:296:297:298:299:300:301:302:304:305:306","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=738","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"304:289:290:291:292:293:294:295:296:297:298:299:300:301:302:303:305:306","style":["S68"],"val":"Buy cat food","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"305:289:290:291:292:293:294:295:296:297:298:299:300:301:302:303:304:306","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"306:289:290:291:292:293:294:295:296:297:298:299:300:301:302:303:304:305","style":["S72"],"val":
 "/Emily/Get ready to work/Out of cat food/Buy cat food","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"307:308:309:310:311:312:313:314:315:316:317:318:319:320:321:322:323:324","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"308:307:309:310:311:312:313:314:315:316:317:318:319:320:321:322:323:324","style":["S40"],"val":"694","valTyp":"number","fmtVal":"694","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"309:307:308:310:311:312:313:314:315:316:317:318:319:320:321:322:323:324","style":["S42"],"val":"Get dressed","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"310:307:308:309:311:312:313:314:315:316:317:318:319:320:321:322:323:324","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=694","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"t
 xt":{"ref":"R46","ctx":"311:307:308:309:310:312:313:314:315:316:317:318:319:320:321:322:323:324","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"312:307:308:309:310:311:313:314:315:316:317:318:319:320:321:322:323:324","style":["S48"],"val":"/Emily/Get ready to work/Get dressed","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"313:307:308:309:310:311:312:314:315:316:317:318:319:320:321:322:323:324","style":["S50"],"val":"709","valTyp":"number","fmtVal":"709","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"314:307:308:309:310:311:312:313:315:316:317:318:319:320:321:322:323:324","style":["S52"],"val":"R13","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"315:307:308:309:310:311:312:313:314:316:317:318:319:320:321:322:323:324","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10
 108/openpages/view.resource.do?fileId=709","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"316:307:308:309:310:311:312:313:314:315:317:318:319:320:321:322:323:324","style":["S56"],"val":"Forgot to do laundry","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"317:307:308:309:310:311:312:313:314:315:316:318:319:320:321:322:323:324","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"318:307:308:309:310:311:312:313:314:315:316:317:319:320:321:322:323:324","style":["S60"],"val":"/Emily/Get ready to work/Forgot to do laundry","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"319:307:308:309:310:311:312:313:314:315:316:317:318:320:321:322:323:324","style":["S62"],"val":"763","valTyp":"number","fmtVal":"763","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"3
 20:307:308:309:310:311:312:313:314:315:316:317:318:319:321:322:323:324","style":["S64"],"val":"C7","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"321:307:308:309:310:311:312:313:314:315:316:317:318:319:320:322:323:324","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=763","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"322:307:308:309:310:311:312:313:314:315:316:317:318:319:320:321:323:324","style":["S68"],"val":"Do laundry","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"323:307:308:309:310:311:312:313:314:315:316:317:318:319:320:321:322:324","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"324:307:308:309:310:311:312:313:314:315:316:317:318:319:320:321:322:323","style":["S72"],"val":"/Emily/Get ready to work/Forgot to do laundry/Do laundry","valTyp":"text"
 }}]}]},{"cell":[{"ref":"R39","style":["S39"],"item":[{"txt":{"ref":"R38","ctx":"325:308:326:327:328:329:313:330:331:332:333:334:335:336:337:338:339:340","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"308:325:326:327:328:329:313:330:331:332:333:334:335:336:337:338:339:340","style":["S40"],"val":"694","valTyp":"number","fmtVal":"694","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"326:325:308:327:328:329:313:330:331:332:333:334:335:336:337:338:339:340","style":["S42"],"val":"Get dressed","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"327:325:308:326:328:329:313:330:331:332:333:334:335:336:337:338:339:340","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=694","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"328:325:308:326:327:329:313:330:331:332:333:334
 :335:336:337:338:339:340","style":["S46"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"329:325:308:326:327:328:313:330:331:332:333:334:335:336:337:338:339:340","style":["S48"],"val":"/Emily/Get ready to work/Get dressed","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"313:325:308:326:327:328:329:330:331:332:333:334:335:336:337:338:339:340","style":["S50"],"val":"709","valTyp":"number","fmtVal":"709","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"330:325:308:326:327:328:329:313:331:332:333:334:335:336:337:338:339:340","style":["S52"],"val":"R13","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"331:325:308:326:327:328:329:313:330:332:333:334:335:336:337:338:339:340","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=709","valTyp":"text"}}]},{"ref":"
 R57","style":["S57"],"item":[{"txt":{"ref":"R56","ctx":"332:325:308:326:327:328:329:313:330:331:333:334:335:336:337:338:339:340","style":["S56"],"val":"Forgot to do laundry","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"333:325:308:326:327:328:329:313:330:331:332:334:335:336:337:338:339:340","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"334:325:308:326:327:328:329:313:330:331:332:333:335:336:337:338:339:340","style":["S60"],"val":"/Emily/Get ready to work/Forgot to do laundry","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"335:325:308:326:327:328:329:313:330:331:332:333:334:336:337:338:339:340","style":["S62"],"val":"782","valTyp":"number","fmtVal":"782","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"336:325:308:326:327:328:329:313:330:331:332:333:334:335:337:338:339:340"
 ,"style":["S64"],"val":"C8","valTyp":"text"}}]},{"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"337:325:308:326:327:328:329:313:330:331:332:333:334:335:336:338:339:340","style":["S66"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=782","valTyp":"text"}}]},{"ref":"R69","style":["S69"],"item":[{"txt":{"ref":"R68","ctx":"338:325:308:326:327:328:329:313:330:331:332:333:334:335:336:337:339:340","style":["S68"],"val":"Wear the dirty clothes","valTyp":"text"}}]},{"ref":"R71","style":["S71"],"item":[{"txt":{"ref":"R70","ctx":"339:325:308:326:327:328:329:313:330:331:332:333:334:335:336:337:338:340","style":["S70"],"val":"Not Determined","valTyp":"text"}}]},{"ref":"R73","style":["S73"],"item":[{"txt":{"ref":"R72","ctx":"340:325:308:326:327:328:329:313:330:331:332:333:334:335:336:337:338:339","style":["S72"],"val":"/Emily/Get ready to work/Forgot to do laundry/Wear the dirty clothes","valTyp":"text"}}]}]},{"cell":[{"ref":"R39","style":["S39"],"i
 tem":[{"txt":{"ref":"R38","ctx":"341:308:342:343:344:345:346:347:348:349:350:351:352:353:354:355:356:357","style":["S38"],"val":"S","valTyp":"text"}}]},{"ref":"R41","style":["S41"],"item":[{"txt":{"ref":"R40","ctx":"308:341:342:343:344:345:346:347:348:349:350:351:352:353:354:355:356:357","style":["S40"],"val":"694","valTyp":"number","fmtVal":"694","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R43","style":["S43"],"item":[{"txt":{"ref":"R42","ctx":"342:341:308:343:344:345:346:347:348:349:350:351:352:353:354:355:356:357","style":["S42"],"val":"Get dressed","valTyp":"text"}}]},{"ref":"R45","style":["S45"],"item":[{"txt":{"ref":"R44","ctx":"343:341:308:342:344:345:346:347:348:349:350:351:352:353:354:355:356:357","style":["S44"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=694","valTyp":"text"}}]},{"ref":"R47","style":["S47"],"item":[{"txt":{"ref":"R46","ctx":"344:341:308:342:343:345:346:347:348:349:350:351:352:353:354:355:356:357","style":["S46"],"val"
 :,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R49","style":["S49"],"item":[{"txt":{"ref":"R48","ctx":"345:341:308:342:343:344:346:347:348:349:350:351:352:353:354:355:356:357","style":["S48"],"val":"/Emily/Get ready to work/Get dressed","valTyp":"text"}}]},{"ref":"R51","style":["S51"],"item":[{"txt":{"ref":"R50","ctx":"346:341:308:342:343:344:345:347:348:349:350:351:352:353:354:355:356:357","style":["S50"],"val":"733","valTyp":"number","fmtVal":"733","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R53","style":["S53"],"item":[{"txt":{"ref":"R52","ctx":"347:341:308:342:343:344:345:346:348:349:350:351:352:353:354:355:356:357","style":["S52"],"val":"R14","valTyp":"text"}}]},{"ref":"R55","style":["S55"],"item":[{"txt":{"ref":"R54","ctx":"348:341:308:342:343:344:345:346:347:349:350:351:352:353:354:355:356:357","style":["S54"],"val":"http://VOTTOPG10.ottawa.ibm.com:10108/openpages/view.resource.do?fileId=733","valTyp":"text"}}]},{"ref":"R57","style":["S57"],"item":[{"txt":{"ref":"R56
 ","ctx":"349:341:308:342:343:344:345:346:347:348:350:351:352:353:354:355:356:357","style":["S56"],"val":"Wrinkles on clothes","valTyp":"text"}}]},{"ref":"R59","style":["S59"],"item":[{"txt":{"ref":"R58","ctx":"350:341:308:342:343:344:345:346:347:348:349:351:352:353:354:355:356:357","style":["S58"],"val":,"valErrorState":"NULL","valTyp":"text"}}]},{"ref":"R61","style":["S61"],"item":[{"txt":{"ref":"R60","ctx":"351:341:308:342:343:344:345:346:347:348:349:350:352:353:354:355:356:357","style":["S60"],"val":"/Emily/Get ready to work/Wrinkles on clothes","valTyp":"text"}}]},{"ref":"R63","style":["S63"],"item":[{"txt":{"ref":"R62","ctx":"352:341:308:342:343:344:345:346:347:348:349:350:351:353:354:355:356:357","style":["S62"],"val":"769","valTyp":"number","fmtVal":"769","fmtPatrn":"#0","exclPatrn":"\\#0"}}]},{"ref":"R65","style":["S65"],"item":[{"txt":{"ref":"R64","ctx":"353:341:308:342:343:344:345:346:347:348:349:350:351:352:354:355:356:357","style":["S64"],"val":"C17","valTyp":"text"}}]},
 {"ref":"R67","style":["S67"],"item":[{"txt":{"ref":"R66","ctx":"354:341:308:342:343:344:345:346:347:348:349:350:351:352:353:355:356:357","style":["S66"],"val":"

<TRUNCATED>


[19/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.java
new file mode 100755
index 0000000..503f27b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Wraps a {@link ConfigFile} in a {@link Writable} to be rendered as plain text.
+ */
+class ConfigFileWritable implements Writable {
+
+	private ConfigFileImpl cf;
+
+	protected ConfigFileWritable(ConfigFileImpl cf) {
+		this.cf = cf;
+	}
+
+	@Override /* Writable */
+	public void writeTo(Writer out) throws IOException {
+		cf.readLock();
+		try {
+			cf.serializeTo(out);
+		} finally {
+			cf.readUnlock();
+		}
+	}
+
+	@Override /* Writable */
+	public String getMediaType() {
+		return "text/plain";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.class
new file mode 100755
index 0000000..d074cbd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.java
new file mode 100755
index 0000000..70a95d7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigMgr.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import static com.ibm.juno.core.ini.ConfigFileFormat.*;
+
+import java.io.*;
+import java.nio.charset.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Manager for retrieving shared instances of {@link ConfigFile ConfigFiles}.
+ * <p>
+ * Example:
+ * <p class='bcode'>
+ * 	ConfigFile cf = ConfigMgr.<jsf>DEFAULT</jsf>.get(<js>"MyConfig.cfg"</js>);
+ * 	String setting = cf.get(<js>"MySection/mysetting"</js>);
+ * </p>
+ */
+public class ConfigMgr {
+
+	/**
+	 * Default reusable configuration manager.
+	 * <ul>
+	 * 	<li>Read-only: <jk>false</jk>.
+	 * 	<li>Encoder: {@link XorEncoder}.
+	 * 	<li>Serializer: {@link JsonSerializer#DEFAULT}.
+	 * 	<li>Parser: {@link JsonParser#DEFAULT}.
+	 * 	<li>Charset: {@link Charset#defaultCharset()}.
+	 * 	<li>Search paths: [<js>"."</js>].
+	 * </ul>
+	 */
+	public static final ConfigMgr DEFAULT = new ConfigMgr(false, new XorEncoder(), JsonSerializer.DEFAULT, JsonParser.DEFAULT, Charset.defaultCharset(), new String[]{"."});
+
+	private ConcurrentHashMap<String,File> files = new ConcurrentHashMap<String,File>();
+	private ConcurrentHashMap<File,ConfigFile> configs = new ConcurrentHashMap<File,ConfigFile>();
+	private final WriterSerializer serializer;
+	private final ReaderParser parser;
+	private final Encoder encoder;
+	private final boolean readOnly;
+	private final Charset charset;
+	private final List<File> searchPaths = new LinkedList<File>();
+
+	/**
+	 * Create a custom configuration manager.
+	 *
+	 * @param readOnly Make {@link ConfigFile ConfigFiles} read-only.
+	 * @param encoder Optional.  Specify the encoder to use for encoded config file entries (e.g. <js>"mySecret*={...}"</js>).
+	 * @param serializer Optional.  Specify the serializer to use for serializing POJOs when using {@link ConfigFile#put(String, Object)}.
+	 * @param parser Optional.  Specify the parser to use for parsing POJOs when using {@link ConfigFile#getObject(Class,String)}.
+	 * @param charset Optional.  Specify the config file character encoding.  If <jk>null</jk>, uses {@link Charset#defaultCharset()}.
+	 * @param searchPaths Specify the search paths for config files.  Can contain relative or absolute paths.
+	 */
+	public ConfigMgr(boolean readOnly, Encoder encoder, WriterSerializer serializer, ReaderParser parser, Charset charset, String[] searchPaths) {
+		this.readOnly = readOnly;
+		this.encoder = encoder;
+		this.serializer = serializer;
+		this.parser = parser;
+		this.charset = charset;
+		if (searchPaths != null)
+			for (String p : searchPaths)
+				this.searchPaths.add(new File(p));
+	}
+
+	/**
+	 * Returns the config file with the specified absolute or relative path.
+	 * <p>
+	 * Multiple calls to the same path return the same <code>ConfigFile</code> instance.
+	 *
+	 * @param path The absolute or relative path of the config file.
+	 * @return The config file.
+	 * @throws IOException If config file could not be parsed.
+	 * @throws FileNotFoundException If config file could not be found.
+	 */
+	public ConfigFile get(String path) throws IOException {
+		return get(path, false);
+	}
+
+	/**
+	 * Returns the config file with the specified absolute or relative path.
+	 * <p>
+	 * Multiple calls to the same path return the same <code>ConfigFile</code> instance.
+	 * <p>
+	 * If file doesn't exist and <code>create</code> is <jk>true</jk>, the configuration file will be
+	 * create in the location identified by the first entry in the search paths.
+	 *
+	 * @param path The absolute or relative path of the config file.
+	 * @param create Create the config file if it doesn't exist.
+	 * @return The config file.
+	 * @throws IOException If config file could not be parsed.
+	 * @throws FileNotFoundException If config file could not be found or could not be created.
+	 */
+	public ConfigFile get(String path, boolean create) throws IOException {
+
+		File f = resolve(path, create);
+
+		ConfigFile cf = configs.get(f);
+		if (cf != null)
+			return cf;
+
+		cf = new ConfigFileImpl(f, readOnly, encoder, serializer, parser, charset);
+		configs.putIfAbsent(f, cf);
+		return configs.get(f);
+	}
+
+	/**
+	 * Create a new empty config file not backed by any file.
+	 *
+	 * @return A new config file.
+	 * @throws IOException
+	 */
+	public ConfigFile create() throws IOException {
+		return new ConfigFileImpl(null, false, encoder, serializer, parser, charset);
+	}
+
+	/**
+	 * Create a new config file backed by the specified file.
+	 * Note that {@link #get(String)} is the preferred method for getting access to config files
+	 * 	since this method will create a new config file each time it is called.
+	 * This method is provided primarily for testing purposes.
+	 *
+	 * @param f The file to create a config file from.
+	 * @return A new config file.
+	 * @throws IOException
+	 */
+	public ConfigFile create(File f) throws IOException {
+		return new ConfigFileImpl(f, false, encoder, serializer, parser, charset);
+	}
+
+	/**
+	 * Create a new config file not backed by a file.
+	 *
+	 * @param r The reader containing an INI-formatted file to initialize the config file from.
+	 * @return A new config file.
+	 * @throws IOException
+	 */
+	public ConfigFile create(Reader r) throws IOException {
+		return new ConfigFileImpl(null, false, encoder, serializer, parser, charset).load(r);
+	}
+
+	/**
+	 * Reloads any config files that were modified.
+	 * @throws IOException
+	 */
+	public void loadIfModified() throws IOException {
+		for (ConfigFile cf : configs.values())
+			cf.loadIfModified();
+	}
+
+	/**
+	 * Delete all configuration files registered with this config manager.
+	 */
+	public void deleteAll() {
+		for (File f : configs.keySet())
+			FileUtils.delete(f);
+		files.clear();
+		configs.clear();
+	}
+
+	private File resolve(String path, boolean create) throws IOException {
+
+		// See if it's cached.
+		File f = files.get(path);
+		if (f != null)
+			return f;
+
+		// Handle absolute file.
+		f = new File(path);
+		if (f.isAbsolute()) {
+			if (create)
+				FileUtils.create(f);
+			if (f.exists())
+				return addFile(path, f);
+			throw new FileNotFoundException("Could not find config file '"+path+"'");
+		}
+
+		if (searchPaths.isEmpty())
+			throw new FileNotFoundException("No search paths specified on ConfigMgr.");
+
+		// Handle paths relative to search paths.
+		for (File sf : searchPaths) {
+			f = new File(sf.getAbsolutePath() + "/" + path);
+			if (f.exists())
+				return addFile(path, f);
+		}
+
+		if (create) {
+			f = new File(searchPaths.get(0).getAbsolutePath() + "/" + path);
+			FileUtils.create(f);
+				return addFile(path, f);
+		}
+
+		throw new FileNotFoundException("Could not find config file '"+path+"'");
+	}
+
+	private File addFile(String path, File f) {
+		files.putIfAbsent(path, f);
+		return files.get(path);
+	}
+
+	/**
+	 * Implements command-line features for working with INI configuration files.
+	 * <p>
+	 * Invoke as a normal Java program...
+	 * <p>
+	 * <p class='bcode'>
+	 * 	java com.ibm.juno.core.ini.ConfigMgr [args]
+	 * </p>
+	 * <p>
+	 * Arguments can be any of the following...
+	 * <ul>
+	 * 	<li>No arguments<br>
+	 * 		Prints usage message.<br>
+	 * 		<br>
+	 * 	<li><code>createBatchEnvFile -configfile &lt;configFile&gt; -envfile &lt;batchFile&gt; [-verbose]</code><br>
+	 * 		Creates a batch file that will set each config file entry as an environment variable.<br>
+	 * 		Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>)
+	 * 			will be converted to underscores.<br>
+	 * 		<br>
+	 * 	<li><code>createShellEnvFile -configFile &lt;configFile&gt; -envFile &lt;configFile&gt; [-verbose]</code>
+	 * 		Creates a shell script that will set each config file entry as an environment variable.<br>
+	 * 		Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>)
+	 * 			will be converted to underscores.<br>
+	 * 		<br>
+	 * 	<li><code>setVals -configFile &lt;configFile&gt; -vals [var1=val1 [var2=val2...]] [-verbose]</code>
+	 * 		Sets values in config files.<br>
+	 * </ul>
+	 * <p>
+	 * For example, the following command will create the file <code>'MyConfig.bat'</code> from the contents of the file <code>'MyConfig.cfg'</code>.
+	 * <p class='bcode'>
+	 * 	java com.ibm.juno.core.ini.ConfigMgr createBatchEnvFile -configfile C:\foo\MyConfig.cfg -batchfile C:\foo\MyConfig.bat
+	 * </p>
+	 *
+	 * @param args Command-line arguments
+	 */
+	public static void main(String[] args) {
+
+		Args a = new Args(args);
+		String command = a.getArg(0);
+		String configFile = a.getArg("configFile");
+		String envFile = a.getArg("envFile");
+		List<String> vals = a.getArgs("vals");
+
+		if (command == null || ! (command.equals("createBatchEnvFile") || command.equals("createShellEnvFile") || command.equals("setVals")))
+			printUsageAndExit();
+		else if (configFile.isEmpty())
+			printUsageAndExit();
+		else if (command.equals("setVals") && vals.isEmpty())
+			printUsageAndExit();
+		else if ((command.equals("createBatchEnvFile") || command.equals("createShellEnvFile")) && envFile.isEmpty())
+			printUsageAndExit();
+		else {
+			try {
+				ConfigFile cf = ConfigMgr.DEFAULT.get(configFile);
+
+				if (command.equalsIgnoreCase("setVals")) {
+					for (String val : vals) {
+						String[] x = val.split("\\=");
+						if (x.length != 2)
+							throw new RuntimeException("Invalid format for value: '"+val+"'.  Must be in the format 'key=value'");
+						cf.put(x[0], x[1]);
+					}
+					cf.save();
+					return;
+
+				} else if (command.equalsIgnoreCase("createBatchEnvFile")) {
+					Writer fw = new OutputStreamWriter(new FileOutputStream(envFile), Charset.defaultCharset());
+					try {
+						cf.serializeTo(fw, BATCH);
+					} finally {
+						fw.close();
+					}
+					return;
+
+				} else if (command.equalsIgnoreCase("createShellEnvFile")) {
+					Writer fw = new OutputStreamWriter(new FileOutputStream(envFile), Charset.defaultCharset());
+					try {
+						cf.serializeTo(fw, SHELL);
+					} finally {
+						fw.close();
+					}
+					return;
+				}
+
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static void printUsageAndExit() {
+		System.err.println("---Usage---");
+		System.err.println("java -cp juno.jar com.ibm.juno.core.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
+		System.err.println("java -cp juno.jar com.ibm.juno.core.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
+		System.err.println("java -cp juno.jar com.ibm.juno.core.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]");
+		int rc = Integer.getInteger("exit.2", 2);
+		if (rc != 0)
+			System.exit(rc);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.class
new file mode 100755
index 0000000..94ff3b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.java
new file mode 100755
index 0000000..68e6e53
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigUtils.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+/**
+ * Internal utility methods.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ConfigUtils {
+
+	static final String getSectionName(String key) {
+		int i = key.indexOf('/');
+		if (i == -1)
+			return "default";
+		return key.substring(0, i);
+	}
+
+	static final String getSectionKey(String key) {
+		int i = key.indexOf('/');
+		if (i == -1)
+			return key;
+		return key.substring(i+1);
+	}
+
+	static final String getFullKey(String section, String key) {
+		if (section.equals("default"))
+			return key;
+		return section + '/' + key;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.class
new file mode 100755
index 0000000..203a1a0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.java
new file mode 100755
index 0000000..5785eef
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Encoder.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+/**
+ * API for defining a string encoding/decoding mechanism for entries in {@link ConfigFile}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface Encoder {
+
+	/**
+	 * Encode a string.
+	 *
+	 * @param fieldName The field name being encoded.
+	 * @param in The unencoded input string.
+	 * @return The encoded output string.
+	 */
+	public String encode(String fieldName, String in);
+
+	/**
+	 * Decode a string.
+	 *
+	 * @param fieldName The field name being decoded.
+	 * @param in The encoded input string.
+	 * @return The decoded output string.
+	 */
+	public String decode(String fieldName, String in);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.class
new file mode 100755
index 0000000..9b88930
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.java
new file mode 100755
index 0000000..f49de62
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/EntryListener.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import java.util.*;
+
+
+/**
+ * Listener that can be used to listen for change events for a specific entry in a config file.
+ * <p>
+ * Use the {@link ConfigFile#addListener(ConfigFileListener)} method to register listeners.
+ */
+public class EntryListener extends ConfigFileListener {
+
+	private String fullKey;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param fullKey The key in the config file to listen for changes on.
+	 */
+	public EntryListener(String fullKey) {
+		this.fullKey = fullKey;
+	}
+
+	@Override /* ConfigFileListener */
+	public void onChange(ConfigFile cf, Set<String> changes) {
+		if (changes.contains(fullKey))
+			onChange(cf);
+	}
+
+	/**
+	 * Signifies that the config file entry changed.
+	 *
+	 * @param cf The config file being changed.
+	 */
+	public void onChange(ConfigFile cf) {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1$1.class
new file mode 100755
index 0000000..a34e642
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1.class
new file mode 100755
index 0000000..5bf46e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2$1.class
new file mode 100755
index 0000000..c411238
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2.class
new file mode 100755
index 0000000..b6d0ecc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.class
new file mode 100755
index 0000000..e1ce001
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.java
new file mode 100755
index 0000000..7626602
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/Section.java
@@ -0,0 +1,577 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import static com.ibm.juno.core.ini.ConfigFileFormat.*;
+import static com.ibm.juno.core.ini.ConfigUtils.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.locks.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Defines a section in a config file.
+ */
+public class Section implements Map<String,String> {
+
+	private ConfigFileImpl configFile;
+	String name;   // The config section name, or "default" if the default section.  Never null.
+
+	// The data structures that make up this object.
+	// These must be kept synchronized.
+	private LinkedList<String> lines = new LinkedList<String>();
+	private List<String> headerComments = new LinkedList<String>();
+	private Map<String,String> entries;
+
+	private ReadWriteLock lock = new ReentrantReadWriteLock();
+	private boolean readOnly;
+
+	/**
+	 * Constructor.
+	 */
+	public Section() {
+		this.entries = new LinkedHashMap<String,String>();
+	}
+
+	/**
+	 * Constructor with predefined contents.
+	 *
+	 * @param contents Predefined contents to copy into this section.
+	 */
+	public Section(Map<String,String> contents) {
+		this.entries = new LinkedHashMap<String,String>(contents);
+	}
+
+	Section setReadOnly() {
+		// This method is only called once from ConfigFileImpl constructor.
+			this.readOnly = true;
+			this.entries = Collections.unmodifiableMap(entries);
+		return this;
+	}
+
+	/**
+	 * Sets the config file that this section belongs to.
+	 *
+	 * @param configFile The config file that this section belongs to.
+	 * @return This object (for method chaining).
+	 */
+	@ParentProperty
+	public Section setParent(ConfigFileImpl configFile) {
+		this.configFile = configFile;
+		return this;
+	}
+
+	/**
+	 * Sets the section name
+	 *
+	 * @param name The section name.
+	 * @return This object (for method chaining).
+	 */
+	@NameProperty
+	public Section setName(String name) {
+		this.name = name;
+		return this;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Map methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Map */
+	public void clear() {
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			if (changes != null)
+				for (String k : keySet())
+					changes.add(getFullKey(name, k));
+			entries.clear();
+			lines.clear();
+			headerComments.clear();
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+	}
+
+	@Override /* Map */
+	public boolean containsKey(Object key) {
+		return entries.containsKey(key);
+	}
+
+	@Override /* Map */
+	public boolean containsValue(Object value) {
+		return entries.containsValue(value);
+	}
+
+	@Override /* Map */
+	public Set<Map.Entry<String,String>> entrySet() {
+
+		// We need to create our own set so that entries are removed correctly.
+		return new AbstractSet<Map.Entry<String,String>>() {
+			@Override /* Set */
+			public Iterator<Map.Entry<String,String>> iterator() {
+				return new Iterator<Map.Entry<String,String>>() {
+					Iterator<Map.Entry<String,String>> i = entries.entrySet().iterator();
+					Map.Entry<String,String> i2;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public Map.Entry<String,String> next() {
+						i2 = i.next();
+						return i2;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						Set<String> changes = createChanges();
+						String key = i2.getKey(), val = i2.getValue();
+						addChange(changes, key, val, null);
+						writeLock();
+						try {
+							i.remove();
+							removeLine(key);
+						} finally {
+							writeUnlock();
+						}
+						signalChanges(changes);
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return entries.size();
+			}
+		};
+	}
+
+	@Override /* Map */
+	public String get(Object key) {
+		String s = entries.get(key);
+		if (s != null && s.indexOf('\u0000') != -1)
+			return s.replace("\u0000", "");
+		return s;
+	}
+
+	@Override /* Map */
+	public boolean isEmpty() {
+		return entries.isEmpty();
+	}
+
+	@Override /* Map */
+	public Set<String> keySet() {
+
+		// We need to create our own set so that sections are removed correctly.
+		return new AbstractSet<String>() {
+			@Override /* Set */
+			public Iterator<String> iterator() {
+				return new Iterator<String>() {
+					Iterator<String> i = entries.keySet().iterator();
+					String i2;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public String next() {
+						i2 = i.next();
+						return i2;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						Set<String> changes = createChanges();
+						String key = i2;
+						String val = entries.get(key);
+						addChange(changes, key, val, null);
+						writeLock();
+						try {
+							i.remove();
+							removeLine(key);
+						} finally {
+							writeUnlock();
+						}
+						signalChanges(changes);
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return entries.size();
+			}
+		};
+	}
+
+	@Override /* Map */
+	public String put(String key, String value) {
+		return put(key, value, false);
+	}
+
+	/**
+	 * Sets the specified value in this section.
+	 * @param key The section key.
+	 * @param value The new value.
+	 * @param encoded Whether this value should be encoded during save.
+	 * @return The previous value.
+	 */
+	public String put(String key, String value, boolean encoded) {
+		Set<String> changes = createChanges();
+		String s = put(key, value, encoded, changes);
+		signalChanges(changes);
+		return s;
+	}
+
+	String put(String key, String value, boolean encoded, Set<String> changes) {
+		writeLock();
+		try {
+			addLine(key, encoded);
+			String prev = entries.put(key, value);
+			addChange(changes, key, prev, value);
+			return prev;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	@Override /* Map */
+	public void putAll(Map<? extends String,? extends String> map) {
+		Set<String> changes = createChanges();
+		for (Map.Entry<? extends String,? extends String> e : map.entrySet())
+			put(e.getKey(), e.getValue(), false, changes);
+		signalChanges(changes);
+	}
+
+	@Override /* Map */
+	public String remove(Object key) {
+		Set<String> changes = createChanges();
+		String old = remove(key, changes);
+		signalChanges(changes);
+		return old;
+	}
+
+	String remove(Object key, Set<String> changes) {
+		writeLock();
+		try {
+			String prev = entries.remove(key);
+			addChange(changes, key.toString(), prev, null);
+			removeLine(key.toString());
+			return prev;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	private void removeLine(String key) {
+			for (Iterator<String> i = lines.iterator(); i.hasNext();) {
+				String k = i.next();
+			if (k.startsWith("*") || k.startsWith(">")) {
+				if (k.substring(1).equals(key)) {
+					i.remove();
+					break;
+				}
+			}
+		}
+	}
+
+	@Override /* Map */
+	public int size() {
+		return entries.size();
+	}
+
+	@Override /* Map */
+	public Collection<String> values() {
+		return Collections.unmodifiableCollection(entries.values());
+	}
+
+	//--------------------------------------------------------------------------------
+	// API methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns <jk>true</jk> if the specified entry is encoded.
+	 *
+	 * @param key The key.
+	 * @return <jk>true</jk> if the specified entry is encoded.
+	 */
+	public boolean isEncoded(String key) {
+		readLock();
+		try {
+			for (String s : lines)
+				if (s.length() > 1)
+					if (s.substring(1).equals(key))
+						return s.charAt(0) == '*';
+			return false;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Adds header comments to this section.
+	 * @see ConfigFile#addHeaderComments(String, String...) for a description.
+	 * @param comments The comment lines to add to this section.
+	 * @return This object (for method chaining).
+	 */
+	public Section addHeaderComments(List<String> comments) {
+		writeLock();
+		try {
+			for (String c : comments) {
+				if (c == null)
+					c = "";
+				if (! c.startsWith("#"))
+					c = "#" + c;
+				this.headerComments.add(c);
+			}
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Removes all header comments from this section.
+	 */
+	public void clearHeaderComments() {
+		writeLock();
+		try {
+			this.headerComments.clear();
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Serialize this section.
+	 * @param out What to serialize to.
+	 * @param format The format (e.g. INI, BATCH, SHELL).
+	 */
+	public void writeTo(PrintWriter out, ConfigFileFormat format) {
+		readLock();
+		try {
+			if (format == INI) {
+				String NL = System.getProperty("line.separator");
+				for (String s : headerComments)
+					out.append(s).println();
+				if (! name.equals("default"))
+					out.append('[').append(name).append(']').println();
+				for (String l : lines) {
+					char c = (l.length() > 0 ? l.charAt(0) : 0);
+					if (c == '>' || c == '*'){
+						boolean encode = c == '*';
+						String key = l.substring(1);
+						String val = entries.get(key);
+						val = val.replace("\u0000", "\\"+NL+"\t");
+						out.append(key);
+						if (encode)
+							out.append('*');
+						out.append(" = ");
+						if (encode)
+							out.append('{').append(configFile.getEncoder().encode(key, val)).append('}');
+						else
+							out.append(val);
+						out.println();
+					} else {
+						out.append(l).println();
+					}
+				}
+
+			} else if (format == BATCH) {
+				String section = name.replaceAll("\\.\\/", "_");
+				for (String l : headerComments) {
+					l = trimComment(l);
+					if (! l.isEmpty())
+						out.append("rem ").append(l);
+					out.println();
+				}
+				for (String l : lines) {
+					char c = (l.length() > 0 ? l.charAt(0) : 0);
+					if (c == '>' || c == '*') {
+						String key = l.substring(1);
+						String val = entries.get(key);
+						out.append("set ");
+						if (! name.equals("default"))
+							out.append(section).append("_");
+						out.append(key.replaceAll("\\.\\/", "_")).append(" = ").append(val).println();
+					} else {
+						l = trimComment(l);
+						if (! l.isEmpty())
+							out.append("rem ").append(l);
+						out.println();
+					}
+				}
+
+			} else if (format == SHELL) {
+				String section = name.replaceAll("\\.\\/", "_");
+				for (String l : headerComments) {
+					l = trimComment(l);
+					if (! l.isEmpty())
+						out.append("# ").append(l);
+					out.println();
+				}
+				for (String l : lines) {
+					char c = (l.length() > 0 ? l.charAt(0) : 0);
+					if (c == '>' || c == '*'){
+						String key = l.substring(1);
+						String val = entries.get(key).replaceAll("\\\\", "\\\\\\\\");
+						out.append("export ");
+						if (! name.equals("default"))
+							out.append(section).append("_");
+						out.append(key.replaceAll("\\.\\/", "_")).append('=').append('"').append(val).append('"').println();
+					} else {
+						l = trimComment(l);
+						if (! l.isEmpty())
+							out.append("# ").append(l);
+						out.println();
+					}
+				}
+			}
+		} finally {
+			readUnlock();
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Protected methods used by ConfigFile
+	//--------------------------------------------------------------------------------
+
+	private String pendingMultiline;
+
+	/*
+	 * Add lines to this section.
+	 */
+	Section addLines(Set<String> changes, String...l) {
+		writeLock();
+		try {
+			if (l == null)
+				l = new String[0];
+			for (String line : l) {
+				if (line == null)
+					line = "";
+				if (line.matches("\\s*\\#.*"))
+					this.lines.add(line);
+				else if (line.matches("\\s*\\S+\\s*\\=.*")) {
+					// Key/value pairs are stored as either ">key" or "*key";
+					String key = line.substring(0, line.indexOf('=')).trim();
+					String val = line.substring(line.indexOf('=')+1).trim();
+					boolean encoded = key.length() > 1 && key.endsWith("*");
+					pendingMultiline = val.endsWith("\\") ? key : null;
+					if (pendingMultiline != null)
+						val = val.replaceAll("\\\\$", "\u0000");
+					if (encoded) {
+						key = key.substring(0, key.lastIndexOf('*'));
+						String v = val.toString().trim();
+						if (v.startsWith("{") && v.endsWith("}"))
+							val = configFile.getEncoder().decode(key, v.substring(1, v.length()-1));
+						else
+							configFile.setHasBeenModified();
+					}
+					if (containsKey(key)) {
+						entries.remove(key);
+						lines.remove('*' + key);
+						lines.remove('>' + key);
+					}
+					lines.add((encoded ? '*' : '>') + key);
+					addChange(changes, key, entries.put(key, val), val);
+				} else if (pendingMultiline != null) {
+					line = line.trim();
+					String key = pendingMultiline;
+					String val = entries.get(key);
+					if (line.endsWith("\\")) {
+						pendingMultiline = key;
+						line = line.replaceAll("\\\\$", "\u0000");
+					} else {
+						pendingMultiline = null;
+					}
+					val += line;
+					addChange(changes, key, entries.put(key, val), val);
+				} else
+					this.lines.add(line);
+			}
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/*
+	 * Remove all "#*" lines at the end of this section so they can
+	 * be associated with the next section.
+	 */
+	List<String> removeTrailingComments() {
+		LinkedList<String> l = new LinkedList<String>();
+		while ((! lines.isEmpty()) && lines.getLast().startsWith("#"))
+			l.addFirst(lines.removeLast());
+		return l;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Private methods
+	//--------------------------------------------------------------------------------
+
+	private void addLine(String key, boolean encoded) {
+		for (Iterator<String> i = lines.iterator(); i.hasNext();) {
+			String k = i.next();
+			if ((k.startsWith("*") || k.startsWith(">")) && k.substring(1).equals(key)) {
+				if (k.startsWith("*") && encoded || k.startsWith(">") && ! encoded)
+					return;
+				i.remove();
+			}
+		}
+		lines.add((encoded ? "*" : ">") + key);
+	}
+
+	private void readLock() {
+		lock.readLock().lock();
+	}
+
+	private void readUnlock() {
+		lock.readLock().unlock();
+	}
+
+	private void writeLock() {
+		if (readOnly)
+			throw new UnsupportedOperationException("Cannot modify read-only ConfigFile.");
+		lock.writeLock().lock();
+	}
+
+	private void writeUnlock() {
+		lock.writeLock().unlock();
+	}
+
+	private String trimComment(String s) {
+		return s.replaceAll("^\\s*\\#\\s*", "").trim();
+	}
+
+	private Set<String> createChanges() {
+		return (configFile != null && configFile.getListeners().size() > 0 ? new LinkedHashSet<String>() : null);
+	}
+
+	private void signalChanges(Set<String> changes) {
+		if (changes != null && ! changes.isEmpty())
+			for (ConfigFileListener l : configFile.getListeners())
+				l.onChange(configFile, changes);
+	}
+
+	private void addChange(Set<String> changes, String key, String oldVal, String newVal) {
+		if (changes != null)
+			if (! StringUtils.isEquals(oldVal, newVal))
+				changes.add(getFullKey(name, key));
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.class
new file mode 100755
index 0000000..65a4787
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.java
new file mode 100755
index 0000000..88f24da
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/SectionListener.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import java.util.*;
+
+import com.ibm.juno.core.utils.*;
+
+
+/**
+ * Listener that can be used to listen for change events for a specific section in a config file.
+ * <p>
+ * Use the {@link ConfigFile#addListener(ConfigFileListener)} method to register listeners.
+ */
+public class SectionListener extends ConfigFileListener {
+
+	private boolean isDefault;
+	private String prefix;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param section The name of the section in the config file to listen to.
+	 */
+	public SectionListener(String section) {
+		isDefault = StringUtils.isEmpty(section);
+		prefix = isDefault ? null : (section + '/');
+	}
+
+	@Override /* ConfigFileListener */
+	public void onChange(ConfigFile cf, Set<String> changes) {
+		for (String c : changes) {
+			if (isDefault) {
+				if (c.indexOf('/') == -1) {
+					onChange(cf);
+					return;
+				}
+			} else {
+				if (c.startsWith(prefix)) {
+					onChange(cf);
+					return;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Signifies that the config file entry changed.
+	 *
+	 * @param cf The config file being modified.
+	 */
+	public void onChange(ConfigFile cf) {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.class
new file mode 100755
index 0000000..fcc1ac5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.java
new file mode 100755
index 0000000..5157d20
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/XorEncoder.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Simply XOR+Base64 encoder for obscuring passwords and other sensitive data in INI config files.
+ * <p>
+ * This is not intended to be used as strong encryption.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class XorEncoder implements Encoder {
+
+	/** Reusable XOR-Encoder instance. */
+	public static final XorEncoder INSTANCE = new XorEncoder();
+
+   private static final String key = System.getProperty("com.ibm.juno.core.ini.XorEncoder.key", "nuy7og796Vh6G9O6bG230SHK0cc8QYkH");	// The super-duper-secret key
+
+	@Override /* Encoder */
+	public String encode(String fieldName, String in) {
+		byte[] b = in.getBytes(IOUtils.UTF8);
+		for (int i = 0; i < b.length; i++) {
+				int j = i % key.length();
+			b[i] = (byte)(b[i] ^ key.charAt(j));
+		}
+		return StringUtils.base64Encode(b);
+	}
+
+	@Override /* Encoder */
+	public String decode(String fieldName, String in) {
+		byte[] b = StringUtils.base64Decode(in);
+		for (int i = 0; i < b.length; i++) {
+			int j = i % key.length();
+			b[i] = (byte)(b[i] ^ key.charAt(j));
+	}
+		return new String(b, IOUtils.UTF8);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config1.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config1.png
new file mode 100755
index 0000000..531f280
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config2.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config2.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config2.png
new file mode 100755
index 0000000..7f5a4b3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config3.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config3.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config3.png
new file mode 100755
index 0000000..749da14
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/doc-files/config3.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/package.html
new file mode 100755
index 0000000..cd94ced
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/package.html
@@ -0,0 +1,643 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>INI file support</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>Overview</a></p> 
+	<li><p><a class='doclink' href='#Variables'>Variables</a></p> 
+	<li><p><a class='doclink' href='#Encoded'>Encoded Entries</a></p> 
+	<li><p><a class='doclink' href='#Listeners'>Listeners</a></p> 
+	<li><p><a class='doclink' href='#CommandLine'>Command Line API</a></p> 
+	<li><p><a class='doclink' href='#Serializing'>Serializing Config Files</a></p> 
+	<li><p><a class='doclink' href='#Merging'>Merging Config Files</a></p> 
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Overview</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.ini.ConfigMgr} and {@link com.ibm.juno.core.ini.ConfigFile} classes 
+		implement an API for working with INI-style configuration files such as the following:
+	</p>
+	<p class='bcode'>
+	<cc>#--------------------------</cc>
+	<cc># Default section</cc>
+	<cc>#--------------------------</cc>
+	<ck>key1</ck> = <cv>1</cv>
+	<ck>key2</ck> = <cv>true</cv>
+	<ck>key3</ck> = <cv>1,2,3</cv>
+	<ck>key4</ck> = <cv>http://foo</cv>
+	
+	<cc>#--------------------------</cc>
+	<cc># A comment about Section 1</cc>
+	<cc>#--------------------------</cc>
+	<cs>[Section1]</cs>
+	<ck>key1</ck> = <cv>2</cv>
+	<ck>key2</ck> = <cv>false</cv>
+	<ck>key3</ck> = <cv>4,5,6</cv>
+	<ck>key4</ck> = <cv>http://bar</cv>
+	</p>
+	
+	<p>
+		The {@link com.ibm.juno.core.ini.ConfigMgr} class is used to instantiate instances of 
+		{@link com.ibm.juno.core.ini.ConfigFile} which can then be used to retrieve config file values through either <js>"key"</js> or <js>"Section/key"</js> identifiers.
+	</p>
+
+	<p class='bcode'>
+	<jk>int</jk> key1;
+	<jk>boolean</jk> key2;
+	<jk>int</jk>[] key3;
+	URL key4;
+	
+	<jc>// Get our config file using the default config manager</jc>
+	ConfigFile f = ConfigMgr.<jsf>DEFAULT</jsf>.getConfig(<js>"C:/temp/MyConfig.cfg"</js>);
+
+	<jc>// Read values from default section</jc>
+	key1 = f.getInt(<js>"key1"</js>);
+	key2 = f.getBoolean(<js>"key2"</js>);
+	key3 = f.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"key3"</js>);
+	key4 = f.getObject(URL.<jk>class</jk>, <js>"key4"</js>);
+
+	<jc>// Read values from Section #1</jc>
+	key1 = f.getInt(<js>"Section1/key1"</js>);
+	key2 = f.getBoolean(<js>"Section1/key2"</js>);
+	key3 = f.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"Section1/key3"</js>);
+	key4 = f.getObject(URL.<jk>class</jk>, <js>"Section1/key4"</js>);
+	</p>
+
+	<p>
+		The interface also allows config files to be constructed programmatically...
+	</p>
+	
+	<p class='bcode'>
+	<jc>// Construct the sample INI file programmatically</jc>
+	ConfigFile f = ConfigMgr.<jsf>DEFAULT</jsf>.getConfig(<js>"C:/temp/MyConfig.cfg"</js>, <jk>true</jk>)
+		.addLines(<jk>null</jk>,                     <jc>// The default 'null' section</jc>
+			<js>"# Default section"</js>,             <jc>// A regular comment</jc>
+			<js>"key1 = 1"</js>,                      <jc>// A numeric entry</jc>
+			<js>"key2 = true"</js>,                   <jc>// A boolean entry</jc>
+			<js>"key3 = 1,2,3"</js>,                  <jc>// An array entry</jc>
+			<js>"key4 = http://foo"</js>,             <jc>// A POJO entry</jc>
+			<js>""</js>)                              <jc>// A blank line</jc>
+		.addHeaderComments(<js>"Section1"</js>,       <jc>// The 'Section1' section</jc>
+			<js>"A comment about Section 1"</js>)     <jc>// A header comment</jc>
+		.addLines(<js>"Section1"</js>,                <jc>// The 'Section1' section</jc>
+			<js>"key1 = 2"</js>,                      <jc>// A numeric entry</jc>
+			<js>"key2 = false"</js>,                  <jc>// A boolean entry</jc>
+			<js>"key3 = 4,5,6"</js>,                  <jc>// An array entry</jc>
+			<js>"key4 = http://bar"</js>)             <jc>// A POJO entry</jc>
+		.save();                            <jc>// Save to MyConfig.cfg</jc>
+	</p>
+	
+	<p>
+		The following is equivalent, except uses {@link com.ibm.juno.core.ini.ConfigFile#put(String,Object)} to set values.
+		Note how we're setting values as POJOs which will be automatically converted to strings when persisted to disk.
+	<p class='bcode'>
+	<jc>// Construct the sample INI file programmatically</jc>
+	ConfigFile f = ConfigMgr.<jsf>DEFAULT</jsf>.getConfig(<js>"C:/temp/MyConfig.cfg"</js>, <jk>true</jk>)
+		.addLines(<jk>null</jk>,
+			<js>"# Default section"</js>)
+		.addHeaderComments(<js>"Section1"</js>,
+			<js>"A comment about Section 1"</js>);
+	cf.put(<js>"key1"</js>, 1);
+	cf.put(<js>"key2"</js>, <jk>true</jk>);
+	cf.put(<js>"key3"</js>, <jk>new int</jk>[]{1,2,3});
+	cf.put(<js>"key4"</js>, <jk>new</jk> URL(<js>"http://foo"</js>));
+	cf.put(<js>"Section1/key1"</js>, 2);
+	cf.put(<js>"Section1/key2"</js>, <jk>false</jk>);
+	cf.put(<js>"Section1/key3"</js>, <jk>new int</jk>[]{4,5,6});
+	cf.put(<js>"Section1/key4"</js>, <jk>new</jk> URL(<js>"http://bar"</js>));
+	cf.save();
+	</p>
+	<p>
+		Refer to {@link com.ibm.juno.core.ini.ConfigFile#put(String,Object,boolean)} for a description of 
+		formats for various data types.
+	</p>
+	<p>
+		Various convenience getter methods are provided for retrieving different data types:
+	</p>
+	<p class='bcode'>
+	<jc>// Strings with default values</jc>
+	<jc>// key1 = foobar</jc>
+	String key1 = cf.getString(<js>"key1"</js>);
+
+	<jc>// Numbers</jc>
+	<jc>// key2 = 123</jc>
+	<jk>float</jk> key2 = cf.getObject(<jk>float</jk>.<jk>class</jk>, <js>"key2"</js>);
+
+	<jc>// Booleans</jc>
+	<jc>// key3 = true</jc>
+	<jk>boolean</jk> key3 = cf.getBoolean(<js>"key3"</js>);
+
+	<jc>// Objects convertable to and from strings using the JSON serializer and parser</jc>
+	<jc>// key4 = http://foo</jc>
+	URL key4 = cf.getObject(URL.<jk>class</jk>, <js>"key4"</js>);
+
+	<jc>// Arrays of strings</jc>
+	<jc>// key5 = foo, bar</jc>
+	String[] key5 = cf.getStringArray(<js>"key5"</js>);
+
+	<jc>// Arrays of objects</jc>
+	<jc>// key6 = http://foo,http://bar</jc>
+	URL[] key6 = cf.getObject(URL[].<jk>class</jk>, <js>"key6"</js>);
+
+	<jc>// Arrays of primitives</jc>
+	<jc>// key7 = 1,2,3</jc>
+	<jk>int</jk>[] key7 = cf.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"key7"</js>);
+
+	<jc>// Enums</jc>
+	<jc>// key8 = MINUTES</jc>
+	TimeUnit key8 = cf.getObject(TimeUnit.<jk>class</jk>, <js>"key8"</js>);
+
+	<jc>// Beans</jc>
+	<jc>// key9 = {name:'John Smith', addresses:[{street:'101 Main St', city:'Anywhere', state:'TX'}]}</jc>
+	Person key9 = cf.getObject(Person.<jk>class</jk>, <js>"key9"</js>);
+
+	<jc>// Generic Maps</jc>
+	<jc>// key10 = {foo:'bar', baz:123}</jc>
+	Map key10 = cf.getObject(ObjectMap.<jk>class</jk>, <js>"key10"</js>);
+	</p>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="Variables"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - Variables</h2>
+<div class='topic'>
+	<p>
+		Config files can contain variables that get resolved dynamically using the {@link com.ibm.juno.core.utils.StringVarResolver} API.<br>
+	</p>
+	<p>
+		Resolving config files can be retrieved through the following methods:
+		<ul>
+			<li>{@link com.ibm.juno.core.ini.ConfigFile#getResolving()} - Returns a config file that resolves a default set of variables.
+			<li>{@link com.ibm.juno.core.ini.ConfigFile#getResolving(StringVarResolver)} - Returns a config file that resolves a custom set of variables.
+		</ul>
+	</p>	
+	<p>
+		The default {@link com.ibm.juno.core.ini.ConfigFile#getResolving()} method returns a config file that resolves the following
+		variables:
+	</p>
+	<ul>
+		<li><code>$S{key}</code>, <code>$S{key,default}</code> - System properties.
+		<li><code>$E{key}</code>, <code>$E{key,default}</code> - Environment variables.
+		<li><code>$C{key}</code>, <code>$C{key,default}</code> - Values in this configuration file.
+	</ul>
+	<p>
+	<h6 class='topic'>Examples:</h6>
+	<p class='bcode'>
+	<cc>#--------------------------</cc>
+	<cc># Examples </cc>
+	<cc>#--------------------------</cc>
+	<cs>[MyProperties]</cs>
+	<ck>javaHome</ck> = <cv>$S{java.home}</cv>
+	<ck>path</ck> = <cv>$E{PATH}</cv>
+	<ck>customMessage</ck> = <cv>Java home is $C{MyProperties/javaHome} and the environment path is $C{MyProperties/path}.</cv>
+	</p>
+	<p>
+		Resolving config files (and any config files retrieved through the same <code>ConfigMgr</code> that point to the same physical file)
+		share the same underlying config files in memory.  
+		This allows changes in one instance of the config file to be reflected in all.
+	</p>
+	<p>
+		Support for variables is extensible.  You can add support for your own variables by implementing custom 
+		{@link com.ibm.juno.core.utils.StringVarResolver StringVarResolvers}.<br>
+		For example, the microservice <code>Resource</code> class provides access to config files that
+			can contain any of the following variables:
+	</p>
+	<ul>
+		<li><code>$C</code> - Config variables.
+		<li><code>$S</code> - System properties.
+		<li><code>$E</code> - Environment variables.
+		<li><code>$I</code> - Servlet init parameters.
+		<li><code>$ARG</code> - JVM command-line arguments.
+		<li><code>$MF</code> - Main jar manifest file entries.
+		<li><code>$L</code> - Localized strings.
+		<li><code>$A</code> - HTTP request attributes.
+		<li><code>$P</code> - HTTP request URL parameters.
+		<li><code>$R</code> - HTTP request variables.
+		<li><code>$UE</code> - URL-encoding function.
+	</ul>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="Encoded"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - Encoded Entries</h2>
+<div class='topic'>
+	<p>
+		If a config file contains sensitive information such as passwords, those values can be 
+		marked for encoding by appending <js>'*'</js> to the end of the key name.<br>
+		If a marked and unencoded value is detected in the file during load, it will be encoded and saved immediately.
+	</p>
+	<p>
+		For example, the following password is marked for encoding....
+	</p>
+	<p class='bcode'>
+		<cs>[MyHost]</cs>
+		<ck>url</ck> = <cv>http://localhost:9080/foo</cv>
+		<ck>user</ck> = <cv>me</cv>
+		<ck>password*</ck> = <cv>mypassword</cv>
+	</p>
+	<p>
+		After initial loading, the file contents will contain an encoded value...
+	</p>
+	<p class='bcode'>
+		<cs>[MyHost]</cs>
+		<ck>url</ck> = <cv>http://localhost:9080/foo</cv>
+		<ck>user</ck> = <cv>me</cv>
+		<ck>password*</ck> = <cv>{AwwJVhwUQFZEMg==}</cv>
+	</p>
+	<p>
+		The default encoder is {@link com.ibm.juno.core.ini.XorEncoder} which is a simple XOR+Base64 encoder.<br>
+		If desired, custom encoder can be used by implementing the {@link com.ibm.juno.core.ini.Encoder}
+		interface and creating your own <code>ConfigMgr</code> using the {@link com.ibm.juno.core.ini.ConfigMgr#ConfigMgr(boolean,Encoder,WriterSerializer,ReaderParser,Charset,String[])}
+		constructor.
+	</p>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="Listeners"></a>
+<h2 class='topic' onclick='toggle(this)'>4 - Listeners</h2>
+<div class='topic'>
+	<p>
+		The following method is provided for listening to changes made on config files:
+	</p>
+	<p>
+		{@link com.ibm.juno.core.ini.ConfigFile#addListener(ConfigFileListener)}.
+	</p>
+	<p>
+		Subclasses are provided for listening for different kinds of events:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.ini.ConfigFileListener} - Config file is saved, loaded, or modified.
+		<li>{@link com.ibm.juno.core.ini.SectionListener} - One or more entries in a section are modified.
+		<li>{@link com.ibm.juno.core.ini.EntryListener} - An individual entry is modified.
+	</ul>
+	<h6 class="topic">Example:</h6>
+	<p class='bcode'>
+	<jc>// Get our config file using the default config manager</jc>
+	ConfigFile f = ConfigMgr.<jsf>DEFAULT</jsf>.getConfig(<js>"C:/temp/MyConfig.cfg"</js>);
+
+	<jc>// Add a listener for an entry</jc>
+	f.addListener(
+		<jk>new</jk> EntryListener(<js>"Section1/key1"</js>) {
+			<ja>@Override</ja>
+			<jk>public void</jk> onChange(ConfigFile cf) {
+				System.<jsf>err</jsf>.println(<js>"Entry changed!  New value is "</js> + cf.getString(<js>"Section1/key1"</js>));
+			}
+		}
+	);
+	</p>
+	<p>
+		Note that since {@link com.ibm.juno.core.ini.ConfigFile} instances for the same physical files are shared in {@link com.ibm.juno.core.ini.ConfigMgr}, a change made
+		in once instance of a config file will trigger all listeners defined on that physical file.
+	</p>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="CommandLine"></a>
+<h2 class='topic' onclick='toggle(this)'>5 - Command Line API</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.ini.ConfigMgr} class contains a {@link com.ibm.juno.core.ini.ConfigMgr#main(String[])}
+			method that can be used to work with config files through a command-line prompt.<br>
+		This is invoked as a normal Java command:
+	</p>
+	<p class='bcode'>
+	java -jar juno.jar com.ibm.juno.core.ini.ConfigMgr [args]
+	</p>
+	<p>
+		Arguments can be any of the following...
+		<ul class='spaced-list'>
+			<li>No arguments<br>
+				Prints usage message.
+			<li><code>createBatchEnvFile -configfile &lt;configFile&gt; -envfile &lt;batchFile&gt; [-verbose]</code><br>
+				Creates a batch file that will set each config file entry as an environment variable.<br>
+				Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>)
+				will be converted to underscores.
+			<li><code>createShellEnvFile -configFile &lt;configFile&gt; -envFile &lt;configFile&gt; [-verbose]</code>
+				Creates a shell script that will set each config file entry as an environment variable.<br>
+				Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>)
+					will be converted to underscores.
+			<li><code>setVals -configFile &lt;configFile&gt; -vals [var1=val1 [var2=val2...]] [-verbose]</code>
+				Sets values in config files.
+		</ul>
+	</p>
+	<p>
+		For example, the following command will create the file <code>'MyConfig.bat'</code> from the contents of the file <code>'MyConfig.cfg'</code>.
+	</p>
+	<p class='bcode'>
+		java com.ibm.juno.core.ini.ConfigMgr createBatchEnvFile -configfile C:\foo\MyConfig.cfg -batchfile C:\foo\MyConfig.bat
+	</p>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="Serializing"></a>
+<h2 class='topic' onclick='toggle(this)'>6 - Serializing Config Files</h2>
+<div class='topic'>
+	<p>
+		Instances of {@link com.ibm.juno.core.ini.ConfigFile} are POJOs that can be serialized to and parsed from
+			all supported Juno languages.
+	</p>
+	<p>
+		The <code>com.ibm.juno.microservice.resources.ConfigResource</code> is a predefined REST interface that
+			allows access to the config file used by a microservice.<br>
+		The <code>com.ibm.team.juno.samples</code> project is a microservice that includes this resource
+			at <code>http://localhost:10000/sample/config</code>.<br>
+		The sample microservice uses the following config file <code>juno-samples.cfg</code>:
+	</p>
+	<p class='bcode'>
+	<cc>#================================================================================
+	# Basic configuration file for SaaS microservices
+	# Subprojects can use this as a starting point.
+	#================================================================================</cc>
+	
+	<cc>#================================================================================
+	# REST settings
+	#================================================================================</cc>
+	<cs>[REST]</cs>
+	
+	<cc># The HTTP port number to use.
+	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	<ck>port</ck> = <cv>10000</cv>
+	
+	<cc># A JSON map of servlet paths to servlet classes.
+	# Example:  
+	# 	resourceMap = {'/*':'com.ibm.MyServlet'}
+	# Either resourceMap or resources must be specified.</cc>
+	<ck>resourceMap</ck> = 
+
+	<cc># A comma-delimited list of names of classes that extend from Servlet.
+	# Resource paths are pulled from @RestResource.path() annotation, or
+	# 	"/*" if annotation not specified.
+	# Example:  
+	# 	resources = com.ibm.MyServlet
+	# Default is Rest-Resources in manifest file.
+	# Either resourceMap or resources must be specified.</cc>
+	<ck>resources</ck> = 
+
+	<cc># The context root of the Jetty server.
+	# Default is Rest-ContextPath in manifest file, or "/".</cc>
+	<ck>contextPath</ck> = 
+
+	<cc># Authentication:  NONE, BASIC.</cc>
+	<ck>authType</ck> = <cv>NONE</cv>
+	
+	<cc># The BASIC auth username.
+	# Default is Rest-LoginUser in manifest file.</cc>
+	<ck>loginUser</ck> = 
+	
+	<cc># The BASIC auth password.
+	# Default is Rest-LoginPassword in manifest file.</cc>
+	<ck>loginPassword</ck> = 
+	
+	<cc># The BASIC auth realm.
+	# Default is Rest-AuthRealm in manifest file.</cc>
+	<ck>authRealm</ck> = 
+	
+	<cc># Stylesheet to use for HTML views.
+	# The default options are:
+	#  - styles/juno.css
+	#  - styles/devops.css
+	# Other stylesheets can be referenced relative to the servlet package or working
+	# 	directory.</cc>
+	<ck>stylesheet</ck> = <cv>styles/devops.css</cv>
+	
+	<cc># What to do when the config file is saved.
+	# Possible values:
+	# 	NOTHING - Don't do anything. 
+	#	RESTART_SERVER - Restart the Jetty server.
+	#	RESTART_SERVICE - Shutdown and exit with code '3'.</cc>
+	<ck>saveConfigAction</ck> = <cv>RESTART_SERVER</cv>
+	
+	<cc># Enable SSL support.</cc>
+	<ck>useSsl</ck> = false
+	
+	<cc>#================================================================================
+	# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
+	#--------------------------------------------------------------------------------
+	# Ignored if REST/useSsl is false.
+	#================================================================================</cc>
+	<cs>[REST-SslContextFactory]</cs>
+	<ck>keyStorePath</ck> = <cv>client_keystore.jks</cv>
+	<ck>keyStorePassword*</ck> = <cv>{HRAaRQoT}</cv>
+	<ck>excludeCipherSuites</ck> = <cv>TLS_DHE.*, TLS_EDH.*</cv>
+	<ck>excludeProtocols</ck> = <cv>SSLv3</cv>
+	<ck>allowRenegotiate</ck> = <cv>false</cv>
+	
+	<cc>#================================================================================
+	# Logger settings
+	# See FileHandler Java class for details.
+	#================================================================================</cc>
+	<cs>[Logging]</cs>
+
+	<cc># The directory where to create the log file.
+	# Default is "."</cc>
+	<ck>logDir</ck> = <cv>logs</cv>
+	
+	<cc># The name of the log file to create for the main logger.
+	# The logDir and logFile make up the pattern that's passed to the FileHandler
+	# constructor.
+	# If value is not specified, then logging to a file will not be set up.</cc>
+	<ck>logFile</ck> = <cv>microservice.%g.log</cv>
+	
+	<cc># Whether to append to the existing log file or create a new one.
+	# Default is false.</cc>
+	<ck>append</ck> = 
+	
+	<cc># The SimpleDateFormat format to use for dates.
+	# Default is "yyyy.MM.dd hh:mm:ss".</cc>
+	<ck>dateFormat</ck> = 
+	
+	<cc># The log message format.
+	# The value can contain any of the following variables:
+	# 	{date} - The date, formatted per dateFormat.
+	#	{class} - The class name.
+	#	{method} - The method name.
+	#	{logger} - The logger name.
+	#	{level} - The log level name.
+	#	{msg} - The log message.
+	#	{threadid} - The thread ID.
+	#	{exception} - The localized exception message.
+	# Default is "[{date} {level}] {msg}%n".</cc>
+	<ck>format</ck> =
+	
+	<cc># The maximum log file size.
+	# Suffixes available for numbers.
+	# See ConfigFile.getInt(String,int) for details.
+	# Default is 1M.</cc>
+	<ck>limit</ck> = <cv>10M</cv>
+	
+	<cc># Max number of log files.
+	# Default is 1.</cc>
+	<ck>count</ck> = <cv>5</cv>
+	
+	<cc># Default log levels.
+	# Keys are logger names.
+	# Values are serialized Level POJOs.</cc>
+	<ck>levels</ck> = <cv>{ com.ibm.juno:'INFO' }</cv>
+	
+	<cc># Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
+	# Useful for preventing log files from filling up with duplicate stack traces.
+	# Default is false.</cc>
+	<ck>useStackTraceHashes</ck> = <cv>true</cv>
+	
+	<cc># The default level for the console logger.
+	# Default is WARNING.</cc>
+	<ck>consoleLevel</ck> = 
+	
+	<cc>#================================================================================
+	# System properties
+	#--------------------------------------------------------------------------------
+	# These are arbitrary system properties that are set during startup.
+	#================================================================================</cc>
+	<cs>[SystemProperties]</cs>
+	
+	<cc># Configure Jetty for StdErrLog Logging</cc>
+	<ck>org.eclipse.jetty.util.log.class</ck> = <cv>org.eclipse.jetty.util.log.StrErrLog</cv>
+	
+	<cc># Jetty logging level</cc>
+	<ck>org.eclipse.jetty.LEVEL</ck> = <cv>WARN</cv>		
+	</p>
+	<p>
+		The config file looks deceivingly simple.
+		However, it should be noticed that the config file is a VERY powerful feature with many capabilities including:
+	</p>
+	<p>
+		When you point your browser to this resource, you'll notice that the contents of the config file
+			are being serialized to HTML as a POJO: 
+	</p>
+	<img class='bordered' src="doc-files/config1.png">
+	<p>
+		Likewise, the config file can also be serialized as any of the supported languages such as JSON: 
+	</p>
+	<img class='bordered' src="doc-files/config2.png">
+	<p>
+		The code for implementing this page could not be any simpler, since it simply returns the config
+			file returned by the <code>RestServlet.getConfig()</code> method.
+	</p>
+	<p class='bcode'>
+		<jd>/** 
+		 * [GET /] - Show contents of config file.
+		 *  
+		 * <ja>@return</ja> The config file.  
+		 * <ja>@throws</ja> Exception 
+		 */</jd>
+		<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/"</js>, description=<js>"Show contents of config file."</js>)
+		<jk>public</jk> ConfigFile getConfigContents() <jk>throws</jk> Exception {
+			<jk>return</jk> getConfig();
+		}
+	</p>
+	<p>
+		The edit page takes you to an editor that allows you to modify the contents of the config file: 
+	</p>
+	<img class='bordered' src="doc-files/config3.png">
+	<p>
+		This latter page uses the {@link com.ibm.juno.core.ini.ConfigFile#toString()} method to retrieve the
+		contents of the config file in INI format.
+	</p>
+	<p>
+		Since config files are serializable, that mean they can also be retrieved through the <code>RestClient</code> API.
+	</p>
+	<p class='bcode'>
+	<jc>// Create a new REST client with JSON support</jc>
+	RestClient c = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+
+	<jc>// Retrieve config file through REST interface</jc>
+	ConfigFile cf = c.doGet(<js>"http://localhost:10000/sample/config"</js>).getResponse(ConfigFileImpl.<jk>class</jk>);
+	</p>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="Merging"></a>
+<h2 class='topic' onclick='toggle(this)'>7 - Merging Config Files</h2>
+<div class='topic'>
+	<p>
+		In the previous example, an edit page was shown that allows you to edit config files through
+		a REST interface.<br>
+		Note that if only a single entry is modified in the config file, we only want to trigger
+		listeners for that change, not trigger all listeners.<br>
+		This is where the {@link com.ibm.juno.core.ini.ConfigFile#merge(ConfigFile)} method comes into play.<br>
+		This method will copy the contents of one config file over to another config file, but only
+		trigger listeners when the values are different.
+	</p>
+	<p>
+		The edit page is implemented with this method which is a simple PUT with the contents of
+			the new INI file as the body of the HTTP request:
+	</p>
+	<p class='bcode'>
+	<jd>/** 
+	 * [PUT /] - Sets contents of config file. 
+	 * 
+	 * <ja>@param</ja> contents The new contents of the config file. 
+	 * <ja>@return</ja> The new config file contents.
+	 * <ja>@throws</ja> Exception 
+	 */</jd>
+	<ja>@RestMethod</ja>(name=<js>"PUT"</js>, path=<js>"/"</js>,
+		description=<js>"Sets contents of config file."</js>,
+		input={
+			<ja>@Var</ja>(category=<jsf>CONTENT</jsf>, description=<js>"New contents in INI file format."</js>)
+		}
+	)
+	<jk>public</jk> ConfigFile setConfigContents(<ja>@Content</ja> Reader contents) <jk>throws</jk> Exception {
+		
+		<jc>// Create a new in-memory config file based on the contents of the HTTP request.</jc>
+		ConfigFile cf2 = ConfigMgr.<jsf>DEFAULT</jsf>.create().load(contents);
+		
+		<jc>// Merge the in-memory config file into the existing config file and save it.
+		// Then return the modified config file to be parsed as a POJO.</jc>
+		<jk>return</jk> getConfig().merge(cf2).save();
+	}
+	</p>
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.class
new file mode 100755
index 0000000..0e88fb4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.java
new file mode 100755
index 0000000..94f0480
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/Constants.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Constants used by the {@link RdfSerializer} and {@link RdfParser} classes.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class Constants {
+
+	//--------------------------------------------------------------------------------
+	// Built-in Jena languages.
+	//--------------------------------------------------------------------------------
+
+	/** Jena language support: <js>"RDF/XML"</js>.*/
+	public static final String LANG_RDF_XML = "RDF/XML";
+
+	/** Jena language support: <js>"RDF/XML-ABBREV"</js>.*/
+	public static final String LANG_RDF_XML_ABBREV = "RDF/XML-ABBREV";
+
+	/** Jena language support: <js>"N-TRIPLE"</js>.*/
+	public static final String LANG_NTRIPLE = "N-TRIPLE";
+
+	/** Jena language support: <js>"TURTLE"</js>.*/
+	public static final String LANG_TURTLE = "TURTLE";
+
+	/** Jena language support: <js>"N3"</js>.*/
+	public static final String LANG_N3 = "N3";
+
+
+	//--------------------------------------------------------------------------------
+	// Built-in Juno properties.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * RDF property identifier <js>"items"</js>.
+	 * <p>
+	 * For resources that are collections, this property identifies the RDF Sequence
+	 * 	container for the items in the collection.
+	 */
+	public static final String RDF_junoNs_ITEMS = "items";
+
+	/**
+	 * RDF property identifier <js>"root"</js>.
+	 * <p>
+	 * Property added to root nodes to help identify them as root elements during parsing.
+	 * <p>
+	 * Added if {@link RdfSerializerProperties#RDF_addRootProperty} setting is enabled.
+	 */
+	public static final String RDF_junoNs_ROOT = "root";
+
+	/**
+	 * RDF property identifier <js>"class"</js>.
+	 * <p>
+	 * Property added to bean resources to identify the class type.
+	 * <p>
+	 * Added if {@link SerializerProperties#SERIALIZER_addClassAttrs} setting is enabled.
+	 */
+	public static final String RDF_junoNs_CLASS = "class";
+
+	/**
+	 * RDF property identifier <js>"value"</js>.
+	 * <p>
+	 * Property added to nodes to identify a simple value.
+	 */
+	public static final String RDF_junoNs_VALUE = "value";
+
+	/**
+	 * RDF resource that identifies a <jk>null</jk> value.
+	 */
+	public static final String RDF_NIL = "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil";
+
+	/**
+	 * RDF resource that identifies a <code>Seq</code> value.
+	 */
+	public static final String RDF_SEQ = "http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq";
+
+	/**
+	 * RDF resource that identifies a <code>Bag</code> value.
+	 */
+	public static final String RDF_BAG = "http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.class
new file mode 100755
index 0000000..a2b5d07
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.java
new file mode 100755
index 0000000..9a0cd4a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfBeanPropertyMeta.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import static com.ibm.juno.core.jena.RdfCollectionFormat.*;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.jena.annotation.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Metadata on bean properties specific to the RDF serializers and parsers pulled from the {@link Rdf @Rdf} annotation on the bean property.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The bean class.
+ */
+public class RdfBeanPropertyMeta<T> {
+
+	private RdfCollectionFormat collectionFormat = DEFAULT;
+	private Namespace namespace = null;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param bpMeta The metadata of the bean property of this additional metadata.
+	 */
+	public RdfBeanPropertyMeta(BeanPropertyMeta<T> bpMeta) {
+
+		List<Rdf> rdfs = bpMeta.findAnnotations(Rdf.class);
+		List<RdfSchema> schemas = bpMeta.findAnnotations(RdfSchema.class);
+
+		for (Rdf rdf : rdfs)
+			if (collectionFormat == DEFAULT)
+				collectionFormat = rdf.collectionFormat();
+
+		namespace = RdfUtils.findNamespace(rdfs, schemas);
+	}
+
+	/**
+	 * Returns the RDF collection format of this property from the {@link Rdf#collectionFormat} annotation on this bean property.
+	 *
+	 * @return The RDF collection format, or {@link RdfCollectionFormat#DEFAULT} if annotation not specified.
+	 */
+	protected RdfCollectionFormat getCollectionFormat() {
+		return collectionFormat;
+	}
+
+	/**
+	 * Returns the RDF namespace associated with this bean property.
+	 * <p>
+	 * 	Namespace is determined in the following order:
+	 * <ol>
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean property field.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean getter.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean setter.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean package.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean superclasses.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean superclass packages.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean interfaces.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on bean interface packages.
+	 * </ol>
+	 *
+	 * @return The namespace associated with this bean property, or <jk>null</jk> if no namespace is
+	 * 	associated with it.
+	 */
+	public Namespace getNamespace() {
+		return namespace;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.class
new file mode 100755
index 0000000..6269aad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.java
new file mode 100755
index 0000000..d23e2f0
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfClassMeta.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import java.util.*;
+
+import com.ibm.juno.core.jena.annotation.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Metadata on classes specific to the RDF serializers and parsers pulled from the {@link Rdf @Rdf} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class RdfClassMeta {
+
+	private final Rdf rdf;
+	private final RdfCollectionFormat collectionFormat;
+	private final Namespace namespace;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param c The class that this annotation is defined on.
+	 */
+	public RdfClassMeta(Class<?> c) {
+		this.rdf = ReflectionUtils.getAnnotation(Rdf.class, c);
+		if (rdf != null) {
+			collectionFormat = rdf.collectionFormat();
+		} else {
+			collectionFormat = RdfCollectionFormat.DEFAULT;
+		}
+		List<Rdf> rdfs = ReflectionUtils.findAnnotations(Rdf.class, c);
+		List<RdfSchema> schemas = ReflectionUtils.findAnnotations(RdfSchema.class, c);
+		this.namespace = RdfUtils.findNamespace(rdfs, schemas);
+	}
+
+	/**
+	 * Returns the {@link Rdf} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Rdf} annotation, or <jk>null</jk> if annotation is not specified.
+	 */
+	protected Rdf getAnnotation() {
+		return rdf;
+	}
+
+	/**
+	 * Returns the {@link Rdf#collectionFormat()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Rdf#collectionFormat()} annotation, or <jk>null</jk> if annotation is not specified.
+	 */
+	protected RdfCollectionFormat getCollectionFormat() {
+		return collectionFormat;
+	}
+
+	/**
+	 * Returns the RDF namespace associated with this class.
+	 * <p>
+	 * 	Namespace is determined in the following order:
+	 * <ol>
+	 * 	<li>{@link Rdf#prefix()} annotation defined on class.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on package.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on superclasses.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on superclass packages.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on interfaces.
+	 * 	<li>{@link Rdf#prefix()} annotation defined on interface packages.
+	 * </ol>
+	 *
+	 * @return The namespace associated with this class, or <jk>null</jk> if no namespace is
+	 * 	associated with it.
+	 */
+	protected Namespace getNamespace() {
+		return namespace;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.class
new file mode 100755
index 0000000..445b907
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.class differ


[27/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.java
new file mode 100755
index 0000000..363947f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.jena.*;
+import com.ibm.juno.core.xml.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Used tailor how bean properties get interpreted by the framework.
+ * <p>
+ * 	Can be used to do the following:
+ * <ul>
+ * 	<li>Override the name of a property.
+ * 	<li>Identify a getter or setter with a non-standard naming convention.
+ * 	<li>Identify a specific subclass for a property with a general class type.
+ * 	<li>Identify class types of elements in properties of type <code>Collection</code> or <code>Map</code>.
+ * 	<li>Hide properties during serialization.
+ * 	<li>Associate filters with bean property values, such as a filter to convert a <code>Calendar</code> field to a string.
+ * 	<li>Override the list of properties during serialization on child elements of a property of type <code>Collection</code> or <code>Map</code>.
+ * 	<li>Identify a property as the URL for a bean.
+ * 	<li>Identify a property as the ID for a bean.
+ * </ul>
+ * <p>
+ * 	This annotation is applied to public fields and public getter/setter methods of beans.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({FIELD,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface BeanProperty {
+
+	/**
+	 * Identifies the name of the property.
+	 * <p>
+	 * 	Normally, this is automatically inferred from the field name or getter method name
+	 * 	of the property.  However, this property can be used to assign a different
+	 * 	property name from the automatically inferred value.
+	 * <p>
+	 * 	If the {@link BeanContextProperties#BEAN_beanFieldVisibility} setting on the bean context excludes this field (e.g. the visibility
+	 * 	is set to PUBLIC, but the field is PROTECTED), this annotation can be used to force the field to be identified as a property.
+	 */
+	String name() default "";
+
+	/**
+	 * Identifies a specialized class type for the property.
+	 * <p>
+	 * 	Normally this can be inferred through reflection of the field type or getter return type.
+	 * 	However, you'll want to specify this value if you're parsing beans where the bean property class
+	 * 	is an interface or abstract class to identify the bean type to instantiate.  Otherwise, you may
+	 * 	cause an {@link InstantiationException} when trying to set these fields.
+	 * <p>
+	 * 	This property must denote a concrete bean class with a no-arg constructor.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyBean {
+	 *
+	 * 		<jc>// Identify concrete map type.</jc>
+	 * 		<ja>@BeanProperty</ja>(type=HashMap.<jk>class</jk>)
+	 * 		<jk>public</jk> Map <jf>p1</jf>;
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	Class<?> type() default Object.class;
+
+	/**
+	 * For bean properties of maps and collections, this annotation can be used to identify
+	 * the class types of the contents of the bean property object when the generic parameter
+	 * types are interfaces or abstract classes.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyBean {
+	 *
+	 * 		<jc>// Identify concrete map type with String keys and Integer values.</jc>
+	 * 		<ja>@BeanProperty</ja>(type=HashMap.<jk>class</jk>, params={String.<jk>class</jk>,Integer.<jk>class</jk>})
+	 * 		<jk>public</jk> Map <jf>p1</jf>;
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	Class<?>[] params() default {};
+
+	/**
+	 * Associates an object filter with this bean property that will convert it
+	 * to a different value during serialization and parsing.
+	 * <p>
+	 * This annotation supersedes any filter associated with the bean property type
+	 * 	class itself.
+	 * <p>
+	 * Typically used for rendering {@link Date Dates} and {@link Calendar Calendars}
+	 * 	as a particular string format.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyClass {
+	 *
+	 * 		<jc>// During serialization, convert to ISO8601 date-time string.</jc>
+	 * 		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DT.<jk>class</jk>)
+	 * 		<jk>public</jk> Calendar getTime();
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	Class<? extends PojoFilter<?,?>> filter() default PojoFilter.NULL.class;
+
+	/**
+	 * Used to limit which child properties are rendered by the serializers.
+	 * <p>
+	 * Can be used on any of the following bean property types:
+	 * <ul>
+	 * 	<li>Beans - Only render the specified properties of the bean.
+	 * 	<li>Maps - Only render the specified entries in the map.
+	 * 	<li>Bean/Map arrays - Same, but applied to each element in the array.
+	 * 	<li>Bean/Map collections - Same, but applied to each element in the collection.
+	 * </ul>
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyClass {
+	 *
+	 * 		<jc>// Only render 'f1' when serializing this bean property.</jc>
+	 * 		<ja>@BeanProperty</ja>(properties={<js>"f1"</js>})
+	 * 		<jk>public</jk> MyChildClass x1 = <jk>new</jk> MyChildClass();
+	 * 	}
+	 *
+	 * 	<jk>public class</jk> MyChildClass {
+	 * 		<jk>public int</jk> f1 = 1;
+	 * 		<jk>public int</jk> f2 = 2;
+	 * 	}
+	 *
+	 * 	<jc>// Renders "{x1:{f1:1}}"</jc>
+	 * 	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(<jk>new</jk> MyClass());
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String[] properties() default {};
+
+	/**
+	 * Marks a bean property as a resource URI identifier for the bean.
+	 * <p>
+	 * Has the following effects on the following serializers:
+	 * <ul>
+	 * 	<li>{@link XmlSerializer} - Will be rendered as an XML attribute on the bean element, unless
+	 * 		marked with a {@link Xml#format} value of {@link XmlFormat#ELEMENT}.
+	 * 	<li>{@link RdfSerializer} - Will be rendered as the value of the <js>"rdf:about"</js> attribute
+	 * 		for the bean.
+	 * </ul>
+	 */
+	boolean beanUri() default false;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.class
new file mode 100755
index 0000000..a3a120f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.java
new file mode 100755
index 0000000..30f02b5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanSubType.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Maps a bean subclass with a string identifier.
+ * <p>
+ * 	Used in conjunction with {@link Bean#subTypes()} for defining mappings of bean subclasses with string identifiers.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({})
+@Retention(RUNTIME)
+@Inherited
+public @interface BeanSubType {
+
+	/**
+	 * The bean subclass.
+	 * <p>
+	 * Must be a subclass or subinterface of the parent bean.
+	 */
+	Class<?> type();
+
+	/**
+	 * A string identifier for this subtype.
+	 * <p>
+	 * This identifier is used in conjunction with the {@link Bean#subTypeProperty()} during serialization
+	 * 	to create a <code>{subType:<js>'id'</js>}</code> property on the serialized object.
+	 */
+	String id();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.class
new file mode 100755
index 0000000..b5d8a1b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.java
new file mode 100755
index 0000000..916ed55
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Consumes.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Annotation used on subclasses of {@link Parser} to identify the media types that it consumes.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Provides a way to define the contents of {@link Parser#getMediaTypes()} through an annotation.
+ * <p>
+ * 	The {@link Parser#getMediaTypes()} default implementation gathers the media types by looking
+ * 		for this annotation.
+ * 	It should be noted that this annotation is optional and that the {@link Parser#getMediaTypes()} method can
+ * 		be overridden by subclasses to return the media types programmatically.
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p>
+ * 	Standard example:
+ * <p class='bcode'>
+ * 	<ja>@Consumes</ja>({<js>"application/json"</js>,<js>"text/json"</js>})
+ * 	<jk>public class</jk> JsonParser <jk>extends</jk> ReaderParser {...}
+ * </p>
+ * <p>
+ * 	The media types can also be <code>media-range</code> values per
+ * 		<a href='http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1'>RFC2616/14.1</a>.
+ * <p class='bcode'>
+ * 	<jc>// Consumes any text</jc>
+ * 	<ja>@Consumes</ja>({<js>"text\/*"</js>})
+ * 	<jk>public class</jk> AnythingParser <jk>extends</jk> ReaderParser {...}
+ *
+ * 	<jc>// Consumes anything</jc>
+ * 	<ja>@Consumes</ja>({<js>"*\/*"</js>})
+ * 	<jk>public class</jk> AnythingParser <jk>extends</jk> ReaderParser {...}
+ * </p>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(TYPE)
+@Retention(RUNTIME)
+@Inherited
+public @interface Consumes {
+
+	/**
+	 * The media types that the parser can handle.
+	 * <p>
+	 * 	Can contain meta-characters per the <code>media-type</code> specification of
+	 * 	<a href='http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1'>RFC2616/14.1</a>
+	 * @return The media types that the parser can handle.
+	 */
+	String[] value() default {};
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.class
new file mode 100755
index 0000000..817787c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.java
new file mode 100755
index 0000000..a0147ca
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Filter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Annotation that can be applied to a class to associate a filter with it.
+ * <p>
+ * 	Typically used to associate {@link PojoFilter PojoFilters} with classes using annotations
+ * 		instead of programatically through a method such as {@link Serializer#addFilters(Class...)}.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p>
+ * 	In this case, a filter is being applied to a bean that will force it to be serialized as a <code>String</code>
+ * <p class='bcode'>
+ * 	<jc>// Our bean class</jc>
+ * 	<ja>@Filter</ja>(BFilter.<jk>class</jk>)
+ * 	<jk>public class</jk> B {
+ * 		<jk>public</jk> String <jf>f1</jf>;
+ * 	}
+ *
+ * 	<jc>// Our filter to force the bean to be serialized as a String</jc>
+ * 	<jk>public class</jk> BFilter <jk>extends</jk> PojoFilter&lt;B,String&gt; {
+ * 		<jk>public</jk> String filter(B o) <jk>throws</jk> SerializeException {
+ * 			<jk>return</jk> o.f1;
+ * 		}
+ * 		<jk>public</jk> B unfilter(String f, ClassMeta&lt;?&gt; hint) <jk>throws</jk> ParseException {
+ * 			B b1 = <jk>new</jk> B();
+ * 			b1.<jf>f1</jf> = f;
+ * 			<jk>return</jk> b1;
+ * 		}
+ * 	}
+ *
+ * 	<jk>public void</jk> testFilter() <jk>throws</jk> Exception {
+ * 		WriterSerializer s = JsonSerializer.<jsf>DEFAULT</jsf>;
+ * 		B b = <jk>new</jk> B();
+ * 		b.<jf>f1</jf> = <js>"bar"</js>;
+ * 		String json = s.serialize(b);
+ * 		<jsm>assertEquals</jsm>(<js>"'bar'"</js>, json);
+ *
+ * 		ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+ * 		b = p.parse(json, B.<jk>class</jk>);
+ * 		<jsm>assertEquals</jsm>(<js>"bar"</js>, t.<jf>f1</jf>);
+ * 	}
+ * </p>
+ * <p>
+ * 	Note that using this annotation is functionally equivalent to adding filters to the serializers and parsers:
+ * <p class='bcode'>
+ * 	WriterSerializer s = <jk>new</jk> JsonSerializer.addFilters(BFilter.<jk>class</jk>);
+ * 	ReaderParser p = <jk>new</jk> JsonParser.addFilters(BFilter.<jk>class</jk>);
+ * </p>
+ * <p>
+ * 	It is technically possible to associate a {@link BeanFilter} with a bean class using this annotation.
+ * 	However in practice, it's almost always less code to simply use the {@link Bean @Bean} annotation.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(TYPE)
+@Retention(RUNTIME)
+@Inherited
+public @interface Filter {
+
+	/**
+	 * The filter class.
+	 */
+	Class<? extends com.ibm.juno.core.filter.Filter> value() default com.ibm.juno.core.filter.Filter.NULL.class;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.class
new file mode 100755
index 0000000..e25af65
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.java
new file mode 100755
index 0000000..df21fc3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/NameProperty.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.ini.*;
+
+/**
+ * Identifies a setter as a method for setting the name of a POJO as it's known by
+ * its parent object.
+ * <p>
+ * For example, the {@link Section} class must know the name it's known by it's parent
+ * {@link ConfigFileImpl} class, so parsers will call this method with the sectio name
+ * using the {@link Section#setName(String)} method.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Target({METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface NameProperty {}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.class
new file mode 100755
index 0000000..02e8788
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.java
new file mode 100755
index 0000000..68f6d61
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/ParentProperty.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.ini.*;
+
+/**
+ * Identifies a setter as a method for adding a parent reference to a child object.
+ * <p>
+ * Used by the parsers to add references to parent objects in child objects.
+ * For example, the {@link Section} class cannot exist outside the scope of a parent
+ * {@link ConfigFileImpl} class, so parsers will add a reference to the config file
+ * using the {@link Section#setParent(ConfigFileImpl)} method.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Target({METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface ParentProperty {}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.class
new file mode 100755
index 0000000..0cb6bcf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.java
new file mode 100755
index 0000000..11aa004
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Produces.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Annotation used on subclasses of {@link Serializer} to identify the media types that it produces.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Provides a way to define the contents of {@link Serializer#getMediaTypes()} through an annotation.
+ * <p>
+ * 	The {@link Serializer#getMediaTypes()} default implementation gathers the media types by looking
+ * 		for this annotation.
+ * 	It should be noted that this annotation is optional and that the {@link Serializer#getMediaTypes()} method can
+ * 		be overridden by subclasses to return the media types programmatically.
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p>
+ * 	Standard example:
+ * <p class='bcode'>
+ * 	<ja>@Produces</ja>({<js>"application/json"</js>,<js>"text/json"</js>})
+ * 	<jk>public class</jk> JsonSerializer <jk>extends</jk> WriterSerializer {...}
+ * </p>
+ * <p>
+ * 	The media types can also be <code>media-range</code> values per
+ * 		<a href='http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1'>RFC2616/14.1</a>.
+ * 	When meta-characters are used, you should specify the {@link #contentType()} value to
+ * 		indicate the real media type value that can be set on the <code>Content-Type</code> response header.
+ *
+ * <p class='bcode'>
+ * 	<jc>// Produces any text</jc>
+ * 	<ja>@Produces</ja>(value=<js>"text\/*"</js>, contentType=<js>"text/plain"</js>)
+ * 	<jk>public class</jk> AnythingSerializer <jk>extends</jk> WriterSerializer {...}
+ *
+ * 	<jc>// Produces anything</jc>
+ * 	<ja>@Produces</ja>(value=<js>"*\/*"</js>, contentType=<js>"text/plain"</js>)
+ * 	<jk>public class</jk> AnythingSerializer <jk>extends</jk> WriterSerializer {...}
+ * </p>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(TYPE)
+@Retention(RUNTIME)
+@Inherited
+public @interface Produces {
+
+	/**
+	 * The media types that the serializer can handle.
+	 * <p>
+	 * 	Can contain meta-characters per the <code>media-type</code> specification of
+	 * 	<a href='http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1'>RFC2616/14.1</a>
+	 * @return The media types that the parser can handle.
+	 */
+	String[] value() default {};
+
+	/**
+	 * The content type that this serializer produces.
+	 * <p>
+	 * 	Can be used to override the <code>Content-Type</code> response type if the media types
+	 * 		are <code>media-ranges</code> with meta-characters, or the <code>Content-Type</code>
+	 * 		differs from the media type for some reason.
+	 * @return The content type that this serializer produces, or blank if no overriding value exists.
+	 */
+	String contentType() default "";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.class
new file mode 100755
index 0000000..aabecef
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.java
new file mode 100755
index 0000000..b8bb148
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Remoteable.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * \ufffd Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Identifies services whose Java class or methods can be invoked remotely.
+ */
+@Documented
+@Target({TYPE,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface Remoteable {}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.class
new file mode 100755
index 0000000..5dea9ed
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.java
new file mode 100755
index 0000000..4f7a888
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/URI.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+import java.net.*;
+
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Used to identify a class or bean property as a URI.
+ * <p>
+ * 	By default, instances of {@link URL} and {@link URI} are considered URIs during serialization, and are
+ * 		handled differently depending on the serializer (e.g. <code>HtmlSerializer</code> creates a hyperlink,
+ * 		<code>RdfXmlSerializer</code> creates an <code>rdf:resource</code> object, etc...).
+ * <p>
+ * 	This annotation allows you to identify other classes that return URIs via <code>toString()</code> as URI objects.
+ * <p>
+ * 	Relative URIs are automatically prepended with {@link SerializerProperties#SERIALIZER_absolutePathUriBase} and {@link SerializerProperties#SERIALIZER_relativeUriBase}
+ * 		during serialization just like relative <code>URIs</code>.
+ * <p>
+ * 	This annotation can be applied to classes, interfaces, or bean property methods for fields.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ *
+ * 	<jc>// Applied to a class whose toString() method returns a URI.</jc>
+ * 	<ja>@URI</ja>
+ * 	<jk>public class</jk> MyURI {
+ * 		<ja>@Override</ja>
+ * 		<jk>public</jk> String toString() {
+ * 			<jk>return</jk> <js>"http://localhost:9080/foo/bar"</js>;
+ * 		}
+ * 	}
+ *
+ * 	<jc>// Applied to bean properties</jc>
+ * 	<jk>public class</jk> MyBean {
+ *
+ * 		<ja>@URI</ja>
+ * 		<jk>public</jk> String <jf>beanUri</jf>;
+ *
+ * 		<ja>@URI</ja>
+ * 		<jk>public</jk> String getParentUri() {
+ * 			...
+ * 		}
+ * 	}
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({TYPE,FIELD,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface URI {}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/package.html
new file mode 100755
index 0000000..e876381
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>General bean annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.class
new file mode 100755
index 0000000..d9caecd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.java
new file mode 100755
index 0000000..f7c3e30
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/CsvSerializer.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.csv;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * TODO - Work in progress.  CSV serializer.
+ */
+@Produces("text/csv")
+@SuppressWarnings({"unchecked","rawtypes"})
+public final class CsvSerializer extends WriterSerializer {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		BeanContext bc = ctx.getBeanContext();
+		ClassMeta cm = bc.getClassMetaForObject(o);
+		Collection l = null;
+		if (cm.isArray()) {
+			l = Arrays.asList((Object[])o);
+		} else
+			l = (Collection)o;
+		if (l.size() > 0) {
+			ClassMeta entryType = bc.getClassMetaForObject(l.iterator().next());
+			if (entryType.isBean()) {
+				BeanMeta<?> bm = entryType.getBeanMeta();
+				int i = 0;
+				for (BeanPropertyMeta pm : bm.getPropertyMetas()) {
+					if (i++ > 0)
+						out.append(",");
+					append(out, pm.getName());
+				}
+				out.append("\n");
+				for (Object o2 : l) {
+					i = 0;
+					BeanMap bean = bc.forBean(o2);
+					for (BeanPropertyMeta pm : bm.getPropertyMetas()) {
+						if (i++ > 0)
+							out.append(",");
+						append(out, pm.get(bean));
+					}
+					out.append("\n");
+				}
+			}
+
+		}
+	}
+
+	private void append(Writer w, Object o) throws IOException {
+		if (o == null)
+			w.append("null");
+		else {
+			String s = o.toString();
+			boolean mustQuote = false;
+			for (int i = 0; i < s.length() && ! mustQuote; i++) {
+				char c = s.charAt(i);
+				if (Character.isWhitespace(c) || c == ',')
+					mustQuote = true;
+			}
+			if (mustQuote)
+				w.append('"').append(s).append('"');
+			else
+				w.append(s);
+		}
+	}
+
+	@Override /* Serializer */
+	public CsvSerializer clone() {
+		try {
+			return (CsvSerializer)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/package.html
new file mode 100755
index 0000000..9089ea5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/csv/package.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>CSV serialization and parsing support</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+This code is currently work-in-progress.
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/doc-files/AddressBook.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/doc-files/AddressBook.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/doc-files/AddressBook.html
new file mode 100755
index 0000000..2f83bd7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/doc-files/AddressBook.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">@IMPORT url("../../../../../../javadoc.css");</style>
+</head>
+<body style='margin:0 20'>
+	<p></p>
+	<!-- ======================================================================================================== -->
+	<a id="AddressBookSampleSource"></a><h2 class='topic'>AddressBook sample source</h2>
+	<p>
+		Sample code use in various examples throughout the Javadocs.  Represents a simple POJO model consisting
+		of a collection (<code>LinkedList</code>), beans (<code>Address</code>, <code>Person</code>), and a type 4a filtered type (<code>Calendar</code>).
+	</p>
+	<p>
+		Public fields are used for bean properties in-leu of getters and setters to reduce the size of the example.  
+		Bean properties defined using getters and setters would work identically.
+	</p>
+	<a id="AddressBook"></a>
+	<h6 class='figure'>AddressBook.java</h6>
+	<p class='bcode'>
+	<jc>// A collection of people</jc>
+	<jk>public class</jk> AddressBook <jk>extends</jk> LinkedList&lt;Person&gt; {
+		
+		<jc>// Extra method for adding a person to this address book.
+		// Used in PojoIntrospector usage examples.</jc>
+		<jk>public void</jk> addPerson(String name, <jk>String</jk> birthDate, List&lt;Address&gt; addresses) {
+			add(<jk>new</jk> Person(name, birthdate, addresses));
+		}  
+	}
+	</p>
+	<a id="Address"></a>
+	<h6 class='figure'>Address.java</h6>
+	<p class='bcode'>
+	<jk>public class</jk> Address {
+
+		<jc>// Bean properties</jc>
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+		
+		<jc>// Bean constructor</jc>
+		<jk>public</jk> Address() {}
+		
+		<jc>// Other constructor</jc>
+		<jk>public</jk> Address(String street, String city, String state, <jk>int</jk> zip, <jk>boolean</jk> isCurrent) {
+			<jk>this</jk>.<jf>street</jf> = street;
+			<jk>this</jk>.<jf>city</jf> = city;
+			<jk>this</jk>.<jf>state</jf> = state;
+			<jk>this</jk>.<jf>zip</jf> = zip;
+			<jk>this</jk>.<jf>isCurrent</jf> = isCurrent;
+		}
+	}
+	</p>
+	<a id="Person"></a>
+	<h6 class='figure'>Person.java</h6>
+	<p class='bcode'>
+	<jk>public class</jk> Person {
+
+		<jc>// Bean properties</jc>
+		<jk>public</jk> String <jf>name</jf>;
+		<jk>public int</jk> <jf>age</jf>;
+		<jk>public</jk> Calendar <jf>birthDate</jf>;
+
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+	
+		<jc>// Bean constructor</jc>
+		<jk>public</jk> Person() {}
+	
+		<jc>// Other constructor</jc>
+		<jk>public</jk> Person(String name, String birthDate, Address...addresses) {
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>birthDate</jf> = <jsm>getBirthDate</jsm>(birthDate);
+			<jk>this</jk>.<jf>age</jf> = <jsm>calcAge</jsm>(birthDate);
+			<jk>this</jk>.<jf>addresses</jf>.addAll(Arrays.<jsm>asList</jsm>(addresses));
+		}
+	
+		<jc>// Other method</jc>
+		<jc>// Calculates a persons age based on the birthdate</jc>
+		<jk>public static int</jk> calcAge(String birthDate) {
+			<jk>return new</jk> GregorianCalendar().get(Calendar.<jsf>YEAR</jsf>) - getBirthDate(birthDate).get(Calendar.<jsf>YEAR</jsf>);
+		}
+	
+		<jc>// Utility method</jc>
+		<jc>// Converts a birthdate string to a Calendar</jc>
+		<jk>private static</jk> Calendar getBirthDate(String birthDate) {
+			<jk>try</jk> {
+				Calendar c = <jk>new</jk> GregorianCalendar();
+				c.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+				<jk>return</jk> c;
+			} <jk>catch</jk> (ParseException e) {
+				<jk>throw new</jk> RuntimeException(e);
+			}
+		}
+	}
+	</p>
+
+</body>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.class
new file mode 100755
index 0000000..ca9f6c5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.java
new file mode 100755
index 0000000..ca0fd1f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/Link.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto;
+
+import java.text.*;
+
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.urlencoding.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Simple bean that implements a hyperlink for the HTML serializer.
+ * <p>
+ * 	The name and url properties correspond to the following parts of a hyperlink in an HTML document...
+ * <p class='bcode'>
+ * 	<xt>&lt;a</xt> <xa>href</xa>=<xs>'href'</xs><xt>&gt;</xt>name<xt>&lt;/a&gt;</xt>
+ * <p>
+ * 	When encountered by the {@link HtmlSerializer} class, this object gets converted to a hyperlink.<br>
+ * 	All other serializers simply convert it to a simple bean.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@HtmlLink(nameProperty = "name", hrefProperty = "href")
+public class Link implements Comparable<Link> {
+	private String name, href;
+
+	/** No-arg constructor. */
+	public Link() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name Corresponds to the text inside of the <xt>&lt;A&gt;</xt> element.
+	 * @param href Corresponds to the value of the <xa>href</xa> attribute of the <xt>&lt;A&gt;</xt> element.
+	 * @param hrefArgs Optional arguments for {@link MessageFormat} style arguments in the href.
+	 */
+	public Link(String name, String href, Object...hrefArgs) {
+		setName(name);
+		setHref(href, hrefArgs);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>name</property>.
+	 * Corresponds to the text inside of the <xt>&lt;A&gt;</xt> element.
+	 *
+	 * @return The value of the <property>name</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Bean property setter:  <property>name</property>.
+	 *
+	 * @param name The new value for the <property>name</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Link setName(String name) {
+		this.name = name;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>href</property>.
+	 * Corresponds to the value of the <xa>href</xa> attribute of the <xt>&lt;A&gt;</xt> element.
+	 *
+	 * @return The value of the <property>href</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public String getHref() {
+		return href;
+	}
+
+	/**
+	 * Bean property setter:  <property>href</property>.
+	 *
+	 * @param href The new value for the <property>href</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Link setHref(String href) {
+		setHref(href, new Object[0]);
+		return this;
+	}
+
+	/**
+	 * Bean property setter:  <property>href</property>.
+	 * Same as {@link #setHref(String)} except allows for {@link MessageFormat} style arguments.
+	 *
+	 * @param href The new href.
+	 * @param args Optional message format arguments.
+	 * @return This object (for method chaining).
+	 */
+	public Link setHref(String href, Object...args) {
+		for (int i = 0; i < args.length; i++)
+			args[i] = UrlEncodingSerializer.DEFAULT.serializeUrlPart(args[i]);
+		this.href = (args.length > 0 ? MessageFormat.format(href, args) : href);
+		return this;
+	}
+
+	/**
+	 * Returns the name so that the {@link PojoQuery} class can search against it.
+	 */
+	@Override /* Object */
+	public String toString() {
+		return name;
+	}
+
+	@Override /* Comparable */
+	public int compareTo(Link o) {
+		return name.compareTo(o.name);
+	}
+
+	@Override /* Object */
+	public boolean equals(Object o) {
+		if (! (o instanceof Link))
+			return false;
+		return (compareTo((Link)o) == 0);
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return super.hashCode();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.class
new file mode 100755
index 0000000..d35c250
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.java
new file mode 100755
index 0000000..e381bc8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/ResultSetList.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto;
+
+import java.sql.*;
+import java.util.*;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Transforms an SQL {@link ResultSet ResultSet} into a list of maps.
+ * <p>
+ * 	Loads the entire result set into an in-memory data structure, and then closes the result set object.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ResultSetList extends LinkedList<Map<String,Object>> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rs The result set to load into this DTO.
+	 * @param pos The start position (zero-indexed).
+	 * @param limit The maximum number of rows to retrieve.
+	 * @param includeRowNums Make the first column be the row number.
+	 * @throws SQLException Database error.
+	 */
+	public ResultSetList(ResultSet rs, int pos, int limit, boolean includeRowNums) throws SQLException {
+		try {
+			int rowNum = pos;
+
+			// Get the column names.
+			ResultSetMetaData rsmd = rs.getMetaData();
+			int offset = (includeRowNums ? 1 : 0);
+			int cc = rsmd.getColumnCount();
+			String[] columns = new String[cc + offset];
+			if (includeRowNums)
+				columns[0] = "ROW";
+			int[] colTypes = new int[cc];
+
+			for (int i = 0; i < cc; i++) {
+				columns[i+offset] = rsmd.getColumnName(i+1);
+				colTypes[i] = rsmd.getColumnType(i+1);
+			}
+
+			while (--pos > 0 && rs.next()) {}
+
+			// Get the rows.
+			while (limit-- > 0 && rs.next()) {
+				Object[] row = new Object[cc + offset];
+				if (includeRowNums)
+					row[0] = rowNum++;
+				for (int i = 0; i < cc; i++) {
+					Object o = readEntry(rs, i+1, colTypes[i]);
+					row[i+offset] = o;
+				}
+				add(new SimpleMap(columns, row));
+			}
+		} finally {
+			try {
+				rs.close();
+			} catch (Exception e) {}
+		}
+	}
+
+	/**
+	 * Reads the specified column from the current row in the result set.
+	 * Subclasses can override this method to handle specific data types in special ways.
+	 *
+	 * @param rs The result set to read from.
+	 * @param col The column number (indexed by 1).
+	 * @param dataType The {@link Types type} of the entry.
+	 * @return The entry as an Object.
+	 */
+	protected Object readEntry(ResultSet rs, int col, int dataType) {
+		try {
+			switch (dataType) {
+				case Types.BLOB:
+					Blob b = rs.getBlob(col);
+					return "blob["+b.length()+"]";
+				case Types.CLOB:
+					Clob c = rs.getClob(col);
+					return "clob["+c.length()+"]";
+				case Types.LONGVARBINARY:
+					return "longvarbinary["+IOUtils.count(rs.getBinaryStream(col))+"]";
+				case Types.LONGVARCHAR:
+					return "longvarchar["+IOUtils.count(rs.getAsciiStream(col))+"]";
+				case Types.LONGNVARCHAR:
+					return "longnvarchar["+IOUtils.count(rs.getCharacterStream(col))+"]";
+				case Types.TIMESTAMP:
+					return rs.getTimestamp(col);  // Oracle returns com.oracle.TIMESTAMP objects from getObject() which isn't a Timestamp.
+				default:
+					return rs.getObject(col);
+			}
+		} catch (Exception e) {
+			return e.getLocalizedMessage();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.class
new file mode 100755
index 0000000..2129715
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.java
new file mode 100755
index 0000000..c384b4e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Category.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomCategory</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomCategory =
+ * 		element atom:category {
+ * 			atomCommonAttributes,
+ * 			attribute term { text },
+ * 			attribute scheme { atomUri }?,
+ * 			attribute label { text }?,
+ * 			undefinedContent
+ * 		}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="category")
+public class Category extends Common {
+
+	private String term;
+	private URI scheme;
+	private String label;
+
+	/**
+	 * Normal constructor.
+	 * @param term The category term.
+	 */
+	public Category(String term) {
+		this.term = term;
+	}
+
+	/** Bean constructor. */
+	public Category() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * @return The category term.
+	 */
+	@Xml(format=ATTR)
+	public String getTerm() {
+		return term;
+	}
+
+	/**
+	 * Sets the category term.
+	 *
+	 * @param term The category term.
+	 * @return This object (for method chaining).
+	 */
+	public Category setTerm(String term) {
+		this.term = term;
+		return this;
+	}
+
+	/**
+	 * Returns the category scheme.
+	 *
+	 * @return The category scheme.
+	 */
+	@Xml(format=ATTR)
+	public URI getScheme() {
+		return scheme;
+	}
+
+	/**
+	 * Sets the category scheme.
+	 *
+	 * @param scheme The category scheme.
+	 * @return This object (for method chaining).
+	 */
+	public Category setScheme(URI scheme) {
+		this.scheme = scheme;
+		return this;
+	}
+
+	/**
+	 * Returns the category label.
+	 *
+	 * @return The category label.
+	 */
+	@Xml(format=ATTR)
+	public String getLabel() {
+		return label;
+	}
+
+	/**
+	 * Sets the category label.
+	 *
+	 * @param label The category label.
+	 * @return This object (for method chaining).
+	 */
+	public Category setLabel(String label) {
+		this.label = label;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Category setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Category setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.class
new file mode 100755
index 0000000..4d02fe9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.java
new file mode 100755
index 0000000..a1b19f9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Common.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomCommonAttributes</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomCommonAttributes =
+ * 		attribute xml:base { atomUri }?,
+ * 		attribute xml:lang { atomLanguageTag }?,
+ * 		undefinedAttribute*
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class Common {
+
+	private URI base;
+	private String lang;
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the uri base of this object.
+	 *
+	 * @return The URI base of this object.
+	 */
+	@Xml(prefix="xml", format=ATTR)
+	public URI getBase() {
+		return base;
+	}
+
+	/**
+	 * Sets the URI base of this object.
+	 *
+	 * @param base The URI base of this object.
+	 * @return This object (for method chaining).
+	 */
+	public Common setBase(URI base) {
+		this.base = base;
+		return this;
+	}
+
+	/**
+	 * Returns the language of this object.
+	 *
+	 * @return The language of this object.
+	 */
+	@Xml(prefix="xml", format=ATTR)
+	public String getLang() {
+		return lang;
+	}
+
+	/**
+	 * Sets the language of this object.
+	 *
+	 * @param lang The language of this object.
+	 * @return This object (for method chaining).
+	 */
+	public Common setLang(String lang) {
+		this.lang = lang;
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.class
new file mode 100755
index 0000000..8b8cf45
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.java
new file mode 100755
index 0000000..510cbee
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/CommonEntry.java
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filters.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Parent class of {@link Entry}, {@link Feed}, and {@link Source}
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("hiding")
+public class CommonEntry extends Common {
+
+	private List<Person> authors;
+	private List<Category> categories;
+	private List<Person> contributors;
+	private Id id;
+	private List<Link> links;
+	private Text rights;
+	private Text title;
+	private Calendar updated;
+
+
+	/**
+	 * Normal constructor.
+	 * @param id The ID of this object.
+	 * @param title The title of this object.
+	 * @param updated The updated timestamp of this object.
+	 */
+	public CommonEntry(Id id, Text title, Calendar updated) {
+		this.id = id;
+		this.title = title;
+		this.updated = updated;
+	}
+
+	/** Bean constructor. */
+	public CommonEntry() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the list of authors for this object.
+	 *
+	 * @return The list of authors for this object.
+	 */
+	@Xml(format=COLLAPSED, childName="author")
+	public List<Person> getAuthors() {
+		return authors;
+	}
+
+	/**
+	 * Sets the list of authors for this object.
+	 *
+	 * @param authors The list of authors for this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setAuthors(List<Person> authors) {
+		this.authors = authors;
+		return this;
+	}
+
+	/**
+	 * Adds one or more authors to the list of authors of this object.
+	 *
+	 * @param authors The author to add to the list.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry addAuthors(Person...authors) {
+		if (this.authors == null)
+			this.authors = new LinkedList<Person>();
+		this.authors.addAll(Arrays.asList(authors));
+		return this;
+	}
+
+	/**
+	 * Returns the list of categories of this object.
+	 *
+	 * @return The list of categories of this object.
+	 */
+	@Xml(format=COLLAPSED, childName="category")
+	public List<Category> getCatetories() {
+		return categories;
+	}
+
+	/**
+	 * Sets the list of categories of this object.
+	 *
+	 * @param categories The list of categories of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setCategories(List<Category> categories) {
+		this.categories = categories;
+		return this;
+	}
+
+	/**
+	 * Adds one or more categories to the list of categories of this object.
+	 *
+	 * @param categories The categories to add to the list.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry addCategories(Category...categories) {
+		if (this.categories == null)
+			this.categories = new LinkedList<Category>();
+		this.categories.addAll(Arrays.asList(categories));
+		return this;
+	}
+
+	/**
+	 * Returns the list of contributors of this object.
+	 *
+	 * @return The list of contributors of this object.
+	 */
+	@Xml(format=COLLAPSED, childName="contributor")
+	public List<Person> getContributors() {
+		return contributors;
+	}
+
+	/**
+	 * Sets the list of contributors of this object.
+	 *
+	 * @param contributors The list of contributors of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setContributors(List<Person> contributors) {
+		this.contributors = contributors;
+		return this;
+	}
+
+	/**
+	 * Adds one or more contributors to the list of contributors of this object.
+	 *
+	 * @param contributors The contributor to add to the list.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry addContributors(Person...contributors) {
+		if (this.contributors == null)
+			this.contributors = new LinkedList<Person>();
+		this.contributors.addAll(Arrays.asList(contributors));
+		return this;
+	}
+
+	/**
+	 * Returns the ID of this object.
+	 *
+	 * @return The ID of this object.
+	 */
+	public Id getId() {
+		return id;
+	}
+
+	/**
+	 * Sets the ID of this object.
+	 *
+	 * @param id The ID of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setId(Id id) {
+		this.id = id;
+		return this;
+	}
+
+	/**
+	 * Returns the list of links of this object.
+	 *
+	 * @return The list of links of this object.
+	 */
+	@Xml(format=COLLAPSED)
+	public List<Link> getLinks() {
+		return links;
+	}
+
+	/**
+	 * Sets the list of links of this object.
+	 *
+	 * @param links The list of links of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setLinks(List<Link> links) {
+		this.links = links;
+		return this;
+	}
+
+	/**
+	 * Adds one or more links to the list of links of this object.
+	 *
+	 * @param links The links to add to the list.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry addLinks(Link...links) {
+		if (this.links == null)
+			this.links = new LinkedList<Link>();
+		this.links.addAll(Arrays.asList(links));
+		return this;
+	}
+
+	/**
+	 * Returns the rights statement of this object.
+	 *
+	 * @return The rights statement of this object.
+	 */
+	public Text getRights() {
+		return rights;
+	}
+
+	/**
+	 * Sets the rights statement of this object.
+	 *
+	 * @param rights The rights statement of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setRights(Text rights) {
+		this.rights = rights;
+		return this;
+	}
+
+	/**
+	 * Returns the title of this object.
+	 *
+	 * @return The title of this object.
+	 */
+	public Text getTitle() {
+		return title;
+	}
+
+	/**
+	 * Sets the title of this object.
+	 *
+	 * @param title The title of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setTitle(Text title) {
+		this.title = title;
+		return this;
+	}
+
+	/**
+	 * Returns the update timestamp of this object.
+	 *
+	 * @return The update timestamp of this object.
+	 */
+	@BeanProperty(filter=CalendarFilter.ISO8601DT.class)
+	public Calendar getUpdated() {
+		return updated;
+	}
+
+	/**
+	 * Sets the update timestamp of this object.
+	 *
+	 * @param updated The update timestamp of this object.
+	 * @return This object (for method chaining).
+	 */
+	public CommonEntry setUpdated(Calendar updated) {
+		this.updated = updated;
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.class
new file mode 100755
index 0000000..8d5ce17
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.java
new file mode 100755
index 0000000..e1e4cca
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Content.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomContent</code> construct in the RFC4287 specification.
+ * <p>
+ *
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomContent = atomInlineTextContent
+ * 		| atomInlineXHTMLContent
+ * 		| atomInlineOtherContent
+ * 		| atomOutOfLineContent
+ *
+ * 	atomInlineTextContent =
+ * 		element atom:content {
+ * 			atomCommonAttributes,
+ * 			attribute type { "text" | "html" }?,
+ * 			(text)*
+ * 		}
+ *
+ * 	atomInlineXHTMLContent =
+ * 		element atom:content {
+ * 			atomCommonAttributes,
+ * 			attribute type { "xhtml" },
+ * 			xhtmlDiv
+ * 		}
+ *
+ * 	atomInlineOtherContent =
+ * 		element atom:content {
+ * 			atomCommonAttributes,
+ * 			attribute type { atomMediaType }?,
+ * 			(text|anyElement)*
+ * 	}
+ *
+ * 	atomOutOfLineContent =
+ * 		element atom:content {
+ * 			atomCommonAttributes,
+ * 			attribute type { atomMediaType }?,
+ * 			attribute src { atomUri },
+ * 			empty
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class Content extends Text {
+
+	private URI src;
+
+
+	/**
+	 * Normal content.
+	 *
+	 * @param type The content type of this content.
+	 * @param content The content of this content.
+	 */
+	public Content(String type, String content) {
+		super(type, content);
+	}
+
+	/**
+	 * Normal content.
+	 *
+	 * @param content The content of this content.
+	 */
+	public Content(String content) {
+		super(content);
+	}
+
+	/** Bean constructor. */
+	public Content() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the source URI.
+	 *
+	 * @return the source URI.
+	 */
+	@Xml(format=ATTR)
+	public URI getSrc() {
+		return src;
+	}
+
+	/**
+	 * Sets the source URI.
+	 *
+	 * @param src The source URI.
+	 * @return This object (for method chaining).
+	 */
+	public Content setSrc(URI src) {
+		this.src = src;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Text */
+	public Content setText(String text) {
+		super.setText(text);
+		return this;
+	}
+
+	@Override /* Text */
+	public Content setType(String type) {
+		super.setType(type);
+		return this;
+	}
+
+	@Override /* Common */
+	public Content setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Content setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.class
new file mode 100755
index 0000000..e9a66fe
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.java
new file mode 100755
index 0000000..1a1cfcb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Entry.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import java.net.URI;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filters.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomEntry</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomEntry =
+ * 		element atom:entry {
+ * 			atomCommonAttributes,
+ * 			(atomAuthor*
+ * 			& atomCategory*
+ * 			& atomContent?
+ * 			& atomContributor*
+ * 			& atomId
+ * 			& atomLink*
+ * 			& atomPublished?
+ * 			& atomRights?
+ * 			& atomSource?
+ * 			& atomSummary?
+ * 			& atomTitle
+ * 			& atomUpdated
+ * 			& extensionElement*)
+ * 		}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="entry")
+public class Entry extends CommonEntry {
+
+	private Content content;
+	private Calendar published;
+	private Source source;
+	private Text summary;
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param id The ID of this entry.
+	 * @param title The title of this entry.
+	 * @param updated The updated timestamp of this entry.
+	 */
+	public Entry(Id id, Text title, Calendar updated) {
+		super(id, title, updated);
+	}
+
+	/** Bean constructor. */
+	public Entry() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the content of this entry.
+	 *
+	 * @return The content of this entry.
+	 */
+	public Content getContent() {
+		return content;
+	}
+
+	/**
+	 * Sets the content of this entry.
+	 *
+	 * @param content The content of this entry.
+	 * @return This object (for method chaining).
+	 */
+	public Entry setContent(Content content) {
+		this.content = content;
+		return this;
+	}
+
+	/**
+	 * Returns the publish timestamp of this entry.
+	 *
+	 * @return The publish timestamp of this entry.
+	 */
+ 	@BeanProperty(filter=CalendarFilter.ISO8601DT.class)
+	public Calendar getPublished() {
+ 		return published;
+ 	}
+
+	/**
+	 * Sets the publish timestamp of this entry.
+	 *
+	 * @param published The publish timestamp of this entry.
+	 * @return This object (for method chaining).
+	 */
+ 	public Entry setPublished(Calendar published) {
+ 		this.published = published;
+ 		return this;
+ 	}
+
+	/**
+	 * Returns the source of this entry.
+	 *
+	 * @return The source of this entry.
+	 */
+	public Source getSource() {
+		return source;
+	}
+
+	/**
+	 * Sets the source of this entry.
+	 *
+	 * @param source The source of this entry.
+	 * @return This object (for method chaining).
+	 */
+	public Entry setSource(Source source) {
+		this.source = source;
+		return this;
+	}
+
+	/**
+	 * Returns the summary of this entry.
+	 *
+	 * @return The summary of this entry.
+	 */
+	public Text getSummary() {
+		return summary;
+	}
+
+	/**
+	 * Sets the summary of this entry.
+	 *
+	 * @param summary The summary of this entry.
+	 * @return This object (for method chaining).
+	 */
+	public Entry setSummary(Text summary) {
+		this.summary = summary;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* CommonEntry */
+	public Entry setAuthors(List<Person> authors) {
+		super.setAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry addAuthors(Person...authors) {
+		super.addAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setCategories(List<Category> categories) {
+		super.setCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry addCategories(Category...categories) {
+		super.addCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setContributors(List<Person> contributors) {
+		super.setContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry addContributors(Person...contributors) {
+		super.addContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setId(Id id) {
+		super.setId(id);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setLinks(List<Link> links) {
+		super.setLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry addLinks(Link...links) {
+		super.addLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setRights(Text rights) {
+		super.setRights(rights);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setTitle(Text title) {
+		super.setTitle(title);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Entry setUpdated(Calendar updated) {
+		super.setUpdated(updated);
+		return this;
+	}
+
+	@Override /* Common */
+	public Entry setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Entry setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.class
new file mode 100755
index 0000000..9484bd7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.class differ


[02/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.java
new file mode 100755
index 0000000..0c44744
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerProperties.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Configurable properties on the {@link XmlSerializer} class.
+ * <p>
+ * 	Use the {@link XmlSerializer#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link XmlSerializer}.
+ * <ul>
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class XmlSerializerProperties implements Cloneable {
+
+	/**
+	 * Add JSON type attributes to output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <js>true</jk>, {@code type} attributes will be added to elements in the XML for number/boolean/null nodes.
+	 */
+	public static final String XML_addJsonTypeAttrs = "XmlSerializer.addJsonTypeAttrs";
+
+	/**
+	 * Add JSON type attributes for strings to output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, {@code type} attributes will be added to elements in the XML for string nodes.
+	 * <p>
+	 * By default, these attributes are not added, and the parser will assume that the content type
+	 * of the node is string by default.
+	 * <p>
+	 * This feature is disabled if {@link #XML_addJsonTypeAttrs} is disabled.
+	 */
+	public static final String XML_addJsonStringTypeAttrs = "XmlSerializer.addJsonStringTypeAttrs";
+
+	/**
+	 * Enable support for XML namespaces ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If not enabled, XML output will not contain any namespaces regardless of any other settings.
+	 */
+	public static final String XML_enableNamespaces = "XmlSerializer.enableNamespaces";
+
+	/**
+	 * Auto-detect namespace usage ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * Detect namespace usage before serialization.
+	 * <p>
+	 * Used in conjunction with {@link #XML_addNamespaceUrisToRoot} to reduce
+	 * the list of namespace URLs appended to the root element to only those
+	 * that will be used in the resulting document.
+	 * <p>
+	 * If enabled, then the data structure will first be crawled looking for
+	 * namespaces that will be encountered before the root element is
+	 * serialized.
+	 * <p>
+	 * This setting is ignored if {@link #XML_enableNamespaces} is not enabled.
+	 * <p>
+	 * <b>IMPORTANT NOTE:</b>
+	 * Auto-detection of namespaces can be costly performance-wise.
+	 * In high-performance environments, it's recommended that namespace detection be
+	 * 	disabled, and that namespaces be manually defined through the {@link #XML_namespaces} property.
+	 */
+	public static final String XML_autoDetectNamespaces = "XmlSerializer.autoDetectNamespaces";
+
+	/**
+	 * Add namespace URLs to the root element ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * Use this setting to add {@code xmlns:x} attributes to the root
+	 * element for the default and all mapped namespaces.
+	 * <p>
+	 * This setting is ignored if {@link #XML_enableNamespaces} is not enabled.
+	 */
+	public static final String XML_addNamespaceUrisToRoot = "XmlSerializer.addNamespaceUrisToRoot";
+
+	/**
+	 * Default namespace URI ({@link String}, default=<jk>null</jk>).
+	 * <p>
+	 * Specifies the default namespace URI for this document.
+	 */
+	public static final String XML_defaultNamespaceUri = "XmlSerializer.defaultNamespaceUri";
+
+	/**
+	 * XMLSchema namespace ({@link Namespace}, default=<code>{name:<js>'xs'</js>,uri:<js>'http://www.w3.org/2001/XMLSchema'</js>}</code>).
+	 * <p>
+	 * Specifies the namespace for the <code>XMLSchema</code> namespace, used by the schema generated
+	 * by the {@link XmlSchemaSerializer} class.
+	 */
+	public static final String XML_xsNamespace = "XmlSerializer.xsNamespace";
+
+	/**
+	 * XMLSchema-Instance namespace ({@link Namespace}, default=<code>{name:<js>'xsi'</js>,uri:<js>'http://www.w3.org/2001/XMLSchema-instance'</js>}</code>).
+	 * <p>
+	 * Specifies the namespace of the <code>XMLSchema-instance</code> namespace used for<code>nil=<jk>true</jk></code> attributes.
+	 */
+	public static final String XML_xsiNamespace = "XmlSerializer.xsiNamespace";
+
+	/**
+	 * Default namespaces (<code>Set&lt;Namespace&gt;</code>, default=empty set).
+	 * <p>
+	 * The default list of namespaces associated with this serializer.
+	 */
+	public static final String XML_namespaces = "XmlSerializer.namespaces";
+
+	boolean
+		addJsonTypeAttrs = false,
+		addJsonStringTypeAttrs = false,
+		autoDetectNamespaces = true,
+		enableNamespaces = true,
+		addNamespaceUrlsToRoot = true;
+
+	String defaultNamespace = "{juno:'http://www.ibm.com/2013/Juno'}";
+
+	Namespace
+		xsiNamespace = NamespaceFactory.get("xsi", "http://www.w3.org/2001/XMLSchema-instance"),
+		xsNamespace = NamespaceFactory.get("xs", "http://www.w3.org/2001/XMLSchema");
+
+	Namespace[] namespaces = new Namespace[0];
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 * @throws LockedException If the bean context is locked.
+	 */
+	public boolean setProperty(String property, Object value) throws LockedException {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(XML_addJsonTypeAttrs))
+			addJsonTypeAttrs = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_addJsonStringTypeAttrs))
+			addJsonStringTypeAttrs = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_enableNamespaces))
+			enableNamespaces = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_autoDetectNamespaces))
+			autoDetectNamespaces = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_addNamespaceUrisToRoot))
+			addNamespaceUrlsToRoot = bc.convertToType(value, Boolean.class);
+		else if (property.equals(XML_defaultNamespaceUri))
+			defaultNamespace = (String)value;
+		else if (property.equals(XML_xsiNamespace))
+			xsiNamespace = NamespaceFactory.parseNamespace(value);
+		else if (property.equals(XML_xsNamespace))
+			xsNamespace = NamespaceFactory.parseNamespace(value);
+		else if (property.equals(XML_namespaces))
+			namespaces = NamespaceFactory.parseNamespaces(value);
+		else
+			return false;
+		return true;
+	}
+
+	@Override /* Cloneable */
+	public XmlSerializerProperties clone() {
+		try {
+			return (XmlSerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.class
new file mode 100755
index 0000000..fd6d0de
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.java
new file mode 100755
index 0000000..ed0778b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlSerializerWriter.java
@@ -0,0 +1,662 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.io.*;
+
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Specialized writer for serializing XML.
+ * <p>
+ * 	<b>Note:  This class is not intended for external use.</b>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class XmlSerializerWriter extends SerializerWriter {
+
+	private String defaultNsPrefix;
+	private boolean enableNs;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param out The wrapped writer.
+	 * @param useIndentation If <jk>true</jk> XML elements will be indented.
+	 * @param quoteChar The quote character to use for attributes.  Should be <js>'\''</js> or <js>'"'</js>.
+	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
+	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
+	 * @param enableNs Flag to indicate if XML namespaces are enabled.
+	 * @param defaultNamespace The default namespace if XML namespaces are enabled.
+	 */
+	public XmlSerializerWriter(Writer out, boolean useIndentation, char quoteChar, String relativeUriBase, String absolutePathUriBase, boolean enableNs, Namespace defaultNamespace) {
+		super(out, useIndentation, true, quoteChar, relativeUriBase, absolutePathUriBase);
+		this.enableNs = enableNs;
+		this.defaultNsPrefix = defaultNamespace == null ? null : defaultNamespace.name;
+	}
+
+	/**
+	 * Writes an opening tag to the output:  <code><xt>&lt;ns:name</xt></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(String ns, String name, boolean needsEncoding) throws IOException {
+		append('<');
+		if (enableNs && ns != null && ! (ns.isEmpty() || ns.equals(defaultNsPrefix)))
+			append(ns).append(':');
+		if (needsEncoding)
+			encodeElement(name);
+		else
+			append(name);
+		return this;
+	}
+
+	/**
+	 * Shortcut for <code>oTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(String ns, String name) throws IOException {
+		return oTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>oTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(String name) throws IOException {
+		return oTag(null, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).oTag(ns, name, needsEncoding);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		return i(indent).oTag(ns, name, needsEncoding);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).oTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(int indent, String ns, String name) throws IOException {
+		return i(indent).oTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).oTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oTag(int indent, String name) throws IOException {
+		return i(indent).oTag(null, name, false);
+	}
+
+	/**
+	 * Closes a tag.
+	 * Shortcut for <code>append(<js>'>'</js>);</code>
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	public XmlSerializerWriter cTag() throws IOException {
+		append('>');
+		return this;
+	}
+
+	/**
+	 * Closes an empty tag.
+	 * Shortcut for <code>append(<js>'/'</js>).append(<js>'>'</js>);</code>
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	public XmlSerializerWriter ceTag() throws IOException {
+		append('/').append('>');
+		return this;
+	}
+
+	/**
+	 * Writes a closed tag to the output:  <code><xt>&lt;ns:name/&gt;</xt></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(String ns, String name, boolean needsEncoding) throws IOException {
+		append('<');
+		if (enableNs && ns != null && ! (ns.isEmpty() || ns.equals(defaultNsPrefix)))
+			append(ns).append(':');
+		if (needsEncoding)
+			encodeElement(name);
+		else
+			append(name);
+		return append('/').append('>');
+	}
+
+	/**
+	 * Shortcut for <code>tag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(String ns, String name) throws IOException {
+		return tag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>tag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(String name) throws IOException {
+		return tag(null, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).tag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(int indent, String name) throws IOException {
+		return i(indent).tag(name);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).tag(ns, name, needsEncoding);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		return i(indent).tag(ns, name, needsEncoding);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).tag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter tag(int indent, String ns, String name) throws IOException {
+		return i(indent).tag(ns, name);
+	}
+
+
+	/**
+	 * Writes a start tag to the output:  <code><xt>&lt;ns:name&gt;</xt></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(String ns, String name, boolean needsEncoding) throws IOException {
+		return oTag(ns, name, needsEncoding).append('>');
+	}
+
+	/**
+	 * Shortcut for <code>sTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(String ns, String name) throws IOException {
+		return sTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>sTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(String name) throws IOException {
+		return sTag(null, name);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).sTag(ns, name, needsEncoding);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		return i(indent).sTag(ns, name, needsEncoding);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).sTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(int indent, String ns, String name) throws IOException {
+		return i(indent).sTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).sTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter sTag(int indent, String name) throws IOException {
+		return i(indent).sTag(null, name, false);
+	}
+
+
+	/**
+	 * Writes an end tag to the output:  <code><xt>&lt;/ns:name&gt;</xt></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(String ns, String name, boolean needsEncoding) throws IOException {
+		append('<').append('/');
+		if (enableNs && ns != null && ! (ns.isEmpty() || ns.equals(defaultNsPrefix)))
+			append(ns).append(':');
+		if (needsEncoding)
+			encodeElement(name);
+		else
+			append(name);
+		return append('>');
+	}
+
+	/**
+	 * Shortcut for <code>eTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(String ns, String name) throws IOException {
+		return eTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>eTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(String name) throws IOException {
+		return eTag(null, name);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).eTag(ns, name, needsEncoding);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @param needsEncoding If <jk>true</jk>, element name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		return i(indent).eTag(ns, name, needsEncoding);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).eTag(ns, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(int indent, String ns, String name) throws IOException {
+		return i(indent).eTag(ns, name, false);
+	}
+
+	/**
+	 * Shortcut for <code>i(indent).eTag(<jk>null</jk>, name, <jk>false</jk>);</code>
+	 *
+	 * @param indent The number of prefix tabs to add.
+	 * @param name The element name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter eTag(int indent, String name) throws IOException {
+		return i(indent).eTag(name);
+	}
+
+	/**
+	 * Writes an attribute to the output:  <code><xa>ns:name</xa>=<xs>'value'</xs></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @param value The attribute value.
+	 * @param needsEncoding If <jk>true</jk>, attribute name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attr(String ns, String name, Object value, boolean needsEncoding) throws IOException {
+		oAttr(ns, name).q();
+		if (needsEncoding)
+			encodeAttr(value);
+		else
+			append(value);
+		return q();
+	}
+
+	/**
+	 * Shortcut for <code>attr(<jk>null</jk>, name, value, <jk>false</jk>);</code>
+	 *
+	 * @param name The attribute name.
+	 * @param value The attribute value.
+	 * @param needsEncoding If <jk>true</jk>, attribute name will be encoded.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attr(String name, Object value, boolean needsEncoding) throws IOException {
+		return attr(null, name, value, needsEncoding);
+	}
+
+	/**
+	 * Shortcut for <code>attr(ns, name, value, <jk>false</jk>);</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @param value The attribute value.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attr(String ns, String name, Object value) throws IOException {
+		return oAttr(ns, name).q().append(value).q();
+	}
+
+	/**
+	 * Same as {@link #attr(String, Object, boolean)}, except pass in a {@link Namespace} object for the namespace.
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @param value The attribute value.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attr(Namespace ns, String name, Object value) throws IOException {
+		return oAttr(ns == null ? null : ns.name, name).q().append(value).q();
+	}
+
+	/**
+	 * Shortcut for <code>attr(<jk>null</jk>, name, value, <jk>false</jk>);</code>
+	 *
+	 * @param name The attribute name.
+	 * @param value The attribute value.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attr(String name, Object value) throws IOException {
+		return attr((String)null, name, value);
+	}
+
+
+	/**
+	 * Writes an open-ended attribute to the output:  <code><xa>ns:name</xa>=</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oAttr(String ns, String name) throws IOException {
+		append(' ');
+		if (enableNs && ns != null && ! (ns.isEmpty() || ns.equals(defaultNsPrefix)))
+			append(ns).append(':');
+		append(name).append('=');
+		return this;
+	}
+
+	/**
+	 * Writes an open-ended attribute to the output:  <code><xa>ns:name</xa>=</code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter oAttr(Namespace ns, String name) throws IOException {
+		return oAttr(ns == null ? null : ns.name, name);
+	}
+
+	/**
+	 * Writes an attribute with a URI value to the output:  <code><xa>ns:name</xa>=<xs>'uri-value'</xs></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @param value The attribute value, convertable to a URI via <code>toString()</code>
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attrUri(Namespace ns, String name, Object value) throws IOException {
+		oAttr(ns, name).q().appendUri(value).q();
+		return this;
+	}
+
+	/**
+	 * Writes an attribute with a URI value to the output:  <code><xa>ns:name</xa>=<xs>'uri-value'</xs></code>
+	 *
+	 * @param ns The namespace.  Can be <jk>null</jk>.
+	 * @param name The attribute name.
+	 * @param value The attribute value, convertable to a URI via <code>toString()</code>
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter attrUri(String ns, String name, Object value) throws IOException {
+		oAttr(ns, name).q().appendUri(value).q();
+		return this;
+	}
+
+	/**
+	 * Serializes and encodes the specified object as valid XML text.
+	 *
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter encodeText(Object o) throws IOException {
+		XmlUtils.encodeText(this, o);
+		return this;
+	}
+
+	/**
+	 * Serializes and encodes the specified object as valid XML text.
+	 * <p>
+	 * 	Does NOT encode XML characters (<js>'&lt;'</js>, <js>'&gt;'</js>, and <js>'&amp;'</js>).
+	 * <p>
+	 * 	Use on XML text that you just want to replace invalid XML characters with <js>"_x####_"</js> sequences.
+	 *
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter encodeTextInvalidChars(Object o) throws IOException {
+		XmlUtils.encodeTextInvalidChars(this, o);
+		return this;
+	}
+
+	/**
+	 * Serializes and encodes the specified object as valid XML text.
+	 * <p>
+	 * 	Only encodes XML characters (<js>'&lt;'</js>, <js>'&gt;'</js>, and <js>'&amp;'</js>).
+	 * <p>
+	 * 	Use on XML text where the invalid characters have already been replaced.
+	 *
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter encodeTextXmlChars(Object o) throws IOException {
+		XmlUtils.encodeTextXmlChars(this, o);
+		return this;
+	}
+
+	/**
+	 * Serializes and encodes the specified object as valid XML attribute name.
+	 *
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter encodeAttr(Object o) throws IOException {
+		XmlUtils.encodeAttr(out, o);
+		return this;
+	}
+
+	/**
+	 * Serializes and encodes the specified object as valid XML element name.
+	 *
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public XmlSerializerWriter encodeElement(Object o) throws IOException {
+		XmlUtils.encodeElementName(out, o);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter cr(int depth) throws IOException {
+		super.cr(depth);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter appendln(int indent, String text) throws IOException {
+		super.appendln(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter appendln(String text) throws IOException {
+		super.appendln(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter append(int indent, String text) throws IOException {
+		super.append(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter append(int indent, char c) throws IOException {
+		super.append(indent, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter s() throws IOException {
+		super.s();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter q() throws IOException {
+		super.q();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter i(int indent) throws IOException {
+		super.i(indent);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter nl() throws IOException {
+		super.nl();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter append(Object text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter append(String text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public XmlSerializerWriter append(char c) throws IOException {
+		out.write(c);
+		return this;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return out.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.class
new file mode 100755
index 0000000..ba23d6f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.java
new file mode 100755
index 0000000..0e18f7b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlUtils.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static javax.xml.stream.XMLStreamConstants.*;
+
+import java.io.*;
+import java.util.*;
+
+import javax.xml.namespace.*;
+import javax.xml.stream.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * XML utility methods.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class XmlUtils {
+
+	//--------------------------------------------------------------------------------
+	// Encode URI part
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Encodes invalid XML text characters.
+	 * <p>
+	 * Encodes <js>'&'</js>, <js>'&lt;'</js>, and <js>'&gt;'</js> as XML entities.<br>
+	 * Encodes any other invalid XML text characters to <code>_x####_</code> sequences.
+	 *
+	 * @param o The object being encoded.
+	 * @return The encoded string.
+	 */
+	public static final String encodeText(Object o) {
+
+		if (o == null)
+			return "_x0000_";
+
+		String s = o.toString();
+
+		try {
+			if (needsTextEncoding(s))
+				return encodeTextInner(new StringBuilderWriter(s.length()*2), s).toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e); // Never happens
+		}
+
+		return s;
+	}
+
+	/**
+	 * Same as {@link #encodeText(Object)}, but does not convert <js>'&'</js>, <js>'&lt;'</js>, and <js>'&gt;'</js>
+	 * 	to entities.
+	 *
+	 * @param o The object being encoded.
+	 * @return The encoded string.
+	 */
+	public static final String encodeTextInvalidChars(Object o) {
+
+		if (o == null)
+			return "_x0000_";
+
+		String s = o.toString();
+
+		try {
+			if (needsTextEncoding(s))
+				return encodeTextInvalidCharsInner(new StringBuilderWriter(s.length()*2), s).toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e); // Never happens
+		}
+
+		return s;
+	}
+
+	/**
+	 * Encodes any invalid XML text characters to <code>_x####_</code> sequences and sends the response
+	 * 	to the specified writer.
+	 *
+	 * @param w The writer to send the output to.
+	 * @param o The object being encoded.
+	 * @return The same writer passed in.
+	 * @throws IOException Thrown from the writer.
+	 */
+	public static final Writer encodeText(Writer w, Object o) throws IOException {
+
+		if (o == null)
+			return w.append("_x0000_");
+
+		String s = o.toString();
+
+		if (needsTextEncoding(s))
+			return encodeTextInner(w, s);
+
+		w.append(s);
+
+		return w;
+	}
+
+	/**
+	 * Same as {@link #encodeText(Object)}, but does not convert <js>'&'</js>, <js>'&lt;'</js>, and <js>'&gt;'</js>
+	 * 	to entities.
+	 *
+	 * @param w The writer to write to.
+	 * @param o The object being encoded.
+	 * @return The encoded string.
+	 * @throws IOException
+	 */
+	public static final Writer encodeTextInvalidChars(Writer w, Object o) throws IOException {
+
+		if (o == null)
+			return w.append("_x0000_");
+
+		String s = o.toString();
+
+		if (needsTextEncoding(s))
+			return encodeTextInvalidCharsInner(w, s);
+
+		w.append(s);
+
+		return w;
+	}
+
+	/**
+	 * Same as {@link #encodeText(Object)}, but only converts <js>'&'</js>, <js>'&lt;'</js>, and <js>'&gt;'</js>
+	 * 	to entities.
+	 *
+	 * @param w The writer to write to.
+	 * @param o The object being encoded.
+	 * @return The encoded string.
+	 * @throws IOException
+	 */
+	public static final Writer encodeTextXmlChars(Writer w, Object o) throws IOException {
+		if (o == null)
+			return w;
+
+		String s = o.toString();
+
+		if (needsTextEncoding(s))
+			return encodeTextXmlCharsInner(w, s);
+
+		w.append(s);
+
+		return w;
+
+	}
+
+	private static final Writer encodeTextInner(Writer w, String s) throws IOException {
+		final int len = s.length();
+		for (int i = 0; i < len; i++) {
+			char c = s.charAt(i);
+			if (c == '&')
+				w.append("&amp;");
+			else if (c == '<')
+				w.append("&lt;");
+			else if (c == '>')
+				w.append("&gt;");
+			else if (c == '_' && isEscapeSequence(s,i))
+				appendPaddedHexChar(w, c);
+			else if ((i == 0 || i == len-1) && Character.isWhitespace(c))
+				appendPaddedHexChar(w, c);
+			else if (isValidXmlCharacter(c))
+				w.append(c);
+			else
+				appendPaddedHexChar(w, c);
+		}
+		return w;
+	}
+
+	private static final Writer encodeTextInvalidCharsInner(Writer w, String s) throws IOException {
+		final int len = s.length();
+		for (int i = 0; i < len; i++) {
+			char c = s.charAt(i);
+			if ((i == 0 || i == len-1) && Character.isWhitespace(c))
+				appendPaddedHexChar(w, c);
+			else if (c == '_' && isEscapeSequence(s,i))
+				appendPaddedHexChar(w, c);
+			else if (isValidXmlCharacter(c))
+				w.append(c);
+			else
+				appendPaddedHexChar(w, c);
+		}
+		return w;
+	}
+
+	private static final Writer encodeTextXmlCharsInner(Writer w, String s) throws IOException {
+		final int len = s.length();
+		for (int i = 0; i < len; i++) {
+			char c = s.charAt(i);
+			if (c == '&')
+				w.append("&amp;");
+			else if (c == '<')
+				w.append("&lt;");
+			else if (c == '>')
+				w.append("&gt;");
+			else
+				w.append(c);
+		}
+		return w;
+	}
+
+	private static final boolean needsTextEncoding(String s) {
+		// See if we need to convert the string.
+		// Conversion is somewhat expensive, so make sure we need to do so before hand.
+		final int len = s.length();
+		for (int i = 0; i < len; i++) {
+			char c = s.charAt(i);
+			if ((i == 0 || i == len-1) && Character.isWhitespace(c))
+				return true;
+			if (c == '&' || c == '<' || c == '>' || c == '\n' || ! isValidXmlCharacter(c) || (c == '_' && isEscapeSequence(s,i)))
+				return true;
+		}
+		return false;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Decode XML text
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Translates any _x####_ sequences (introduced by the various encode methods) back into their original characters.
+	 *
+	 * @param s The string being decoded.
+	 * @return The decoded string.
+	 */
+	public static String decode(String s) {
+		if (s == null) return null;
+		if (s.length() == 0)
+			return s;
+		if (s.indexOf('_') == -1)
+			return s;
+
+		StringBuffer sb = new StringBuffer(s.length());
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (c == '_' && isEscapeSequence(s,i)) {
+
+				int x = Integer.parseInt(s.substring(i+2, i+6), 16);
+
+				// If we find _x0000_, then that means a null.
+				if (x == 0)
+					return null;
+
+				sb.append((char)x);
+				i+=6;
+			} else {
+				sb.append(c);
+			}
+		}
+		return sb.toString();
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Encode XML attributes
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Serializes and encodes the specified object as valid XML attribute name.
+	 *
+	 * @param w The writer to send the output to.
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred.
+	 */
+	public static final Writer encodeAttr(Writer w, Object o) throws IOException {
+
+		if (o == null)
+			return w.append("_x0000_");
+
+		String s = o.toString();
+
+		if (needsAttributeEncoding(s))
+			return encodeAttrInner(w, s);
+
+		w.append(s);
+		return w;
+	}
+
+	private static final Writer encodeAttrInner(Writer w, String s) throws IOException {
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (c == '&')
+				w.append("&amp;");
+			else if (c == '<')
+				w.append("&lt;");
+			else if (c == '>')
+				w.append("&gt;");
+			else if (c == '\'')
+				w.append("&apos;");
+			else if (c == '"')
+				w.append("&quot;");
+			else if (c == '_' && isEscapeSequence(s,i))
+				appendPaddedHexChar(w, c);
+			else if (isValidXmlCharacter(c))
+				w.append(c);
+			else
+				appendPaddedHexChar(w, c);
+		}
+		return w;
+	}
+
+	private static boolean needsAttributeEncoding(String s) {
+		// See if we need to convert the string.
+		// Conversion is somewhat expensive, so make sure we need to do so before hand.
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (c == '&' || c == '<' || c == '>' || c == '\n' || c == '\'' || c == '"' || ! isValidXmlCharacter(c))
+				return true;
+		}
+		return false;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Encode XML element names
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Encodes any invalid XML element name characters to <code>_x####_</code> sequences.
+	 *
+	 * @param w The writer to send the output to.
+	 * @param o The object being encoded.
+	 * @return The same writer passed in.
+	 * @throws IOException Throw by the writer.
+	 */
+	public static final Writer encodeElementName(Writer w, Object o) throws IOException {
+
+		if (o == null)
+			return w.append("_x0000_");
+
+		String s = o.toString();
+
+		if (needsElementNameEncoding(s))
+			return encodeElementNameInner(w, s);
+
+		w.append(s);
+		return w;
+	}
+
+	/**
+	 * Encodes any invalid XML element name characters to <code>_x####_</code> sequences.
+	 *
+	 * @param o The object being encoded.
+	 * @return The encoded element name string.
+	 */
+	public static final String encodeElementName(Object o) {
+		if (o == null)
+			return "_x0000_";
+
+		String s = o.toString();
+
+		try {
+			if (needsElementNameEncoding(s))
+				return encodeElementNameInner(new StringBuilderWriter(s.length() * 2), s).toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e); // Never happens
+		}
+
+		return s;
+	}
+
+	private static final Writer encodeElementNameInner(Writer w, String s) throws IOException {
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if ((c >= 'A' && c <= 'Z')
+					|| (c == '_' && ! isEscapeSequence(s,i))
+					|| (c >= 'a' && c <= 'z')
+					|| (i != 0 && (
+							c == '-'
+							|| c == '.'
+							|| (c >= '0' && c <= '9')
+							|| c == '\u00b7'
+							|| (c >= '\u0300' && c <= '\u036f')
+							|| (c >= '\u203f' && c <= '\u2040')
+						))
+					|| (c >= '\u00c0' && c <= '\u00d6')
+					|| (c >= '\u00d8' && c <= '\u00f6')
+					|| (c >= '\u00f8' && c <= '\u02ff')
+					|| (c >= '\u0370' && c <= '\u037d')
+					|| (c >= '\u037f' && c <= '\u1fff')
+					|| (c >= '\u200c' && c <= '\u200d')
+					|| (c >= '\u2070' && c <= '\u218f')
+					|| (c >= '\u2c00' && c <= '\u2fef')
+					|| (c >= '\u3001' && c <= '\ud7ff')
+					|| (c >= '\uf900' && c <= '\ufdcf')
+					|| (c >= '\ufdf0' && c <= '\ufffd')) {
+				w.append(c);
+			}  else {
+				appendPaddedHexChar(w, c);
+			}
+		}
+		return w;
+	}
+
+	private static final boolean needsElementNameEncoding(String s) {
+		// Note that this doesn't need to be perfect, just fast.
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (! (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'))
+				return true;
+			if (i == 0 && (c >= '0' && c <= '9'))
+				return true;
+		}
+		return false;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Utility method for reading XML mixed content from an XML element and returning it as text.
+	 *
+	 * @param r The reader to read from.
+	 * @return The contents read as a string.
+	 * @throws XMLStreamException
+	 * @throws IOException
+	 */
+	public static String readXmlContents(XMLStreamReader r) throws XMLStreamException, IOException {
+		StringWriter sw = new StringWriter();
+		XmlSerializerWriter w = new XmlSerializerWriter(sw, false, '"', null, null, false, null);
+		try {
+			int depth = 0;
+			do {
+				int event = r.next();
+				if (event == START_ELEMENT) {
+					depth++;
+					QName n = r.getName();
+					w.oTag(n.getPrefix(), n.getLocalPart());
+					for (int i = 0; i < r.getNamespaceCount(); i++)
+						w.attr(r.getNamespacePrefix(i), "xmlns", r.getNamespaceURI(i));
+					for (int i = 0; i < r.getAttributeCount(); i++)
+						w.attr(r.getAttributePrefix(i), r.getAttributeLocalName(i), r.getAttributeValue(i));
+					w.append('>');
+				} else if (r.hasText()) {
+					w.encodeTextXmlChars(r.getText());
+				} else if (event == ATTRIBUTE) {
+					// attributes handled above.
+				} else if (event == END_ELEMENT) {
+					QName n = r.getName();
+					if (depth > 0)
+						w.eTag(n.getPrefix(), n.getLocalPart());
+					depth--;
+				}
+				if (depth < 0)
+					return sw.toString();
+			} while (true);
+		} finally {
+			w.close();
+		}
+	}
+
+	// Returns true if the specified character can safely be used in XML text or an attribute.
+	private static final boolean isValidXmlCharacter(char c) {
+		return (c >= 0x20 && c <= 0xD7FF) /*|| c == 0xA || c == 0xD*/ || (c >= 0xE000 && c <= 0xFFFD);
+	}
+
+	// Returns true if the string at the specified position is of the form "_x####_"
+	// where '#' are hexadecimal characters.
+	private static final boolean isEscapeSequence(String s, int i) {
+		return s.length() > i+6
+			&& s.charAt(i) == '_'
+			&& s.charAt(i+1) == 'x'
+			&& isHexCharacter(s.charAt(i+2))
+			&& isHexCharacter(s.charAt(i+3))
+			&& isHexCharacter(s.charAt(i+4))
+			&& isHexCharacter(s.charAt(i+5))
+			&& s.charAt(i+6) == '_';
+	}
+
+	// Returns true if the character is a hexadecimal character
+	private static final boolean isHexCharacter(char c) {
+		return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F');
+	}
+
+	// Converts an integer to a hexadecimal string padded to 4 places.
+	private static final Writer appendPaddedHexChar(Writer out, int num) throws IOException {
+		out.append("_x");
+		char[] n = new char[4];
+		int a = num%16;
+		n[3] = (char)(a > 9 ? 'A'+a-10 : '0'+a);
+		int base = 16;
+		for (int i = 1; i < 4; i++) {
+			a = (num/base)%16;
+			base <<= 4;
+			n[3-i] = (char)(a > 9 ? 'A'+a-10 : '0'+a);
+		}
+		for (int i = 0; i < 4; i++)
+			out.append(n[i]);
+		return out.append('_');
+	}
+
+	/**
+	 * Find the namespace given a list of <ja>@Xml</ja> and <ja>@XmlSchema</ja> annotations.
+	 * The annotations should be a child-to-parent ordering of annotations found on
+	 * 	a class or method.
+	 *
+	 * @param xmls The list of <ja>@Xml</ja> annotations.
+	 * @param schemas The list of <ja>@XmlSchema</ja> annotations.
+	 * @return The namespace, or <jk>null</jk> if it couldn't be found.
+	 */
+	public static Namespace findNamespace(List<Xml> xmls, List<XmlSchema> schemas) {
+
+		for (Xml xml : xmls) {
+			Namespace ns = findNamespace(xml.prefix(), xml.namespace(), xmls, schemas);
+			if (ns != null)
+				return ns;
+		}
+
+		for (XmlSchema schema : schemas) {
+			Namespace ns = findNamespace(schema.prefix(), schema.namespace(), null, schemas);
+			if (ns != null)
+				return ns;
+		}
+
+		return null;
+	}
+
+	private static Namespace findNamespace(String prefix, String ns, List<Xml> xmls, List<XmlSchema> schemas) {
+
+		// If both prefix and namespace specified, use that Namespace mapping.
+		if (! (prefix.isEmpty() || ns.isEmpty()))
+			return NamespaceFactory.get(prefix, ns);
+
+		// If only prefix specified, need to search for namespaceURI.
+		if (! prefix.isEmpty()) {
+			if (xmls != null)
+				for (Xml xml2 : xmls)
+					if (xml2.prefix().equals(prefix) && ! xml2.namespace().isEmpty())
+						return NamespaceFactory.get(prefix, xml2.namespace());
+			for (XmlSchema schema : schemas) {
+				if (schema.prefix().equals(prefix) && ! schema.namespace().isEmpty())
+					return NamespaceFactory.get(prefix, schema.namespace());
+				for (XmlNs xmlNs : schema.xmlNs())
+					if (xmlNs.prefix().equals(prefix))
+						return NamespaceFactory.get(prefix, xmlNs.namespaceURI());
+			}
+			throw new BeanRuntimeException("Found @Xml.prefix annotation with no matching URI.  prefix='"+prefix+"'");
+		}
+
+		// If only namespaceURI specified, need to search for prefix.
+		if (! ns.isEmpty()) {
+			if (xmls != null)
+				for (Xml xml2 : xmls)
+					if (xml2.namespace().equals(ns) && ! xml2.prefix().isEmpty())
+						return NamespaceFactory.get(xml2.prefix(), ns);
+			for (XmlSchema schema : schemas) {
+				if (schema.namespace().equals(ns) && ! schema.prefix().isEmpty())
+					return NamespaceFactory.get(schema.prefix(), ns);
+				for (XmlNs xmlNs : schema.xmlNs())
+					if (xmlNs.namespaceURI().equals(ns))
+						return NamespaceFactory.get(xmlNs.prefix(), ns);
+			}
+		}
+
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.class
new file mode 100755
index 0000000..0b43a7b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.java
new file mode 100755
index 0000000..07aa1ff
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/Xml.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Annotation for specifying various XML options for the XML and RDF/XML serializers.
+ * <p>
+ * 	Can be applied to Java packages, types, fields, and methods.
+ * <p>
+ * 	Can be used for the following:
+ * <ul>
+ * 	<li>Override the element name on the XML representation of a bean or object.
+ * 	<li>Override the child element name on the XML representation of collection or array properties.
+ * 	<li>Specify the XML namespace on a package, class, or method.
+ * 	<li>Override the XML format on a POJO.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({TYPE,FIELD,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface Xml {
+
+	/**
+	 * Sets the name of the XML element in cases where the XML element has no name (e.g. the root element).
+	 * <p>
+	 * 	Applies only to {@link ElementType#TYPE}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<ja>@Xml</ja>(name=<js>"MyBean"</js>)
+	 * 	<jk>public class</jk> MyBean {
+	 * 		<jk>public int</jk> f1 = 123;
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	Without the <ja>@Xml</ja> annotations, serializing this bean as XML would have produced the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;object&gt;</xt>
+	 * 		<xt>&lt;f1&gt;</xt>123<xt>&lt;/f1&gt;</xt>
+	 * 	<xt>&lt;/object&gt;</xt>
+	 * </p>
+	 * <p>
+	 * 	With the annotations, serializing this bean as XML produces the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;MyBean&gt;</xt>
+	 * 		<xt>&lt;f1&gt;</xt>123<xt>&lt;/f1&gt;</xt>
+	 * 	<xt>&lt;/MyBean&gt;</xt>
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String name() default "";
+
+	/**
+	 * Sets the name of the XML child elements for bean properties of type collection and array.
+	 * <p>
+	 * 	Applies only to collection and array bean properties.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyBean {
+	 * 		<ja>@Xml</ja>(childName=<js>"child"</js>}
+	 * 		<jk>public</jk> String[] <jf>children</jf> = {<js>"foo"</js>,<js>"bar"</js>};
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	Without the <ja>@Xml</ja> annotation, serializing this bean as XML would have produced the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;object&gt;</xt>
+	 * 		<xt>&lt;children&gt;</xt>
+	 * 			<xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt>
+	 * 			<xt>&lt;string&gt;</xt>bar<xt>&lt;/string&gt;</xt>
+	 * 		<xt>&lt;/children&gt;</xt>
+	 * 	<xt>&lt;/object&gt;</xt>
+	 * </p>
+	 * <p>
+	 * 	With the annotations, serializing this bean as XML produces the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;object&gt;</xt>
+	 * 		<xt>&lt;children&gt;</xt>
+	 * 			<xt>&lt;child&gt;</xt>foo<xt>&lt;/child&gt;</xt>
+	 * 			<xt>&lt;child&gt;</xt>bar<xt>&lt;/child&gt;</xt>
+	 * 		<xt>&lt;/children&gt;</xt>
+	 * 	<xt>&lt;/object&gt;</xt>
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String childName() default "";
+
+	/**
+	 * Sets the XML prefix of this property or class.
+	 * <ul>
+	 * 	<li>When applied to a {@link ElementType#TYPE}, namespace is applied to all properties in the class, and all
+	 * 		subclasses of the class.
+	 * 	<li>When applied to bean properties on {@link ElementType#METHOD} and {@link ElementType#FIELD}, applies
+	 * 		to the bean property.
+	 * </ul>
+	 * <p>
+	 * 	Must either be matched to a {@link #namespace()} annotation on the same object, parent object, or a {@link XmlNs} with the same name
+	 * 	through the {@link XmlSchema#xmlNs()} annotation on the package.
+	 * </p>
+	 */
+	String prefix() default "";
+
+	/**
+	 * Sets the namespace URI of this property or class.
+	 * <p>
+	 * 	Must be matched with a {@link #prefix()} annotation on this object, a parent object, or a {@link XmlNs} with the same name
+	 * 	through the {@link XmlSchema#xmlNs()} annotation on the package.
+	 */
+	String namespace() default "";
+
+	/**
+	 * The {@link XmlFormat} to use for serializing this object type.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> MyBean {
+	 *
+	 * 		<jc>// Normally, bean properties would be rendered as child elements of the bean element.</jc>
+	 * 		<jc>// Override so that it's rendered as a "f1='123'" attribute on the bean element instead.</jc>
+	 * 		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>}
+	 * 		<jk>public int</jk> f1 = 123;
+	 *
+	 * 		<jc>// Normally, bean URL properties would be rendered as XML attributes on the bean element.</jc>
+	 * 		<jc>// Override so that it's rendered as an &lt;href&gt;http://foo&lt;/href&gt; child element instead.</jc>
+	 * 		<ja>@BeanProperty</ja>(uri=<jk>true</jk>)
+	 * 		<ja>@Xml</ja>(format=XmlFormat.<jsf>ELEMENT</jsf>}
+	 * 		<jk>public</jk> URL <jf>href</jf> = <jk>new</jk> URL(<js>"http://foo"</js>);
+	 *
+	 * 		<jc>// Normally, collection properties would be grouped under a single &lt;children&gt; child element on the bean element.</jc>
+	 * 		<jc>// Override so that entries are directly children of the bean element with each entry having an element name of &lt;child&gt;.</jc>
+	 * 		<ja>@Xml</ja>(format=XmlFormat.<jsf>COLLAPSED</jsf>, childName=<js>"child"</js>}
+	 * 		<jk>public</jk> String[] <jf>children</jf> = <js>"foo"</js>,<js>"bar"</js>};
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	Without the <ja>@Xml</ja> annotations, serializing this bean as XML would have produced the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;object</xt> <xa>href</xa>=<js>'http://foo'</js><xt>&gt;</xt>
+	 * 		<xt>&lt;f1&gt;</xt>123<xt>&lt;/f1&gt;</xt>
+	 * 		<xt>&lt;children&gt;</xt>
+	 * 			<xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt>
+	 * 			<xt>&lt;string&gt;</xt>bar<xt>&lt;/string&gt;</xt>
+	 * 		<xt>&lt;/children&gt;</xt>
+	 * 	<xt>&lt;/object&gt;</xt>
+	 * </p>
+	 * <p>
+	 * 	With the annotations, serializing this bean as XML produces the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<xt>&lt;object</xt> <xa>f1</xa>=<js>'123'</js><xt>&gt;</xt>
+	 * 		<xt>&lt;href&gt;</xt>http://foo<xt>&lt;/href&gt;</xt>
+	 * 		<xt>&lt;child&gt;</xt>foo<xt>&lt;/child&gt;</xt>
+	 * 		<xt>&lt;child&gt;</xt>bar<xt>&lt;/child&gt;</xt>
+	 * 	<xt>&lt;/object&gt;</xt>
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	XmlFormat format() default XmlFormat.NORMAL;
+
+	/**
+	 * Associates a content handler with a bean class or bean property.
+	 * <p>
+	 * 	Refer to {@link XmlContentHandler} for more information.
+	 */
+	Class<? extends XmlContentHandler<?>> contentHandler() default XmlContentHandler.NULL.class;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.class
new file mode 100755
index 0000000..07bce11
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.java
new file mode 100755
index 0000000..d8309a4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlFormat.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml.annotation;
+
+/**
+ * XML format to use when serializing a POJO.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum XmlFormat {
+
+	/**
+	 * Normal formatting (default)
+	 */
+	NORMAL,
+
+	/**
+	 * Render property as an attribute instead of an element.
+	 * <p>
+	 * 	Can only be applied to properties (methods/fields) of simple types (e.g. <code>String</code>, <code>Number</code>).
+	 */
+	ATTR,
+
+	/**
+	 * Render property as an element instead of an attribute.
+	 * <p>
+	 * 	Can be applied to URL and ID bean properties that would normally be rendered as attributes.
+	 */
+	ELEMENT,
+
+	/**
+	 * Prevents collections and arrays from being enclosed in <xt>&lt;array&gt;</xt> elements.
+	 * <p>
+	 * 	Can only be applied to properties (methods/fields) of type collection or array, or collection classes.
+	 */
+	COLLAPSED,
+
+	/**
+	 * Render property value directly as content of element.
+	 * <p>
+	 * 	By default, content is converted to plain text.
+	 * <p>
+	 * 	Can be used in combination with {@link Xml#contentHandler()} to produce something other
+	 * 	than plain text, such as embedded XML.
+	 */
+	CONTENT
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.class
new file mode 100755
index 0000000..abf1718
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.java
new file mode 100755
index 0000000..3f80633
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlNs.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml.annotation;
+
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Namespace name/URL mapping pair.
+ * <p>
+ * 	Used to identify a namespace/URI pair on a {@link XmlSchema#xmlNs()} annotation.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({})
+@Retention(RUNTIME)
+@Inherited
+public @interface XmlNs {
+
+	/**
+	 * XML namespace prefix.
+	 */
+	String prefix();
+
+	/**
+	 * XML namespace URL.
+	 */
+	String namespaceURI();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.class
new file mode 100755
index 0000000..542c5e8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.java
new file mode 100755
index 0000000..7b08836
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/XmlSchema.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Identifies the default XML namespaces at the package level.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(PACKAGE)
+@Retention(RUNTIME)
+@Inherited
+public @interface XmlSchema {
+
+	/**
+	 * Sets the default XML prefix for all classes in this and child packages.
+	 * <p>
+	 * 	Must either be matched with a {@link #namespace()} annotation, or an {@link #xmlNs()} mapping with the
+	 * 	same {@link XmlNs#prefix} value.
+	 * </p>
+	 */
+	public String prefix() default "";
+
+	/**
+	 * Sets the default XML namespace URL for all classes in this and child packages.
+	 * <p>
+	 * 	Must either be matched with a {@link #prefix()} annotation, or an {@link #xmlNs()} mapping with the
+	 * 	same {@link XmlNs#namespaceURI} value.
+	 * </p>
+	 */
+	public String namespace() default "";
+
+	/**
+	 * Lists all namespace mappings to be used on all classes within this package.
+	 * <p>
+	 * 	The purpose of this annotation is to allow namespace mappings to be defined in a single location
+	 * 	and referred to by name through just the {@link Xml#prefix()} annotation.
+	 * <p>
+	 * 	Inherited by child packages.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p>
+	 * 	Contents of <code>package-info.java</code>...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jc>// XML namespaces used within this package.</jc>
+	 * 	<ja>@XmlSchema</ja>(prefix=<js>"ab"</js>,
+	 * 		namespaces={
+	 * 			<ja>@XmlNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.ibm.com/addressBook/"</js>),
+	 * 			<ja>@XmlNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.ibm.com/person/"</js>),
+	 * 			<ja>@XmlNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.ibm.com/address/"</js>),
+	 * 			<ja>@XmlNs</ja>(prefix=<js>"mail"</js>, namespaceURI="<js>http://www.ibm.com/mail/"</js>)
+	 * 		}
+	 * 	)
+	 * 	<jk>package</jk> com.ibm.sample.addressbook;
+	 * 	<jk>import</jk> com.ibm.juno.core.xml.annotation.*;
+	 * </p>
+	 * <p>
+	 * 	Class in package using defined namespaces...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jk>package</jk> com.ibm.sample.addressbook;
+	 *
+	 * 	<jc>// Bean class, override "ab" namespace on package.</jc>
+	 * 	<ja>@Xml</ja>(prefix=<js>"addr"</js>)
+	 * 	<jk>public class</jk> Address {
+	 *
+	 * 		<jc>// Bean property, use "addr" namespace on class.</jc>
+	 * 		<jk>public int</jk> <jf>id</jf>;
+	 *
+	 * 		<jc>// Bean property, override with "mail" namespace.</jc>
+	 * 		<ja>@Xml</ja>(prefix=<js>"mail"</js>)
+	 * 		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public XmlNs[] xmlNs() default {};
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/package.html
new file mode 100755
index 0000000..6c746f7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>XML annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_HTML.png
new file mode 100755
index 0000000..b4a3576
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XML.png
new file mode 100755
index 0000000..bfced84
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSchema.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSchema.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSchema.png
new file mode 100755
index 0000000..8a64e89
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSchema.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSimple.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSimple.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSimple.png
new file mode 100755
index 0000000..7acba29
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/doc-files/Example_XMLSimple.png differ


[22/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.java
new file mode 100755
index 0000000..af88d87
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarFilter.java
@@ -0,0 +1,289 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.text.*;
+import java.util.*;
+
+import javax.xml.bind.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Transforms {@link Calendar Calendars} to {@link String Strings}.
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link ToString} - Transforms to {@link String Strings} using the {@code Date.toString()} method.
+ * 	<li>{@link ISO8601DT} - Transforms to ISO8601 date-time strings.
+ * 	<li>{@link ISO8601DTZ} - Same as {@link ISO8601DT}, except always serializes in GMT.
+ * 	<li>{@link RFC2822DT} - Transforms to RFC2822 date-time strings.
+ * 	<li>{@link RFC2822DTZ} - Same as {@link RFC2822DT}, except always serializes in GMT.
+ * 	<li>{@link RFC2822D} - Transforms to RFC2822 date strings.
+ * 	<li>{@link Simple} - Transforms to simple <js>"yyyy/MM/dd HH:mm:ss"</js> strings.
+ * 	<li>{@link Medium} - Transforms to {@link DateFormat#MEDIUM} strings.
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class CalendarFilter extends PojoFilter<Calendar,String> {
+
+	private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
+
+	/**
+	 * Transforms {@link Calendar Calendars} to {@link String Strings} using the {@code Date.toString()} method.
+	 *
+	 * <dl>
+	 * 	<dt>Example output:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"Wed Jul 04 15:30:45 EST 2001"</js>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static class ToString extends CalendarFilter {
+		/** Constructor */
+		public ToString() {
+			super("EEE MMM dd HH:mm:ss zzz yyyy");
+		}
+	}
+
+	/**
+	 * Transforms {@link Calendar Calendars} to ISO8601 date-time strings.
+	 *
+	 * <dl>
+	 * 	<dt>Example output:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"2001-07-04T15:30:45-05:00"</js>
+	 * 	<li><js>"2001-07-04T15:30:45Z"</js>
+	 * </ul>
+	 * 	</dd>
+	 * 	<dt>Example input:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"2001-07-04T15:30:45-05:00"</js>
+	 * 	<li><js>"2001-07-04T15:30:45Z"</js>
+	 * 	<li><js>"2001-07-04T15:30:45.1Z"</js>
+	 * 	<li><js>"2001-07-04T15:30Z"</js>
+	 * 	<li><js>"2001-07-04"</js>
+	 * 	<li><js>"2001-07"</js>
+	 * 	<li><js>"2001"</js>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static class ISO8601DT extends CalendarFilter {
+
+		/** Constructor */
+		public ISO8601DT() {}
+
+		@Override /* PojoFilter */
+		public Calendar unfilter(String o, ClassMeta<?> hint) throws ParseException {
+			try {
+				if (StringUtils.isEmpty(o))
+					return null;
+				return convert(DatatypeConverter.parseDateTime(o), hint);
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+
+		@Override /* PojoFilter */
+		public String filter(Calendar o) {
+			return DatatypeConverter.printDateTime(o);
+		}
+	}
+
+	/**
+	 * Same as {@link ISO8601DT}, except always serializes in GMT.
+	 * <p>
+	 * Example output: <js>"2001-07-04T15:30:45Z"</js>
+	 */
+	public static class ISO8601DTZ extends CalendarFilter {
+
+		/** Constructor */
+		public ISO8601DTZ() {}
+
+		@Override /* PojoFilter */
+		public Calendar unfilter(String o, ClassMeta<?> hint) throws ParseException {
+			try {
+				if (StringUtils.isEmpty(o))
+					return null;
+				return convert(DatatypeConverter.parseDateTime(o), hint);
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+
+		@Override /* PojoFilter */
+		public String filter(Calendar o) {
+			if (o.getTimeZone().getRawOffset() != 0) {
+				Calendar c = Calendar.getInstance(GMT);
+				c.setTime(o.getTime());
+				o = c;
+			}
+			return DatatypeConverter.printDateTime(o);
+		}
+	}
+
+	/**
+	 * Transforms {@link Calendar Calendars} to RFC2822 date-time strings.
+	 */
+	public static class RFC2822DT extends CalendarFilter {
+		/** Constructor */
+		public RFC2822DT() {
+			super("EEE, dd MMM yyyy HH:mm:ss Z");
+		}
+	}
+
+	/**
+	 * Same as {@link RFC2822DT}, except always serializes in GMT.
+	 * <p>
+	 * Example output: <js>"Wed, 31 Jan 2001 12:34:56 +0000"</js>
+	 */
+	public static class RFC2822DTZ extends CalendarFilter {
+		/** Constructor */
+		public RFC2822DTZ() {
+			super("EEE, dd MMM yyyy HH:mm:ss 'GMT'", GMT);
+		}
+	}
+
+	/**
+	 * Transforms {@link Calendar Calendars} to RFC2822 date strings.
+	 */
+	public static class RFC2822D extends CalendarFilter {
+		/** Constructor */
+		public RFC2822D() {
+			super("dd MMM yyyy");
+		}
+	}
+
+	/**
+	 * Transforms {@link Calendar Calendars} to simple <js>"yyyy/MM/dd HH:mm:ss"</js> strings.
+	 */
+	public static class Simple extends CalendarFilter {
+		/** Constructor */
+		public Simple() {
+			super("yyyy/MM/dd HH:mm:ss");
+		}
+	}
+
+	/**
+	 * Transforms {@link Calendar Calendars} to {@link DateFormat#MEDIUM} strings.
+	 */
+	public static class Medium extends CalendarFilter {
+		/** Constructor */
+		public Medium() {
+			super(DateFormat.getDateInstance(DateFormat.MEDIUM));
+		}
+	}
+
+	/** The formatter to convert dates to Strings. */
+	private DateFormat format;
+
+	private TimeZone timeZone;
+
+	/**
+	 * Default constructor.
+	 * <p>
+	 * 	This constructor is used when <code>filter()</code> and <code>unfilter()</code> are overridden by subclasses.
+	 */
+	public CalendarFilter() {}
+
+	/**
+	 * Construct a filter using the specified date format string that will be
+	 * 	used to construct a {@link SimpleDateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param simpleDateFormat The {@link SimpleDateFormat} pattern.
+	 */
+	public CalendarFilter(String simpleDateFormat) {
+		this(new SimpleDateFormat(simpleDateFormat));
+	}
+
+	/**
+	 * Construct a filter using the specified date format string that will be
+	 * 	used to construct a {@link SimpleDateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param simpleDateFormat The {@link SimpleDateFormat} pattern.
+	 * @param timeZone The time zone to associate with the date pattern.
+	 */
+	public CalendarFilter(String simpleDateFormat, TimeZone timeZone) {
+		this(new SimpleDateFormat(simpleDateFormat));
+		format.setTimeZone(timeZone);
+		this.timeZone = timeZone;
+	}
+
+	/**
+	 * Construct a filter using the specified {@link DateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param format The format to use to convert dates to strings.
+	 */
+	public CalendarFilter(DateFormat format) {
+		super();
+		this.format = format;
+	}
+
+	/**
+	 * Converts the specified {@link Calendar} to a {@link String}.
+	 */
+	@Override /* PojoFilter */
+	public String filter(Calendar o) {
+		DateFormat df = format;
+		TimeZone tz1 = o.getTimeZone();
+		TimeZone tz2 = format.getTimeZone();
+		if (timeZone == null && ! tz1.equals(tz2)) {
+			df = (DateFormat)format.clone();
+			df.setTimeZone(tz1);
+		}
+		return df.format(o.getTime());
+	}
+
+	/**
+	 * Converts the specified {@link String} to a {@link Calendar}.
+	 */
+	@Override /* PojoFilter */
+	public Calendar unfilter(String o, ClassMeta<?> hint) throws ParseException {
+		try {
+			if (StringUtils.isEmpty(o))
+				return null;
+			return convert(format.parse(o), hint);
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+
+	private static Calendar convert(Calendar in, ClassMeta<?> hint) throws Exception {
+		if (hint.isInstance(in) || ! hint.canCreateNewInstance())
+			return in;
+		Calendar c = (Calendar)hint.newInstance();
+		c.setTime(in.getTime());
+		c.setTimeZone(in.getTimeZone());
+		return c;
+	}
+
+	private static Calendar convert(Date in, ClassMeta<?> hint) throws Exception {
+		if (hint == null || ! hint.canCreateNewInstance())
+			hint = BeanContext.DEFAULT.getClassMeta(GregorianCalendar.class);
+		Calendar c = (Calendar)hint.newInstance();
+		c.setTime(in);
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.class
new file mode 100755
index 0000000..98d2415
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.java
new file mode 100755
index 0000000..c68b3c9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarLongFilter.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Transforms {@link Calendar Calendars} to {@link Long Longs} using {@code Calender.getTime().getTime()}.
+ * <p>
+ * 	TODO:  This class does not handle timezones correctly when parsing {@code GregorianCalendar} objects.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class CalendarLongFilter extends PojoFilter<Calendar,Long> {
+
+	/**
+	 * Converts the specified {@link Calendar} to a {@link Long}.
+	 */
+	@Override /* PojoFilter */
+	public Long filter(Calendar o) {
+		return o.getTime().getTime();
+	}
+
+	/**
+	 * Converts the specified {@link Long} to a {@link Calendar}.
+	 */
+	@Override /* PojoFilter */
+	@SuppressWarnings("unchecked")
+	public Calendar unfilter(Long o, ClassMeta<?> hint) throws ParseException {
+		ClassMeta<? extends Calendar> tt;
+		try {
+			if (hint == null || ! hint.canCreateNewInstance())
+				hint = getBeanContext().getClassMeta(GregorianCalendar.class);
+			tt = (ClassMeta<? extends Calendar>)hint;
+			Calendar c = tt.newInstance();
+			c.setTimeInMillis(o);
+			return c;
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.class
new file mode 100755
index 0000000..bf9f7fd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.java
new file mode 100755
index 0000000..9c4ab3f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/CalendarMapFilter.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Transforms {@link Calendar Calendars} to {@link Map Maps} of the format <code>{_class:String,value:long}</code>.
+ * <p>
+ * 	TODO:  This class does not handle timezones correctly when parsing {@code GregorianCalendar} objects.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("rawtypes")
+public class CalendarMapFilter extends PojoFilter<Calendar,Map> {
+
+	/**
+	 * Converts the specified {@link Calendar} to a {@link Map}.
+	 */
+	@Override /* PojoFilter */
+	public Map filter(Calendar o) {
+		ObjectMap m = new ObjectMap();
+		m.put("time", o.getTime().getTime());
+		m.put("timeZone", o.getTimeZone().getID());
+		return m;
+	}
+
+	/**
+	 * Converts the specified {@link Map} to a {@link Calendar}.
+	 */
+	@Override /* PojoFilter */
+	@SuppressWarnings("unchecked")
+	public Calendar unfilter(Map o, ClassMeta<?> hint) throws ParseException {
+		ClassMeta<? extends Calendar> tt;
+		try {
+			if (hint == null || ! hint.canCreateNewInstance())
+				hint = getBeanContext().getClassMeta(GregorianCalendar.class);
+			tt = (ClassMeta<? extends Calendar>)hint;
+			long time = Long.parseLong(o.get("time").toString());
+			String timeZone = o.get("timeZone").toString();
+			Date d = new Date(time);
+			Calendar c = tt.newInstance();
+			c.setTime(d);
+			c.setTimeZone(TimeZone.getTimeZone(timeZone));
+			return c;
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DT.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DT.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DT.class
new file mode 100755
index 0000000..19e7cf5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DT.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTP.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTP.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTP.class
new file mode 100755
index 0000000..5063f59
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTP.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTPNZ.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTPNZ.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTPNZ.class
new file mode 100755
index 0000000..3c4fc61
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTPNZ.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZ.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZ.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZ.class
new file mode 100755
index 0000000..5e26cba
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZ.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZP.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZP.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZP.class
new file mode 100755
index 0000000..d41205f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ISO8601DTZP.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Medium.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Medium.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Medium.class
new file mode 100755
index 0000000..570a27b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Medium.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822D.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822D.class
new file mode 100755
index 0000000..0c8f4f1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DT.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DT.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DT.class
new file mode 100755
index 0000000..f034235
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DT.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DTZ.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DTZ.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DTZ.class
new file mode 100755
index 0000000..41db26c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$RFC2822DTZ.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Simple.class
new file mode 100755
index 0000000..e438251
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$SimpleP.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$SimpleP.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$SimpleP.class
new file mode 100755
index 0000000..be31fe4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$SimpleP.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ToString.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ToString.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ToString.class
new file mode 100755
index 0000000..7a78e4d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter$ToString.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.class
new file mode 100755
index 0000000..123a252
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.java
new file mode 100755
index 0000000..1759b41
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateFilter.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.text.*;
+import java.util.*;
+
+import javax.xml.bind.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Transforms {@link Date Dates} to {@link String Strings}.
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link ToString} - Transforms to {@link String Strings} using the {@code Date.toString()} method.
+ * 	<li>{@link ISO8601DT} - Transforms to ISO8601 date-time strings.
+ * 	<li>{@link ISO8601DTP} - Transforms to ISO8601 date-time strings with millisecond precision.
+ * 	<li>{@link ISO8601DTZ} - Same as {@link ISO8601DT}, except always serializes in GMT.
+ * 	<li>{@link ISO8601DTZ} - Same as {@link ISO8601DTZ}, except with millisecond precision.
+ * 	<li>{@link RFC2822DT} - Transforms to RFC2822 date-time strings.
+ * 	<li>{@link RFC2822DTZ} - Same as {@link RFC2822DT}, except always serializes in GMT.
+ * 	<li>{@link RFC2822D} - Transforms to RFC2822 date strings.
+ * 	<li>{@link Simple} - Transforms to simple <js>"yyyy/MM/dd HH:mm:ss"</js> strings.
+ * 	<li>{@link Medium} - Transforms to {@link DateFormat#MEDIUM} strings.
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class DateFilter extends PojoFilter<Date,String> {
+
+	/**
+	 * Transforms {@link Date Dates} to {@link String Strings} using the {@code Date.toString()} method.
+	 * <p>
+	 * <dl>
+	 * 	<dt>Example output:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"Wed Jul 04 15:30:45 EST 2001"</js>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static class ToString extends DateFilter {
+		/** Constructor */
+		public ToString() {
+			super("EEE MMM dd HH:mm:ss zzz yyyy");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to ISO8601 date-time strings.
+	 *
+	 * <dl>
+	 * 	<dt>Example output:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"2001-07-04T15:30:45-05:00"</js>
+	 * 	<li><js>"2001-07-04T15:30:45Z"</js>
+	 * </ul>
+	 * 	</dd>
+	 * 	<dt>Example input:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><js>"2001-07-04T15:30:45-05:00"</js>
+	 * 	<li><js>"2001-07-04T15:30:45Z"</js>
+	 * 	<li><js>"2001-07-04T15:30:45.1Z"</js>
+	 * 	<li><js>"2001-07-04T15:30Z"</js>
+	 * 	<li><js>"2001-07-04"</js>
+	 * 	<li><js>"2001-07"</js>
+	 * 	<li><js>"2001"</js>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static class ISO8601DT extends DateFilter {
+		private SimpleDateFormat tzFormat = new SimpleDateFormat("Z");
+
+		/** Constructor */
+		public ISO8601DT() {
+			this("yyyy-MM-dd'T'HH:mm:ss");
+		}
+
+		/**
+		 * Constructor with specific pattern.
+		 *
+		 * @param pattern The {@link MessageFormat}-style format string.
+		 */
+		protected ISO8601DT(String pattern) {
+			super(pattern);
+		}
+
+		@Override /* PojoFilter */
+		public Date unfilter(String o, ClassMeta<?> hint) throws ParseException {
+			try {
+				if (StringUtils.isEmpty(o))
+					return null;
+				return convert(DatatypeConverter.parseDateTime(o).getTime(), hint);
+			} catch (ParseException e) {
+				throw e;
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+
+		@Override /* PojoFilter */
+		public String filter(Date o) {
+			String s = super.filter(o);
+			String tz = tzFormat.format(o);
+			if (tz.equals("+0000"))
+				return s + "Z";
+			return s + tz.substring(0,3) + ':' + tz.substring(3);
+		}
+	}
+
+	/**
+	 * Same as {@link ISO8601DT} except serializes to millisecond precision.
+	 * <p>
+	 * Example output: <js>"2001-07-04T15:30:45.123-05:00"</js>
+	 */
+	public static class ISO8601DTP extends ISO8601DT {
+
+		/** Constructor */
+		public ISO8601DTP() {
+			super("yyyy-MM-dd'T'HH:mm:ss.SSS");
+		}
+	}
+
+	/**
+	 * Same as {@link ISO8601DT} except serializes to millisecond precision and doesn't include timezone.
+	 * <p>
+	 * Example output: <js>"2001-07-04T15:30:45.123"</js>
+	 */
+	public static class ISO8601DTPNZ extends DateFilter {
+
+		/** Constructor */
+		public ISO8601DTPNZ() {
+			super("yyyy-MM-dd'T'HH:mm:ss.SSS");
+		}
+	}
+
+	/**
+	 * Same as {@link ISO8601DT}, except always serializes in GMT.
+	 * <p>
+	 * Example output:  <js>"2001-07-04T15:30:45Z"</js>
+	 */
+	public static class ISO8601DTZ extends DateFilter {
+
+		/** Constructor */
+		public ISO8601DTZ() {
+			this("yyyy-MM-dd'T'HH:mm:ss'Z'");
+		}
+
+		/**
+		 * Constructor with specific pattern.
+		 *
+		 * @param pattern The {@link MessageFormat}-style format string.
+		 */
+		protected ISO8601DTZ(String pattern) {
+			super(pattern, "GMT");
+		}
+
+		@Override /* PojoFilter */
+		public Date unfilter(String o, ClassMeta<?> hint) throws ParseException {
+			try {
+				if (StringUtils.isEmpty(o))
+					return null;
+				return convert(DatatypeConverter.parseDateTime(o).getTime(), hint);
+			} catch (ParseException e) {
+				throw e;
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+	}
+
+	/**
+	 * Same as {@link ISO8601DTZ} except serializes to millisecond precision.
+	 * <p>
+	 * Example output:  <js>"2001-07-04T15:30:45.123Z"</js>
+	 */
+	public static class ISO8601DTZP extends ISO8601DT {
+
+		/** Constructor */
+		public ISO8601DTZP() {
+			super("yyyy-MM-dd'T'HH:mm:ss.SSS");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to RFC2822 date-time strings.
+	 */
+	public static class RFC2822DT extends DateFilter {
+		/** Constructor */
+		public RFC2822DT() {
+			super("EEE, dd MMM yyyy HH:mm:ss z");
+		}
+	}
+
+	/**
+	 * Same as {@link RFC2822DT}, except always serializes in GMT.
+	 * <p>
+	 * Example output:  <js>"2001-07-04T15:30:45Z"</js>
+	 */
+	public static class RFC2822DTZ extends DateFilter {
+		/** Constructor */
+		public RFC2822DTZ() {
+			super("EEE, dd MMM yyyy HH:mm:ss z", "GMT");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to RFC2822 date strings.
+	 */
+	public static class RFC2822D extends DateFilter {
+		/** Constructor */
+		public RFC2822D() {
+			super("dd MMM yyyy");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to simple <js>"yyyy/MM/dd HH:mm:ss"</js> strings.
+	 */
+	public static class Simple extends DateFilter {
+		/** Constructor */
+		public Simple() {
+			super("yyyy/MM/dd HH:mm:ss");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to simple <js>"yyyy/MM/dd HH:mm:ss.SSS"</js> strings.
+	 */
+	public static class SimpleP extends DateFilter {
+		/** Constructor */
+		public SimpleP() {
+			super("yyyy/MM/dd HH:mm:ss.SSS");
+		}
+	}
+
+	/**
+	 * Transforms {@link Date Dates} to {@link DateFormat#MEDIUM} strings.
+	 */
+	public static class Medium extends DateFilter {
+		/** Constructor */
+		public Medium() {
+			super(DateFormat.getDateInstance(DateFormat.MEDIUM));
+		}
+	}
+
+	/** The formatter to convert dates to Strings. */
+	private DateFormat format;
+
+	/**
+	 * Construct a filter using the specified date format string that will be
+	 * 	used to construct a {@link SimpleDateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param simpleDateFormat The {@link SimpleDateFormat} pattern.
+	 */
+	public DateFilter(String simpleDateFormat) {
+		this(new SimpleDateFormat(simpleDateFormat));
+	}
+
+	/**
+	 * Construct a filter using the specified date format string that will be
+	 * 	used to construct a {@link SimpleDateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param simpleDateFormat The {@link SimpleDateFormat} pattern.
+	 * @param timeZone The time zone to associate with the date pattern.
+	 */
+	public DateFilter(String simpleDateFormat, String timeZone) {
+		this(new SimpleDateFormat(simpleDateFormat));
+		format.setTimeZone(TimeZone.getTimeZone(timeZone));
+	}
+
+	/**
+	 * Construct a filter using the specified {@link DateFormat} that will be used to convert
+	 * 	dates to strings.
+	 *
+	 * @param format The format to use to convert dates to strings.
+	 */
+	public DateFilter(DateFormat format) {
+		super();
+		this.format = format;
+	}
+
+	/**
+	 * Converts the specified {@link Date} to a {@link String}.
+	 */
+	@Override /* PojoFilter */
+	public String filter(Date o) {
+		return format.format(o);
+	}
+
+	/**
+	 * Converts the specified {@link String} to a {@link Date}.
+	 */
+	@Override /* PojoFilter */
+	public Date unfilter(String o, ClassMeta<?> hint) throws ParseException {
+		try {
+			if (StringUtils.isEmpty(o))
+				return null;
+			Date d = format.parse(o);
+			return convert(d, hint);
+		} catch (ParseException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+
+	private static Date convert(Date in, ClassMeta<?> hint) throws Exception {
+		if (in == null)
+			return null;
+		if (hint == null || hint.isInstance(in))
+			return in;
+		Class<?> c = hint.getInnerClass();
+		if (c == java.util.Date.class)
+			return in;
+		if (c == java.sql.Date.class)
+			return new java.sql.Date(in.getTime());
+		if (c == java.sql.Time.class)
+			return new java.sql.Time(in.getTime());
+		if (c == java.sql.Timestamp.class)
+			return new java.sql.Timestamp(in.getTime());
+		throw new ParseException("DateFilter is unable to narrow object of type ''{0}''", c);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.class
new file mode 100755
index 0000000..70b7348
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.java
new file mode 100755
index 0000000..c454645
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateLongFilter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Transforms {@link Date Dates} to {@link Long Longs}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class DateLongFilter extends PojoFilter<Date,Long> {
+
+	/**
+	 * Converts the specified {@link Date} to a {@link Long}.
+	 */
+	@Override /* PojoFilter */
+	public Long filter(Date o) {
+		return o.getTime();
+	}
+
+	/**
+	 * Converts the specified {@link Long} to a {@link Date}.
+	 */
+	@Override /* PojoFilter */
+	public Date unfilter(Long o, ClassMeta<?> hint) throws ParseException {
+		Class<?> c = (hint == null ? java.util.Date.class : hint.getInnerClass());
+		if (c == java.util.Date.class)
+			return new java.util.Date(o);
+		if (c == java.sql.Date.class)
+			return new java.sql.Date(o);
+		if (c == java.sql.Time.class)
+			return new java.sql.Time(o);
+		if (c == java.sql.Timestamp.class)
+			return new java.sql.Timestamp(o);
+		throw new ParseException("DateLongFilter is unable to narrow object of type ''{0}''", c);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.class
new file mode 100755
index 0000000..1a84d40
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.java
new file mode 100755
index 0000000..ba5c63f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/DateMapFilter.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Transforms {@link Date Dates} to {@link Map Maps} of the format <tt>{value:long}</tt>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("rawtypes")
+public class DateMapFilter extends PojoFilter<Date,Map> {
+
+	/**
+	 * Converts the specified {@link Date} to a {@link Map}.
+	 */
+	@Override /* PojoFilter */
+	public Map filter(Date o) {
+		ObjectMap m = new ObjectMap();
+		m.put("time", o.getTime());
+		return m;
+	}
+
+	/**
+	 * Converts the specified {@link Map} to a {@link Date}.
+	 */
+	@Override /* PojoFilter */
+	public Date unfilter(Map o, ClassMeta<?> hint) throws ParseException {
+		Class<?> c = (hint == null ? java.util.Date.class : hint.getInnerClass());
+		long l = Long.parseLong(((Map<?,?>)o).get("time").toString());
+		if (c == java.util.Date.class)
+			return new java.util.Date(l);
+		if (c == java.sql.Date.class)
+			return new java.sql.Date(l);
+		if (c == java.sql.Time.class)
+			return new java.sql.Time(l);
+		if (c == java.sql.Timestamp.class)
+			return new java.sql.Timestamp(l);
+		throw new ParseException("DateMapFilter is unable to narrow object of type ''{0}''", c);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.class
new file mode 100755
index 0000000..3aaf8b1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.java
new file mode 100755
index 0000000..549f7da
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/EnumerationFilter.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.filter.*;
+
+/**
+ * Transforms {@link Enumeration Enumerations} to {@code List<Object>} objects.
+ * <p>
+ * 	This is a one-way filter, since {@code Enumerations} cannot be reconstituted.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({"unchecked","rawtypes"})
+public class EnumerationFilter extends PojoFilter<Enumeration,List> {
+
+	/**
+	 * Converts the specified {@link Enumeration} to a {@link List}.
+	 */
+	@Override /* PojoFilter */
+	public List filter(Enumeration o) {
+		List l = new LinkedList();
+		while (o.hasMoreElements())
+			l.add(o.nextElement());
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.class
new file mode 100755
index 0000000..f7ef926
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.java
new file mode 100755
index 0000000..7e5ded6
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/IteratorFilter.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.util.*;
+
+import com.ibm.juno.core.filter.*;
+
+/**
+ * Transforms {@link Iterator Iterators} to {@code List<Object>} objects.
+ * <p>
+ * 	This is a one-way filter, since {@code Iterators} cannot be reconstituted.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({"unchecked","rawtypes"})
+public class IteratorFilter extends PojoFilter<Iterator,List> {
+
+	/**
+	 * Converts the specified {@link Iterator} to a {@link List}.
+	 */
+	@Override /* PojoFilter */
+	public List filter(Iterator o) {
+		List l = new LinkedList();
+		while (o.hasNext())
+			l.add(o.next());
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Html.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Html.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Html.class
new file mode 100755
index 0000000..1e70661
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Html.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Json.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Json.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Json.class
new file mode 100755
index 0000000..4a97b6b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Json.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$PlainText.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$PlainText.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$PlainText.class
new file mode 100755
index 0000000..8e5c6fd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$PlainText.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Xml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Xml.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Xml.class
new file mode 100755
index 0000000..21130fc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter$Xml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.class
new file mode 100755
index 0000000..c425ae6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.java
new file mode 100755
index 0000000..e1d4ecc
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/ReaderFilter.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import java.io.*;
+
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Transforms the contents of a {@link Reader} into an {@code Object}.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	The {@code Reader} must contain JSON, Juno-generated XML (output from {@link XmlSerializer}),
+ * 		or Juno-generated HTML (output from {@link JsonSerializer}) in order to be parsed correctly.
+ * <p>
+ * 	Useful for serializing models that contain {@code Readers} created by {@code RestCall} instances.
+ * <p>
+ * 	This is a one-way filter, since {@code Readers} cannot be reconstituted.
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link Json} - Parses JSON text.
+ * 	<li>{@link Xml} - Parses XML text.
+ * 	<li>{@link Html} - Parses HTML text.
+ * 	<li>{@link PlainText} - Parses plain text.
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ReaderFilter extends PojoFilter<Reader,Object> {
+
+	/** Reader filter for reading JSON text. */
+	public static class Json extends ReaderFilter {
+		/** Constructor */
+		public Json() {
+			super(JsonParser.DEFAULT);
+		}
+	}
+
+	/** Reader filter for reading XML text. */
+	public static class Xml extends ReaderFilter {
+		/** Constructor */
+		public Xml() {
+			super(XmlParser.DEFAULT);
+		}
+	}
+
+	/** Reader filter for reading HTML text. */
+	public static class Html extends ReaderFilter {
+		/** Constructor */
+		public Html() {
+			super(HtmlParser.DEFAULT);
+		}
+	}
+
+	/** Reader filter for reading plain text. */
+	public static class PlainText extends ReaderFilter {
+		/** Constructor */
+		public PlainText() {
+			super(null);
+		}
+	}
+
+	/** The parser to use to parse the contents of the Reader. */
+	private ReaderParser parser;
+
+	/**
+	 * @param parser The parser to use to convert the contents of the reader to Java objects.
+	 */
+	public ReaderFilter(ReaderParser parser) {
+		this.parser = parser;
+	}
+
+	/**
+	 * Converts the specified {@link Reader} to an {@link Object} whose type is determined
+	 * by the contents of the reader.
+	 */
+	@Override /* PojoFilter */
+	public Object filter(Reader o) throws SerializeException {
+		try {
+			if (parser == null)
+				return IOUtils.read(o);
+			return parser.parse(o, -1, beanContext.object());
+		} catch (IOException e) {
+			return e.getLocalizedMessage();
+		} catch (Exception e) {
+			throw new SerializeException("ReaderFilter could not filter object of type ''{0}''", o == null ? null : o.getClass().getName()).initCause(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.class
new file mode 100755
index 0000000..51e4b5d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.java
new file mode 100755
index 0000000..f2f111f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/XMLGregorianCalendarFilter.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2013, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filters;
+
+import javax.xml.datatype.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Transforms {@link XMLGregorianCalendar XMLGregorianCalendars} to ISO8601 date-time {@link String Strings}.
+ * <p>
+ * 	Objects are converted to strings using {@link XMLGregorianCalendar#toXMLFormat()}.
+ * <p>
+ * 	Strings are converted to objects using {@link DatatypeFactory#newXMLGregorianCalendar(String)}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class XMLGregorianCalendarFilter extends PojoFilter<XMLGregorianCalendar,String> {
+
+	private DatatypeFactory dtf;
+
+	/**
+	 * Constructor.
+	 */
+	public XMLGregorianCalendarFilter() {
+		try {
+			this.dtf = DatatypeFactory.newInstance();
+		} catch (DatatypeConfigurationException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Converts the specified <code>XMLGregorianCalendar</code> to a {@link String}.
+	 */
+	@Override /* PojoFilter */
+	public String filter(XMLGregorianCalendar b) throws SerializeException {
+		return b.toXMLFormat();
+	}
+
+	/**
+	 * Converts the specified {@link String} to an <code>XMLGregorianCalendar</code>.
+	 */
+	@Override /* PojoFilter */
+	public XMLGregorianCalendar unfilter(String s, ClassMeta<?> hint) throws ParseException {
+		if (StringUtils.isEmpty(s))
+			return null;
+		return dtf.newXMLGregorianCalendar(s);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/package.html
new file mode 100755
index 0000000..27e7a14
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filters/package.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Predefined Filter implementations</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<!-- ======================================================================================================== -->
+<a id="PredefinedFilters"></a><h2 class='topic'>1 - Predefined filter support</h2>
+<p>
+	This package contains various predefined instances of filters for commonly-serialized/parsed class types.
+</p>
+<p>
+	See {@link com.ibm.juno.core.filter} for more information about filters.
+</p>
+</body>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.class
new file mode 100755
index 0000000..bcdcdb8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.java
new file mode 100755
index 0000000..4405f91
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlBeanPropertyMeta.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.html.annotation.*;
+
+/**
+ * Metadata on bean properties specific to the HTML serializers and parsers pulled from the {@link Html @Html} annotation on the bean property.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The bean class.
+ */
+public class HtmlBeanPropertyMeta<T> {
+
+	private boolean asXml, noTables, noTableHeaders, asPlainText;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanPropertyMeta The metadata of the bean property of this additional metadata.
+	 */
+	public HtmlBeanPropertyMeta(BeanPropertyMeta<T> beanPropertyMeta) {
+		if (beanPropertyMeta.getField() != null)
+			findHtmlInfo(beanPropertyMeta.getField().getAnnotation(Html.class));
+		if (beanPropertyMeta.getGetter() != null)
+			findHtmlInfo(beanPropertyMeta.getGetter().getAnnotation(Html.class));
+		if (beanPropertyMeta.getSetter() != null)
+			findHtmlInfo(beanPropertyMeta.getSetter().getAnnotation(Html.class));
+	}
+
+	private void findHtmlInfo(Html html) {
+		if (html == null)
+			return;
+		if (html.asXml())
+			asXml = html.asXml();
+		if (html.noTables())
+			noTables = html.noTables();
+		if (html.noTableHeaders())
+			noTableHeaders = html.noTableHeaders();
+		if (html.asPlainText())
+			asPlainText = html.asPlainText();
+	}
+
+	/**
+	 * Returns whether this bean property should be serialized as XML instead of HTML.
+	 *
+	 * @return <jk>true</jk> if the the {@link Html} annotation is specified, and {@link Html#asXml()} is <jk>true</jk>.
+	 */
+	protected boolean isAsXml() {
+		return asXml;
+	}
+
+	/**
+	 * Returns whether this bean property should be serialized as plain text instead of HTML.
+	 *
+	 * @return <jk>true</jk> if the the {@link Html} annotation is specified, and {@link Html#asPlainText()} is <jk>true</jk>.
+	 */
+	protected boolean isAsPlainText() {
+		return asPlainText;
+	}
+
+	/**
+	 * Returns whether this bean property should not be serialized as an HTML table.
+	 *
+	 * @return <jk>true</jk> if the the {@link Html} annotation is specified, and {@link Html#noTables()} is <jk>true</jk>.
+	 */
+	protected boolean isNoTables() {
+		return noTables;
+	}
+
+	/**
+	 * Returns whether this bean property should not include table headers when serialized as an HTML table.
+	 *
+	 * @return <jk>true</jk> if the the {@link Html} annotation is specified, and {@link Html#noTableHeaders()} is <jk>true</jk>.
+	 */
+	public boolean isNoTableHeaders() {
+		return noTableHeaders;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.class
new file mode 100755
index 0000000..74294b9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.java
new file mode 100755
index 0000000..b5af7e5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlClassMeta.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import com.ibm.juno.core.html.annotation.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Metadata on classes specific to the HTML serializers and parsers pulled from the {@link Html @Html} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class HtmlClassMeta {
+
+	private final Html html;
+	private final boolean asXml, noTables, noTableHeaders, asPlainText;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param c The class that this annotation is defined on.
+	 */
+	public HtmlClassMeta(Class<?> c) {
+		this.html = ReflectionUtils.getAnnotation(Html.class, c);
+		if (html != null) {
+			asXml = html.asXml();
+			noTables = html.noTables();
+			noTableHeaders = html.noTableHeaders();
+			asPlainText = html.asPlainText();
+		} else {
+			asXml = false;
+			noTables = false;
+			noTableHeaders = false;
+			asPlainText = false;
+		}
+	}
+
+	/**
+	 * Returns the {@link Html} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Html} annotation, or <jk>null</jk> if not specified.
+	 */
+	protected Html getAnnotation() {
+		return html;
+	}
+
+	/**
+	 * Returns the {@link Html#asXml()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Html#asXml()} annotation.
+	 */
+	protected boolean isAsXml() {
+		return asXml;
+	}
+
+	/**
+	 * Returns the {@link Html#asPlainText()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Html#asPlainText()} annotation.
+	 */
+	protected boolean isAsPlainText() {
+		return asPlainText;
+	}
+
+	/**
+	 * Returns the {@link Html#noTables()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Html#noTables()} annotation.
+	 */
+	protected boolean isNoTables() {
+		return noTables;
+	}
+
+	/**
+	 * Returns the {@link Html#noTableHeaders()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Html#noTableHeaders()} annotation.
+	 */
+	public boolean isNoTableHeaders() {
+		return noTableHeaders;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.class
new file mode 100755
index 0000000..e0992ad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.java
new file mode 100755
index 0000000..a58709d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializer.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.dto.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Serializes POJOs to HTTP responses as HTML documents.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/html</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/html</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Same as {@link HtmlSerializer}, except wraps the response in <code><xt>&lt;html&gt;</code>, <code><xt>&lt;head&gt;</code>,
+ * 	and <code><xt>&lt;body&gt;</code> tags so that it can be rendered in a browser.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link HtmlDocSerializerProperties}
+ * 	<li>{@link HtmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("text/html")
+public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
+
+	// Properties defined in RestServletProperties
+	private static final String
+		REST_method = "RestServlet.method",
+		REST_relativeServletURI = "RestServlet.relativeServletURI";
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+
+		HtmlSerializerContext hctx = (HtmlSerializerContext)ctx;
+		HtmlSerializerWriter w = hctx.getWriter(out);
+
+		ObjectMap properties = hctx.getProperties();
+
+		boolean isOptionsPage = properties.containsKey(REST_method) && properties.getString(REST_method).equalsIgnoreCase("OPTIONS");
+
+		// Render the header.
+		w.sTag("html").nl();
+		w.sTag("head").nl();
+
+		String cssUrl = hctx.getCssUrl();
+		if (cssUrl == null)
+			cssUrl = properties.getString(REST_relativeServletURI) + "/style.css";
+
+		w.oTag(1, "style")
+			.attr("type", "text/css")
+			.appendln(">")
+			.append(2, "@import ").q().append(cssUrl).q().appendln(";");
+		if (hctx.isNoWrap())
+			w.appendln("\n* {white-space:nowrap;}");
+		if (hctx.getCssImports() != null)
+			for (String cssImport : hctx.getCssImports())
+				w.append(2, "@import ").q().append(cssImport).q().appendln(";");
+		w.eTag(1, "style").nl();
+		w.eTag("head").nl();
+		w.sTag("body").nl();
+		// Write the title of the page.
+		String title = hctx.getTitle();
+		if (title == null && isOptionsPage)
+			title = "Options";
+		String description = hctx.getDescription();
+		if (title != null)
+			w.oTag(1, "h3").attr("class", "title").append('>').encodeText(title).eTag("h3").nl();
+		if (description != null)
+			w.oTag(1, "h5").attr("class", "description").append('>').encodeText(description).eTag("h5").nl();
+
+		// Write the action links that render above the results.
+		List<Link> actions = new LinkedList<Link>();
+
+		// If this is an OPTIONS request, provide a 'back' link to return to the GET request page.
+		if (! isOptionsPage) {
+			ObjectMap htmlLinks = hctx.getLinks();
+			if (htmlLinks != null) {
+				for (Map.Entry<String,Object> e : htmlLinks.entrySet()) {
+					String uri = e.getValue().toString();
+					if (uri.indexOf("://") == -1 && ! StringUtils.startsWith(uri, '/')) {
+						StringBuilder sb = new StringBuilder(properties.getString(REST_relativeServletURI));
+						if (! (uri.isEmpty() || uri.charAt(0) == '?' || uri.charAt(0) == '/'))
+							sb.append('/');
+						sb.append(uri);
+						uri = sb.toString();
+					}
+
+					actions.add(new Link(e.getKey(), uri));
+				}
+			}
+		}
+
+		if (actions.size() > 0) {
+			w.oTag(1, "p").attr("class", "links").append('>').nl();
+			for (Iterator<Link> i = actions.iterator(); i.hasNext();) {
+				Link h = i.next();
+				w.oTag(2, "a").attr("class", "link").attr("href", h.getHref(), true).append('>').append(h.getName()).eTag("a").nl();
+				if (i.hasNext())
+					w.append(3, " - ").nl();
+			}
+			w.eTag(1, "p").nl();
+		}
+
+		hctx.indent = 3;
+
+		// To allow for page formatting using CSS, we encapsulate the data inside two div tags:
+		// <div class='outerdata'><div class='data' id='data'>...</div></div>
+		w.oTag(1, "div").attr("class","outerdata").append('>').nl();
+		w.oTag(2, "div").attr("class","data").attr("id", "data").append('>').nl();
+		if (isEmptyList(o))
+			w.oTag(3, "p").append('>').append("no results").eTag("p");
+		else
+			super.doSerialize(o, w, hctx);
+		w.eTag(2, "div").nl();
+		w.eTag(1, "div").nl();
+
+		w.eTag("body").nl().eTag("html").nl();
+	}
+
+	private boolean isEmptyList(Object o) {
+		if (o == null)
+			return false;
+		if (o instanceof Collection && ((Collection<?>)o).size() == 0)
+			return true;
+		if (o.getClass().isArray() && Array.getLength(o) == 0)
+			return true;
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.class
new file mode 100755
index 0000000..b9afc9c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.java
new file mode 100755
index 0000000..dd565af
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlDocSerializerProperties.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+
+/**
+ * Properties associated with the {@link HtmlDocSerializer} class.
+ * <p>
+ * 	These are typically specified via <ja>@RestResource.properties()</ja> and <ja>@RestMethod.properties()</ja> annotations,
+ * 		although they can also be set programmatically via the <code>RestREsponse.setProperty()</code> method.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	<ja>@RestResource</ja>(
+ * 		messages=<js>"nls/AddressBookResource"</js>,
+ * 		properties={
+ * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>),
+ * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_description</jsf>, value=<js>"$L{description}"</js>),
+ * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
+ * 		}
+ * 	)
+ * 	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+ * </p>
+ * <p>
+ * 	The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
+ * 	These variables are replaced at runtime based on the HTTP request locale.
+ * 	Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class HtmlDocSerializerProperties {
+
+	/**
+	 * Adds a title at the top of a page.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p>
+	 * 	The <code>AddressBookResource</code> sample class uses this property...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<ja>@RestResource</ja>(
+	 * 		messages=<js>"nls/AddressBookResource"</js>,
+	 * 		properties={
+	 * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>)
+	 * 		}
+	 * 	)
+	 * 	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+	 * </p>
+	 * <p>
+	 * 	...with this property in <code>AddressBookResource.properties</code>...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	title = <js>AddressBook sample resource</js>
+	 * </p>
+	 * <p>
+	 * 	...to produce this title on the HTML page...
+	 * </p>
+	 * 		<img class='bordered' src='doc-files/HTML_TITLE.png'>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String HTMLDOC_title = "HtmlSerializer.title";
+
+	/**
+	 * Adds a description right below the title of a page.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p>
+	 * 	The <code>AddressBookResource</code> sample class uses this property...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<ja>@RestResource</ja>(
+	 * 		messages=<js>"nls/AddressBookResource"</js>,
+	 * 		properties={
+	 * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_description</jsf>, value=<js>"description"</js>, type=<jsf>NLS</jsf>)
+	 * 		}
+	 * 	)
+	 * 	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+	 * </p>
+	 * <p>
+	 * 	...with this property in <code>AddressBookResource.properties</code>...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	description = <js>Simple address book POJO sample resource</js>
+	 * </p>
+	 * <p>
+	 * 	...to produce this description on the HTML page...
+	 * </p>
+	 * 		<img class='bordered' src='doc-files/HTML_DESCRIPTION.png'>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String HTMLDOC_description = "HtmlSerializer.description";
+
+	/**
+	 * Adds a list of hyperlinks immediately under the title and description but above the content of the page.
+	 * <p>
+	 * 	This can be used to provide convenient hyperlinks when viewing the REST interface from a browser.
+	 * <p>
+	 * 	The value is a JSON object string where the keys are anchor text and the values are URLs.
+	 * <p>
+	 * 	Relative URLs are considered relative to the servlet path.
+	 * 	For example, if the servlet path is <js>"http://localhost/myContext/myServlet"</js>, and the
+	 * 		URL is <js>"foo"</js>, the link becomes <js>"http://localhost/myContext/myServlet/foo"</js>.
+	 * 	Absolute (<js>"/myOtherContext/foo"</js>) and fully-qualified (<js>"http://localhost2/foo"</js>) URLs
+	 * 		can also be used.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p>
+	 * 	The <code>AddressBookResource</code> sample class uses this property...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<ja>@RestResource</ja>(
+	 * 		messages=<js>"nls/AddressBookResource"</js>,
+	 * 		properties={
+	 * 			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
+	 * 		}
+	 * 	)
+	 * 	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+	 * </p>
+	 * <p>
+	 * 	...to produce this list of links on the HTML page...
+	 * </p>
+	 * 		<img class='bordered' src='doc-files/HTML_LINKS.png'>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String HTMLDOC_links = "HtmlDocSerializer.links";
+
+	/**
+	 * Similar to {@link #HTMLDOC_links} except appends on to the existing list of links.
+	 */
+	public static final String HTMLDOC_addLinks = "HtmlDocSerializer.addLinks";
+
+	/**
+	 * Adds a link to the specified stylesheet URL.
+	 * <p>
+	 * 	If not specified, defaults to the built-in stylesheet located at <js>"/servletPath/style.css"</js>.
+	 * 	Note that this stylesheet is controlled by the <code><ja>@RestResource</ja>.style()</code> annotation.
+	 */
+	public static final String HTMLDOC_cssUrl = "HtmlDocSerializer.cssUrl";
+
+	/**
+	 * Imports the specified CSS page URLs into the page.
+	 */
+	public static final String HTMLDOC_cssImports = "HtmlDocSerializer.cssImports";
+
+	/**
+	 * Adds <js>"* {white-space:nowrap}"</js> to the style header to prevent word wrapping.
+	 */
+	public static final String HTMLDOC_nowrap = "HtmlDocSerializer.nowrap";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.class
new file mode 100755
index 0000000..54ac01b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.java
new file mode 100755
index 0000000..208f1bd
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlLink.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Used in conjunction with the {@link HtmlSerializer} class to define hyperlinks.
+ * <p>
+ * 	This annotation is applied to classes.
+ * <p>
+ * 	Annotation that can be used to specify that a class has a URL associated with it.
+ * <p>
+ * 	When rendered using the {@link com.ibm.juno.core.html.HtmlSerializer HtmlSerializer} class, this class will get rendered as a hyperlink like so...
+ * <p class='code'>
+ * 	<xt>&lt;a</xt> <xa>href</xa>=<xs>'hrefProperty'</xs><xt>&gt;</xt>nameProperty<xt>&lt;/a&gt;</xt>
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(TYPE)
+@Retention(RUNTIME)
+@Inherited
+public @interface HtmlLink {
+
+	/**
+	 * The bean property whose value becomes the name in the hyperlink.
+	 */
+	String nameProperty() default "";
+
+	/**
+	 * The bean property whose value becomes the url in the hyperlink.
+	 */
+	String hrefProperty() default "";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser$Tag.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser$Tag.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser$Tag.class
new file mode 100755
index 0000000..70e31b6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser$Tag.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.class
new file mode 100755
index 0000000..9c3206d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.class differ


[40/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.java
new file mode 100755
index 0000000..f06eaf5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+import java.util.*;
+
+/**
+ * Specialized certificate storage based on {@link KeyStore} for managing trusted certificates.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public class CertificateStore {
+
+	private final KeyStore keyStore;
+
+	/**
+	 * Get the underlying KeyStore.
+	 */
+	KeyStore getKeyStore() {
+		return keyStore;
+	}
+
+	/**
+	 * Helper method that creates a {@link KeyStore} by reading it from a file.
+	 */
+	static KeyStore load(File file, String password) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException {
+		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+		try {
+			InputStream input = new FileInputStream(file);
+			try {
+				ks.load(input, password == null ? null : password.toCharArray());
+			} finally {
+				input.close();
+			}
+		} catch (IOException e) {
+			// Return an empty initialized KeyStore
+			ks.load(null, null);
+		}
+		return ks;
+	}
+
+	/**
+	 * Helper method that writes a {@link KeyStore} to a file.
+	 */
+	static void store(KeyStore ks, File file, String password) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
+		OutputStream output = new FileOutputStream(file);
+		try {
+			ks.store(output, password == null ? null : password.toCharArray());
+		} finally {
+			output.close();
+		}
+	}
+
+	/**
+	 * Helper to compute a unique alias within the trust store for a specified certificate.
+	 * @param cert The certificate to compute an alias for.
+	 */
+	static String computeAlias(Certificate cert) {
+		// There appears to be no standard way to construct certificate aliases,
+		// but this class never depends on looking up a certificate by its
+		// computed alias, so just create an alias that's unique and be done.
+		return UUID.randomUUID().toString();
+	}
+
+	/**
+	 * Construct a new TrustStore initially containing no certificates.
+	 */
+	public CertificateStore() throws NoSuchAlgorithmException, CertificateException, IOException {
+		try {
+			keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+		} catch (KeyStoreException e) {
+			// If the code above caused a KeyStoreException, then the JVM classpath is probably messed up.
+			throw new RuntimeException("KeyStoreException: ["+e.getLocalizedMessage()+"]. "
+				+ "Likely cause is that the Java Cryptography Extension libraries are missing from the JRE classpath.  "
+				+ "Make sure %JAVA_HOME%/lib/ext is specified in your JVM's java.ext.dirs system property.");
+		}
+		keyStore.load(null, null);
+	}
+
+	/**
+	 * Does the trust store contain the specified certificate?
+	 */
+	public boolean containsCertificate(Certificate cert) throws KeyStoreException {
+		return (keyStore.getCertificateAlias(cert) != null);
+	}
+
+	/**
+	 * Enter the specified certificate into the trust store.
+	 */
+	public void enterCertificate(Certificate cert) throws KeyStoreException {
+		if (! containsCertificate(cert))
+			keyStore.setCertificateEntry(computeAlias(cert), cert);
+	}
+
+	/*
+	 * Helper to copy all the certificate entries, and none of the other
+	 * entries, from a {@link KeyStore} into the trust store.
+	 */
+	private void enterCertificates(KeyStore ks) throws KeyStoreException {
+		for (Enumeration<String> e = ks.aliases(); e.hasMoreElements();) {
+			String alias = e.nextElement();
+			if (ks.isCertificateEntry(alias)) {
+				Certificate cert = ks.getCertificate(alias);
+				enterCertificate(cert);
+			}
+		}
+	}
+
+	/**
+	 * Load the specified {@link KeyStore} file and copy all of the certificates
+	 * it contains into the trust store. Only certificates, and not any other
+	 * entries, are loaded.
+	 */
+	public void loadCertificates(File file, String password) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException {
+		KeyStore ks = load(file, password);
+		enterCertificates(ks);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class
new file mode 100755
index 0000000..3051b31
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.class
new file mode 100755
index 0000000..d470011
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.java
new file mode 100755
index 0000000..0ee07e8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ICertificateValidator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.security.cert.*;
+
+/**
+ * Validator of certificates presented by a server when establishing an SSL
+ * connection.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public interface ICertificateValidator {
+
+	/** Action to take for a server-supplied certificate. */
+	public enum Trust {
+
+		/** Do not accept the certificate. */
+		REJECT,
+
+		/** Accept the certificate temporarily for the current connection. */
+		ACCEPT_CONNECTION,
+
+		/** Accept the certificate temporarily for the current session. */
+		ACCEPT_SESSION,
+
+		/** Accept the certificate permanently, by saving it in the user's trust store.*/
+		ACCEPT_PERMANENT
+	}
+
+	/**
+	 * There is a problem accepting the server-supplied certificate. What should
+	 * be done?
+	 *
+	 * @param cert The problematic certificate presented by the server
+	 * @param problem The {@link CertificateException} that may indicate the specific
+	 * 	problem with the certificate, e.g. {@link CertificateExpiredException}.
+	 * @return The disposition on the certificate.
+	 */
+	Trust validate(X509Certificate cert, CertificateException problem);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.class
new file mode 100755
index 0000000..923672e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
new file mode 100755
index 0000000..47256a9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+
+/**
+ * Utility class for handling certificate stores.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public interface ITrustStoreProvider {
+
+	/**
+	 * Returns the store of all certificates trusted for the lifetime
+	 * of this trust provider
+	 */
+	CertificateStore getSessionTrustStore();
+
+	/**
+	 * Returns the store of all permanently trusted certificates.
+	 */
+	CertificateStore getRuntimeTrustStore();
+
+    /**
+     * Install a certificate in the user's application-specific on-disk key
+     * store, if possible.
+     */
+    public void installCertificate(Certificate cert) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.class
new file mode 100755
index 0000000..ad456a0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
new file mode 100755
index 0000000..a12ca43
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.security.cert.*;
+
+/**
+ * Lenient certificate validator that always accepts invalid certificates.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class LenientCertificateValidator implements ICertificateValidator {
+
+	/** Singleton */
+	public static final ICertificateValidator INSTANCE = new LenientCertificateValidator();
+
+	@Override /* ICertificateValidator */
+	public Trust validate(X509Certificate certificate, CertificateException problem) {
+		return Trust.ACCEPT_CONNECTION;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class
new file mode 100755
index 0000000..e68e4c7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
new file mode 100755
index 0000000..149302d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+
+/**
+ * Trust store provider with shared static certificate stores.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class SharedTrustStoreProvider implements ITrustStoreProvider {
+
+	// In-memory trust store of all certificates explicitly accepted by the
+	// certificate validator during this session. The validator will not be
+	// called again during this session for any of these certificates. These may
+	// include expired, not yet valid, or otherwise untrusted certificates.
+	// These are kept distinctly, rather than merged into the runtime trust
+	// store, because the base trust manager will never accept expired, etc.
+	// certificates, even if from a trusted source.
+	private static CertificateStore sessionCerts;
+
+	// In-memory trust store of all permanently trusted certificates, assembled
+	// from a number of key store files. These are provided to the base trust
+	// manager as the basis for its decision making.
+	private static CertificateStore runtimeCerts;
+
+	// Location and password of the user's private trust store for this application.
+	private static String userTrustStoreLocation;
+	private static String userTrustStorePassword;
+
+	static {
+		init();
+	}
+
+	private static final void init() {
+		try {
+			String userHome = System.getProperty("user.home");
+			String javaHome = System.getProperty("java.home");
+
+			userTrustStoreLocation = userHome + "/.jazzcerts";
+			userTrustStorePassword = "ibmrationaljazz";
+
+			sessionCerts = new CertificateStore();
+
+			runtimeCerts = new CertificateStore();
+
+			// JRE keystore override
+			String file = System.getProperty("javax.net.ssl.trustStore");
+			String password = System.getProperty("javax.net.ssl.trustStorePassword");
+			addCertificatesFromStore(runtimeCerts, file, password);
+
+			// JRE Signer CA keystore
+			file = javaHome + "/lib/security/cacerts";
+			addCertificatesFromStore(runtimeCerts, file, null);
+
+			// JRE Secure Site CA keystore
+			file =  (javaHome + "/lib/security/jssecacerts");
+			addCertificatesFromStore(runtimeCerts, file, null);
+
+			// Application-specific keystore for the current user
+			addCertificatesFromStore(runtimeCerts, userTrustStoreLocation, userTrustStorePassword);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	private static void addCertificatesFromStore(CertificateStore store, String file, String password) {
+		try {
+			File f = new File(file);
+			if (f.canRead())
+				store.loadCertificates(f, password);
+		} catch (Exception e) {
+			// Discard errors
+		}
+	}
+
+	@Override /* ITrustStoreProvider */
+	public CertificateStore getRuntimeTrustStore() {
+		return runtimeCerts;
+	}
+
+	@Override /* ITrustStoreProvider */
+	public CertificateStore getSessionTrustStore() {
+		return sessionCerts;
+	}
+
+	@Override /* ITrustStoreProvider */
+	public void installCertificate(Certificate cert) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException {
+		File  f = new File(userTrustStoreLocation);
+		KeyStore ks = CertificateStore.load(f, userTrustStorePassword);
+		ks.setCertificateEntry(CertificateStore.computeAlias(cert), cert);
+		CertificateStore.store(ks, f, userTrustStorePassword);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager$1.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager$1.class
new file mode 100755
index 0000000..1673c74
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class
new file mode 100755
index 0000000..b06f337
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
new file mode 100755
index 0000000..a7539fe
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+
+import javax.net.ssl.*;
+
+/**
+ * A trust manager that will call a registered {@link ICertificateValidator} in
+ * the event that a problematic (e.g. expired, not yet valid) or untrusted
+ * certificate is presented by a server, and react appropriately. This trust
+ * manager will rely on multiple key stores, and manage one of its own. The
+ * managed key store and the session-accepted key store are shared by all trust
+ * manager instances.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class ValidatingX509TrustManager implements X509TrustManager {
+
+	// The JRE-provided trust manager used to validate certificates presented by a server.
+	private X509TrustManager baseTrustManager;
+
+	// The registered certificate validator, may be null, called when the base
+	// trust manager rejects a certificate presented by a server.
+	private ICertificateValidator validator;
+
+	private ITrustStoreProvider trustStoreProvider;
+
+	/**
+	 * Construct a new ValidatingX509TrustManager.
+	 *
+	 * @param validator Certificate validator to consult regarding problematic
+	 * 	certificates, or <code>null</code> to always reject them.
+	 */
+	public ValidatingX509TrustManager(ICertificateValidator validator) throws KeyStoreException, NoSuchAlgorithmException {
+		this.validator = validator;
+		this.trustStoreProvider = new SharedTrustStoreProvider();
+
+		// Initialize the base X509 trust manager that will be used to evaluate
+		// certificates presented by the server against the runtime trust store.
+		TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+		factory.init(trustStoreProvider.getRuntimeTrustStore().getKeyStore());
+		TrustManager[] managers = factory.getTrustManagers();
+		for (TrustManager manager : managers) {
+			if (manager instanceof X509TrustManager) {
+				baseTrustManager = (X509TrustManager) manager; // Take the first X509TrustManager we find
+				return;
+			}
+		}
+		throw new IllegalStateException("Couldn't find JRE's X509TrustManager"); //$NON-NLS-1$
+	}
+
+	@Override /* X509TrustManager */
+	public X509Certificate[] getAcceptedIssuers() {
+		return baseTrustManager.getAcceptedIssuers();
+	}
+
+	@Override /* X509TrustManager */
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		baseTrustManager.checkClientTrusted(chain, authType);
+	}
+
+	@Override /* X509TrustManager */
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		X509Certificate cert = chain[0];
+
+		// Has the certificate been OK'd for the session?
+		try {
+			if (trustStoreProvider.getSessionTrustStore().containsCertificate(cert))
+				return;
+		} catch (KeyStoreException e) {
+			// Ignore; proceed to try base trust manager
+		}
+
+		try {
+			// Rely on the base trust manager to check the certificate against the assembled runtime key store
+			baseTrustManager.checkServerTrusted(chain, authType);
+		} catch (CertificateException certEx) {
+
+			// Done if there isn't a validator to consult
+			if (validator == null)
+				throw certEx; // Rejected!
+
+			// Ask the registered certificate validator to rule on the certificate
+			ICertificateValidator.Trust disposition = validator.validate(cert, certEx);
+			switch (disposition) {
+				case REJECT:				throw certEx;
+				case ACCEPT_CONNECTION: break;
+				case ACCEPT_SESSION:		enterCertificate(cert, false); break;
+				case ACCEPT_PERMANENT:	enterCertificate(cert, true); break;
+			}
+		}
+	}
+
+	private void enterCertificate(X509Certificate cert, boolean permanent) throws CertificateException {
+		try {
+			trustStoreProvider.getSessionTrustStore().enterCertificate(cert);
+			if (permanent)
+				trustStoreProvider.installCertificate(cert);
+		} catch (KeyStoreException e) {
+		} catch (NoSuchAlgorithmException e) {
+		} catch (IOException e) {
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.class
new file mode 100755
index 0000000..5fc0b7e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.java
new file mode 100755
index 0000000..58f3017
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/JazzRestClient.java
@@ -0,0 +1,390 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.jazz;
+
+import static org.apache.http.HttpStatus.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.auth.*;
+import org.apache.http.client.*;
+import org.apache.http.client.config.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.message.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.client.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Specialized {@link RestClient} for working with Jazz servers.
+ * <p>
+ * Provides support for BASIC, FORM, and OIDC authentication against Jazz servers and simple SSL certificate validation.
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client.jazz &gt; Jazz REST client API</a> for more information and code examples.
+ * </ul>
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class JazzRestClient extends RestClient {
+
+	private String user, pw;
+	private URI jazzUri;
+	private SSLOpts sslOpts;
+	private String cookie = null;
+
+	/**
+	 * Create a new client with no serializer or parser.
+	 *
+	 * @param jazzUrl The URL of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUrl, SSLOpts sslOpts, String user, String pw) throws IOException {
+		super();
+		this.user = user;
+		this.pw = pw;
+		if (! jazzUrl.endsWith("/"))
+			jazzUrl = jazzUrl + "/";
+		this.sslOpts = sslOpts;
+		jazzUri = URI.create(jazzUrl);
+	}
+
+	/**
+	 * Create a new client with no serializer or parser, and LAX SSL support.
+	 *
+	 * @param jazzUrl The URL of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @throws IOException
+	 */
+	public JazzRestClient(String jazzUrl, String user, String pw) throws IOException {
+		this(jazzUrl, SSLOpts.LAX, user, pw);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUri, SSLOpts sslOpts, String user, String pw, Serializer<?> s, Parser<?> p) throws IOException {
+		this(jazzUri, sslOpts, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances and LAX SSL support.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUri, String user, String pw, Serializer<?> s, Parser<?> p) throws IOException {
+		this(jazzUri, SSLOpts.LAX, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public JazzRestClient(String jazzUri, SSLOpts sslOpts, String user, String pw, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException, IOException {
+		this(jazzUri, sslOpts, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes and LAX SSL support.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public JazzRestClient(String jazzUri, String user, String pw, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException, IOException {
+		this(jazzUri, SSLOpts.LAX, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	@Override /* RestClient */
+	protected CloseableHttpClient createHttpClient() throws Exception {
+		try {
+			if (jazzUri.getScheme().equals("https"))
+				enableSSL(sslOpts);
+
+			setRedirectStrategy(new AllowAllRedirects());
+
+			// See wi 368181. The PublicSuffixDomainFilter uses a default PublicSuffixMatcher
+			// that rejects hostnames lacking a dot, such as "ccmserver", so needed
+			// cookies don't get put on outgoing requests.
+			// Here, we create a cookie spec registry with handlers that don't have a PublicSuffixMatcher.
+			if (! Boolean.getBoolean("com.ibm.team.repository.transport.client.useDefaultPublicSuffixMatcher")) { //$NON-NLS-1$
+				// use a lenient PublicSuffixDomainFilter
+				setDefaultCookieSpecRegistry(CookieSpecRegistries.createDefault(null));
+			}
+
+			// We want to use a fresh HttpClientBuilder since the default implementation
+			// uses an unshared PoolingConnectionManager, and if you close the client
+			// and create a new one, can cause a "java.lang.IllegalStateException: Connection pool shut down"
+			CloseableHttpClient client = createHttpClientBuilder().build();
+
+			// Tomcat will respond with SC_BAD_REQUEST (or SC_REQUEST_TIMEOUT?) when the
+			// j_security_check URL is visited before an authenticated URL has been visited.
+			visitAuthenticatedURL(client);
+
+			// Authenticate against the server.
+			String authMethod = determineAuthMethod(client);
+			if (authMethod.equals("FORM")) {
+				formBasedAuthenticate(client);
+				visitAuthenticatedURL(client);
+			} else if (authMethod.equals("BASIC")) {
+				AuthScope scope = new AuthScope(jazzUri.getHost(), jazzUri.getPort());
+				Credentials up = new UsernamePasswordCredentials(user, pw);
+				CredentialsProvider p = new BasicCredentialsProvider();
+				p.setCredentials(scope, up);
+				setDefaultCredentialsProvider(p);
+				client.close();
+				client = getHttpClientBuilder().build();
+			} else if (authMethod.equals("OIDC")) {
+				oidcAuthenticate(client);
+				client.close();
+				client = getHttpClientBuilder().build();
+			}
+
+			return client;
+		} catch (Exception e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@Override /* RestClient */
+	protected HttpClientBuilder createHttpClientBuilder() {
+		HttpClientBuilder b = super.createHttpClientBuilder();
+
+		// See wi 368181. The PublicSuffixDomainFilter uses a default PublicSuffixMatcher
+		// that rejects hostnames lacking a dot, such as "ccmserver", so needed
+		// cookies don't get put on outgoing requests.
+		// Here, we create a cookie spec registry with handlers that don't have a PublicSuffixMatcher.
+		if (! Boolean.getBoolean("com.ibm.team.repository.transport.client.useDefaultPublicSuffixMatcher"))
+			b.setDefaultCookieSpecRegistry(CookieSpecRegistries.createDefault(null));
+
+		return b;
+	}
+
+
+	/**
+	 * Performs form-based authentication against the Jazz server.
+	 */
+	private void formBasedAuthenticate(HttpClient client) throws IOException {
+
+		URI uri2 = jazzUri.resolve("j_security_check");
+		HttpPost request = new HttpPost(uri2);
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+		 // Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.
+		request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
+
+		NameValuePairs params = new NameValuePairs()
+			.append(new BasicNameValuePair("j_username", user))
+			.append(new BasicNameValuePair("j_password", pw));
+		request.setEntity(new UrlEncodedFormEntity(params));
+
+		HttpResponse response = client.execute(request);
+		try {
+			int rc = response.getStatusLine().getStatusCode();
+
+			Header authMsg = response.getFirstHeader("X-com-ibm-team-repository-web-auth-msg");
+			if (authMsg != null)
+				throw new IOException(authMsg.getValue());
+
+			// The form auth request should always respond with a 200 ok or 302 redirect code
+			if (rc == SC_MOVED_TEMPORARILY) {
+				if (response.getFirstHeader("Location").getValue().matches("^.*/auth/authfailed.*$"))
+					throw new IOException("Invalid credentials.");
+			} else if (rc != SC_OK) {
+				throw new IOException("Unexpected HTTP status: " + rc);
+			}
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	private void oidcAuthenticate(HttpClient client) throws IOException {
+
+		HttpGet request = new HttpGet(jazzUri);
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+
+		 // Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.
+		request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
+
+		HttpResponse response = client.execute(request);
+		try {
+			int code = response.getStatusLine().getStatusCode();
+
+			// Already authenticated
+			if (code == SC_OK)
+				return;
+
+			if (code != SC_UNAUTHORIZED)
+				throw new RestCallException("Unexpected response during OIDC authentication: " + response.getStatusLine());
+
+			//'x-jsa-authorization-redirect'
+			String redirectUri = getHeader(response, "X-JSA-AUTHORIZATION-REDIRECT");
+
+			if (redirectUri == null)
+				throw new RestCallException("Excpected a redirect URI during OIDC authentication: " + response.getStatusLine());
+
+			// Handle Bearer Challenge
+			HttpGet method = new HttpGet(redirectUri + "&prompt=none");
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 2: " + response.getStatusLine());
+
+			String loginRequired = getHeader(response, "X-JSA-LOGIN-REQUIRED");
+
+			if (! "true".equals(loginRequired))
+				throw new RestCallException("X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: " + response.getStatusLine());
+
+			method = new HttpGet(redirectUri + "&prompt=none");
+
+			addDefaultOidcHeaders(method);
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 3: " + response.getStatusLine());
+
+			// Handle JAS Challenge
+			method = new HttpGet(redirectUri);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 4: " + response.getStatusLine());
+
+			cookie = getHeader(response, "Set-Cookie");
+
+			Header[] defaultHeaders = new Header[] {
+				new BasicHeader("User-Agent", "Jazz Native Client"),
+				new BasicHeader("X-com-ibm-team-configuration-versions", "com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"),
+				new BasicHeader("Accept", "text/json"),
+				new BasicHeader("Authorization", "Basic " + StringUtils.base64EncodeToString(this.user + ":" + this.pw)),
+				new BasicHeader("Cookie", cookie)
+			};
+
+			setDefaultHeaders(Arrays.asList(defaultHeaders));
+
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	/*
+	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
+	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
+	 * otherwise tomcat will not consider the session authenticated
+	 */
+	private int visitAuthenticatedURL(HttpClient httpClient) throws IOException {
+		HttpGet authenticatedURL = new HttpGet(jazzUri.resolve("authenticated/identity"));
+		HttpResponse response = httpClient.execute(authenticatedURL);
+		try {
+			return response.getStatusLine().getStatusCode();
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	/*
+	 * @return Returns "FORM" for form-based authenication, "BASIC" for basic auth, "OIDC" for OIDC.  Never <code>null</code>.
+	 */
+	private String determineAuthMethod(HttpClient client) throws IOException {
+
+		HttpGet request = new HttpGet(jazzUri.resolve("authenticated/identity"));
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+
+		// if the FORM_AUTH_URI path exists, then we know we are using FORM auth
+		HttpResponse response = client.execute(request);
+		try {				//'x-jsa-authorization-redirect'
+			Header redirectUri = response.getFirstHeader("X-JSA-AUTHORIZATION-REDIRECT");
+			if (redirectUri != null)
+				return "OIDC";
+
+			int rc = response.getStatusLine().getStatusCode();
+			// Tomcat and Jetty return a status code 200 if the server is using FORM auth
+			if (rc == SC_OK)
+				return "FORM";
+			else if (rc == SC_MOVED_TEMPORARILY && response.getFirstHeader("Location").getValue().matches("^.*(/auth/authrequired|/authenticated/identity).*$"))
+				return "FORM";
+			return "BASIC";
+
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	private String getHeader(HttpResponse response, String key) {
+		Header h = response.getFirstHeader(key);
+		return (h == null ? null : h.getValue());
+	}
+
+	private void addDefaultOidcHeaders(HttpRequestBase method) {
+		method.addHeader("User-Agent", "Jazz Native Client");
+		method.addHeader("X-com-ibm-team-configuration-versions", "com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0");
+		method.addHeader("Accept", "text/json");
+
+		if (cookie != null) {
+			method.addHeader("Authorization", "Basic " + StringUtils.base64EncodeToString(user + ":" + pw));
+			method.addHeader("Cookie", cookie);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/package.html b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/package.html
new file mode 100755
index 0000000..fce9248
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/jazz/package.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Jazz REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>Jazz REST client API</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Jazz REST client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides a default REST client implementation for working with Jazz servers. 
+		The client automatically detects and handles BASIC and FORM authentication and basic certificate authentication.
+	</p>
+	<p>
+		The following code shows the Jazz REST client being used for querying and creating server messages on 
+			a Jazz server.  The <code>ServerMessage</code> and <code>CreateServerMessage</code> classes
+			are nothing more than simple beans that get serialized over the connection and reconstituted on 
+			the server.
+	</p>
+	<p class='bcode'>
+	System.<jsf>out</jsf>.println(<js>"Adding sample messages"</js>);
+
+	DateFormat df = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
+	String url = <js>"https://localhost:9443/jazz"</js>;
+	String sms = url + <js>"/serverMessages"</js>;
+	CreateServerMessage m;
+	ServerMessage m2;
+	String s1;
+	ServerMessage[] messages;
+	
+	<jc>// Serializer for debug messages.</jc>
+	WriterSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Create clients to handle JSON and XML requests and responses.</jc>
+	RestClient jsonClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>)
+		.setSerializer(JsonSerializer.<jk>class</jk>)
+		.setParser(<jk>new</jk> JsonParser().addFilters(DateFilter.<jsf>ISO8601DTZ</jsf>.<jk>class</jk>));
+	
+	RestClient xmlClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>, XmlSerializer.<jk>class</jk>, XmlParser.<jk>class</jk>);
+	
+	<jc>// Delete any existing messages.</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	
+	<jk>for</jk> (ServerMessage message : messages) {
+		<jk>int</jk> rc = jsonClient
+			.doDelete(message.getUri())
+			.execute();
+		System.<jsf>out</jsf>.println(rc);	<jc>// Prints 200.</jc>
+	}
+	
+	<jc>// Create an active server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #1"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+	
+	<jc>// POST the message, get response as string.</jc>
+	s1 = jsonClient
+		.doPost(sms, m)
+		.getResponseAsString(); 
+	System.<jsf>out</jsf>.println(<js>"TEST1: response="</js> + s1);
+
+	<jc>// POST another message, get response as ServerMessage</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #2"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST2: response="</js> + serializer.serialize(m2));
+	
+	<jc>// Create a future server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST3: response="</js> + serializer.serialize(m2));
+	System.<jsf>out</jsf>.println(<js>"TEST3: id="</js> + m2.getItemId().getUuidValue());
+
+	<jc>// Create a future server message using XML on both request and response.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #4"</js>,
+		<js>"subTypeFoo"</js>,                                  
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	s1 = xmlClient
+		.doPost(sms, m)
+		.getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST4: response="</js> + s1);
+
+	<jc>// Get all the messages</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	System.<jsf>out</jsf>.println(<js>"TEST5: response="</js> + serializer.serialize(messages)); 
+
+	<jc>// Get the first ID</jc>
+	URI firstMessageUrl = messages[0].getUri();
+	
+	System.<jsf>out</jsf>.println(<js>"firstMessageUrl=["</js>+firstMessageUrl+<js>"]"</js>);
+	
+	<jc>// Get the Date of the first ID.</jc>
+	Date startDate = jsonClient
+		.doGet(firstMessageUrl + <js>"/startDate"</js>)
+		.getResponse(Date.<jk>class</jk>);  
+	System.<jsf>out</jsf>.println(<js>"TEST5: response.startDate="</js>+startDate);
+	
+	<jc>// Change the start and end dates on first message</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3 overwritten"</js>,
+		<js>"subTypeFooBar"</js>,
+		df.parse(<js>"2023-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2024-01-01T12:34:56EST"</js>));
+	s1 = jsonClient.doPut(firstMessageUrl, m).getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST6: response="</js>+s1);
+	</p>
+</div>
+</body>
+</html>
\ No newline at end of file



[37/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1Map.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1Map.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1Map.class
new file mode 100755
index 0000000..47fa3fa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1Map.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects.class
new file mode 100755
index 0000000..1ff5d0c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps$TestEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps$TestEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps$TestEnum.class
new file mode 100755
index 0000000..1dc62b2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps$TestEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps.class
new file mode 100755
index 0000000..45caa88
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripMaps.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A.class
new file mode 100755
index 0000000..414e94d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A1.class
new file mode 100755
index 0000000..3f556a6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A2.class
new file mode 100755
index 0000000..c67a255
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A3.class
new file mode 100755
index 0000000..64300d1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A4.class
new file mode 100755
index 0000000..ba22465
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$A4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B.class
new file mode 100755
index 0000000..cf292a9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B1.class
new file mode 100755
index 0000000..16093c4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B2.class
new file mode 100755
index 0000000..f5e9a45
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C.class
new file mode 100755
index 0000000..d7945de
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C1.class
new file mode 100755
index 0000000..54876d1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C2.class
new file mode 100755
index 0000000..0e25914
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C3.class
new file mode 100755
index 0000000..8fee79b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C4.class
new file mode 100755
index 0000000..7a3350c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings$C4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings.class
new file mode 100755
index 0000000..58df9d2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsAsStrings.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A.class
new file mode 100755
index 0000000..ebc4821
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A2.class
new file mode 100755
index 0000000..53474a6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B.class
new file mode 100755
index 0000000..0286602
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B2.class
new file mode 100755
index 0000000..c4f5208
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods.class
new file mode 100755
index 0000000..b81cd8a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripObjectsWithSpecialMethods.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitiveObjectBeans.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitiveObjectBeans.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitiveObjectBeans.class
new file mode 100755
index 0000000..32467fb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitiveObjectBeans.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$1.class
new file mode 100755
index 0000000..dfa40a7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$1.class
new file mode 100755
index 0000000..590a5cc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$2.class
new file mode 100755
index 0000000..d8ae584
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$3.class
new file mode 100755
index 0000000..333c0c8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$4.class
new file mode 100755
index 0000000..1e4bcd2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$5.class
new file mode 100755
index 0000000..821793f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$6.class
new file mode 100755
index 0000000..c3bb179
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$7.class
new file mode 100755
index 0000000..4487522
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$8.class
new file mode 100755
index 0000000..e481b9d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean.class
new file mode 100755
index 0000000..93b9a85
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans$PrimitivesBean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans.class
new file mode 100755
index 0000000..e9ad0b3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripPrimitivesBeans.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$A.class
new file mode 100755
index 0000000..e81f6ec
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$B.class
new file mode 100755
index 0000000..33f5282
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans.class
new file mode 100755
index 0000000..b78462c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripReadOnlyBeans.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripSimpleObjects.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripSimpleObjects.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripSimpleObjects.class
new file mode 100755
index 0000000..ea7093b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripSimpleObjects.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$1.class
new file mode 100755
index 0000000..fabcf42
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$2.class
new file mode 100755
index 0000000..a9c8ddd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$A.class
new file mode 100755
index 0000000..143d542
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps.class
new file mode 100755
index 0000000..9016e74
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripToObjectMaps.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest$Flags.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest$Flags.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest$Flags.class
new file mode 100755
index 0000000..a067e1a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest$Flags.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest.class
new file mode 100755
index 0000000..3af5db1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/RoundTripTest.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv$A.class
new file mode 100755
index 0000000..6db04ef
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv.class
new file mode 100755
index 0000000..f3b6b91
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/csv/CT_Csv.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/CT_Atom.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/CT_Atom.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/CT_Atom.class
new file mode 100755
index 0000000..9a42ce8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/CT_Atom.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test1.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test1.xml b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test1.xml
new file mode 100755
index 0000000..ec36f90
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test1.xml
@@ -0,0 +1,46 @@
+<feed>
+	<id>
+		tag:example.org,2003:3
+	</id>
+	<link href='http://example.org/' rel='alternate' type='text/html' hreflang='en'/>
+	<link href='http://example.org/feed.atom' rel='self' type='application/atom+xml'/>
+	<rights>
+		Copyright (c) 2003, Mark Pilgrim
+	</rights>
+	<title type='text'>
+		dive into mark
+	</title>
+	<updated>2005-07-31T12:29:29Z</updated>
+	<generator uri='http://www.example.com/' version='1.0'>
+		Example Toolkit
+	</generator>
+	<subtitle type='html'>
+		A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless
+	</subtitle>
+	<entry>
+		<author>
+			<name>Mark Pilgrim</name>
+			<uri>http://example.org/</uri>
+			<email>f8dy@example.com</email>
+		</author>
+		<contributor>
+			<name>Sam Ruby</name>
+		</contributor>
+		<contributor>
+			<name>Joe Gregorio</name>
+		</contributor>
+		<id>
+			tag:example.org,2003:3.2397
+		</id>
+		<link href='http://example.org/2005/04/02/atom' rel='alternate' type='text/html'/>
+		<link href='http://example.org/audio/ph34r_my_podcast.mp3' rel='enclosure' type='audio/mpeg' length='1337'/>
+		<title>
+			Atom draft-07 snapshot
+		</title>
+		<updated>2005-07-31T12:29:29Z</updated>
+		<content base='http://diveintomark.org/' lang='en' type='xhtml'>
+			<div xmlns="http://www.w3.org/1999/xhtml"><p><i>[Update: The Atom draft is finished.]</i></p></div>
+		</content>
+		<published>2003-12-13T08:29:29-04:00</published>
+	</entry>
+</feed>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test2.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test2.xml b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test2.xml
new file mode 100755
index 0000000..28a6bb0
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test2.xml
@@ -0,0 +1,46 @@
+<atom:feed xmlns='http://www.ibm.com/2013/Juno' xmlns:atom='http://www.w3.org/2005/Atom/' xmlns:xml='http://www.w3.org/XML/1998/namespace' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
+	<atom:id>
+		tag:example.org,2003:3
+	</atom:id>
+	<atom:link href='http://example.org/' rel='alternate' type='text/html' hreflang='en'/>
+	<atom:link href='http://example.org/feed.atom' rel='self' type='application/atom+xml'/>
+	<atom:rights>
+		Copyright (c) 2003, Mark Pilgrim
+	</atom:rights>
+	<atom:title type='text'>
+		dive into mark
+	</atom:title>
+	<atom:updated>2005-07-31T12:29:29Z</atom:updated>
+	<atom:generator uri='http://www.example.com/' version='1.0'>
+		Example Toolkit
+	</atom:generator>
+	<atom:subtitle type='html'>
+		A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless
+	</atom:subtitle>
+	<atom:entry>
+		<atom:author>
+			<atom:name>Mark Pilgrim</atom:name>
+			<atom:uri>http://example.org/</atom:uri>
+			<atom:email>f8dy@example.com</atom:email>
+		</atom:author>
+		<atom:contributor>
+			<atom:name>Sam Ruby</atom:name>
+		</atom:contributor>
+		<atom:contributor>
+			<atom:name>Joe Gregorio</atom:name>
+		</atom:contributor>
+		<atom:id>
+			tag:example.org,2003:3.2397
+		</atom:id>
+		<atom:link href='http://example.org/2005/04/02/atom' rel='alternate' type='text/html'/>
+		<atom:link href='http://example.org/audio/ph34r_my_podcast.mp3' rel='enclosure' type='audio/mpeg' length='1337'/>
+		<atom:title>
+			Atom draft-07 snapshot
+		</atom:title>
+		<atom:updated>2005-07-31T12:29:29Z</atom:updated>
+		<atom:content xml:base='http://diveintomark.org/' xml:lang='en' type='xhtml'>
+			<div xmlns="http://www.w3.org/1999/xhtml"><p><i>[Update: The Atom draft is finished.]</i></p></div>
+		</atom:content>
+		<atom:published>2003-12-13T08:29:29-04:00</atom:published>
+	</atom:entry>
+</atom:feed>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test3.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test3.xml b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test3.xml
new file mode 100755
index 0000000..ab8e957
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/atom/test3.xml
@@ -0,0 +1,46 @@
+<feed xmlns='http://www.w3.org/2005/Atom/' xmlns:xml='http://www.w3.org/XML/1998/namespace' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
+	<id>
+		tag:example.org,2003:3
+	</id>
+	<link href='http://example.org/' rel='alternate' type='text/html' hreflang='en'/>
+	<link href='http://example.org/feed.atom' rel='self' type='application/atom+xml'/>
+	<rights>
+		Copyright (c) 2003, Mark Pilgrim
+	</rights>
+	<title type='text'>
+		dive into mark
+	</title>
+	<updated>2005-07-31T12:29:29Z</updated>
+	<generator uri='http://www.example.com/' version='1.0'>
+		Example Toolkit
+	</generator>
+	<subtitle type='html'>
+		A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless
+	</subtitle>
+	<entry>
+		<author>
+			<name>Mark Pilgrim</name>
+			<uri>http://example.org/</uri>
+			<email>f8dy@example.com</email>
+		</author>
+		<contributor>
+			<name>Sam Ruby</name>
+		</contributor>
+		<contributor>
+			<name>Joe Gregorio</name>
+		</contributor>
+		<id>
+			tag:example.org,2003:3.2397
+		</id>
+		<link href='http://example.org/2005/04/02/atom' rel='alternate' type='text/html'/>
+		<link href='http://example.org/audio/ph34r_my_podcast.mp3' rel='enclosure' type='audio/mpeg' length='1337'/>
+		<title>
+			Atom draft-07 snapshot
+		</title>
+		<updated>2005-07-31T12:29:29Z</updated>
+		<content xml:base='http://diveintomark.org/' xml:lang='en' type='xhtml'>
+			<div xmlns="http://www.w3.org/1999/xhtml"><p><i>[Update: The Atom draft is finished.]</i></p></div>
+		</content>
+		<published>2003-12-13T08:29:29-04:00</published>
+	</entry>
+</feed>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml$Item.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml$Item.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml$Item.class
new file mode 100755
index 0000000..c139efb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml$Item.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml.class
new file mode 100755
index 0000000..482c9a3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/cognos/CT_CognosXml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/CT_JsonSchema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/CT_JsonSchema.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/CT_JsonSchema.class
new file mode 100755
index 0000000..aacbab7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/CT_JsonSchema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test1.json
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test1.json b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test1.json
new file mode 100755
index 0000000..96731c3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test1.json
@@ -0,0 +1,77 @@
+{
+	id: 'http://id', 
+	'$schema': 'http://schemaVersionUri', 
+	title: 'title', 
+	description: 'description', 
+	type: 'number', 
+	definitions: {
+		definition: {
+			'$ref': 'http://definition'
+		}
+	}, 
+	properties: {
+		property: {
+			type: 'number'
+		}
+	}, 
+	patternProperties: {
+		'/pattern/': {
+			type: 'number'
+		}
+	}, 
+	dependencies: {
+		dependency: {
+			'$ref': 'http://dependency'
+		}
+	}, 
+	items: [
+		{
+			type: 'number'
+		}
+	], 
+	multipleOf: 1, 
+	maximum: 2, 
+	exclusiveMaximum: true, 
+	minimum: 3, 
+	exclusiveMinimum: true, 
+	maxLength: 4, 
+	minLength: 5, 
+	pattern: '/pattern/', 
+	additionalItems: [
+		{
+			type: 'number'
+		}
+	], 
+	maxItems: 6, 
+	minItems: 7, 
+	uniqueItems: true, 
+	maxProperties: 8, 
+	minProperties: 9, 
+	required: [
+		'required'
+	], 
+	additionalProperties: {
+		'$ref': 'http://additionalProperty'
+	}, 
+	'enum': [
+		'enum'
+	], 
+	allOf: [
+		{
+			'$ref': 'http://allOf'
+		}
+	], 
+	anyOf: [
+		{
+			'$ref': 'http://anyOf'
+		}
+	], 
+	oneOf: [
+		{
+			'$ref': 'http://oneOf'
+		}
+	], 
+	not: {
+		'$ref': 'http://not'
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test2.json
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test2.json b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test2.json
new file mode 100755
index 0000000..6558630
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/dto/jsonschema/test2.json
@@ -0,0 +1,20 @@
+{
+	id: 'http://id', 
+	'$schema': 'http://schemaVersionUri', 
+	type: [
+		'string', 
+		'number'
+	], 
+	definitions: {
+		definition: {
+			id: 'http://definition'
+		}
+	}, 
+	items: [
+		{
+			'$ref': 'http://items'
+		}
+	], 
+	additionalItems: true, 
+	additionalProperties: true
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A1.class
new file mode 100755
index 0000000..9ae50f9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A2.class
new file mode 100755
index 0000000..0984555
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A3.class
new file mode 100755
index 0000000..02d27b0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B1.class
new file mode 100755
index 0000000..f639c4c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B2.class
new file mode 100755
index 0000000..0a1da21
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C1.class
new file mode 100755
index 0000000..b3cf04f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C2.class
new file mode 100755
index 0000000..ab75a88
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C3.class
new file mode 100755
index 0000000..a2b10e4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$C3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D1.class
new file mode 100755
index 0000000..b07ac70
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D2.class
new file mode 100755
index 0000000..3dcad1e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D3.class
new file mode 100755
index 0000000..158b56d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$D3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E1.class
new file mode 100755
index 0000000..d09d7c4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E2.class
new file mode 100755
index 0000000..d5dc8c4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E3.class
new file mode 100755
index 0000000..b914073
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$E3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F1.class
new file mode 100755
index 0000000..e7b717c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F2.class
new file mode 100755
index 0000000..4327c10
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F3.class
new file mode 100755
index 0000000..9c1d8a9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$F3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$Test2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$Test2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$Test2.class
new file mode 100755
index 0000000..26d8a26
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter$Test2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter.class
new file mode 100755
index 0000000..5c548ff
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$A.class
new file mode 100755
index 0000000..0854c8e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B.class
new file mode 100755
index 0000000..4e2a038
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1.class
new file mode 100755
index 0000000..db9c2d0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1Filter.class
new file mode 100755
index 0000000..e086528
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B1Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2.class
new file mode 100755
index 0000000..bdf8d72
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2Filter.class
new file mode 100755
index 0000000..2957afc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap$B2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap.class
new file mode 100755
index 0000000..aca302c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_BeanMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$1.class
new file mode 100755
index 0000000..69df6f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$2.class
new file mode 100755
index 0000000..5d424cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$1.class
new file mode 100755
index 0000000..e3522dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$2.class
new file mode 100755
index 0000000..c6e21cd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$3.class
new file mode 100755
index 0000000..3bfae3e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$4.class
new file mode 100755
index 0000000..24c00d2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A.class
new file mode 100755
index 0000000..1ca026e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$1.class
new file mode 100755
index 0000000..b345398
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$2.class
new file mode 100755
index 0000000..2cca956
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B.class
new file mode 100755
index 0000000..92f688b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter.class
new file mode 100755
index 0000000..6a03bed
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ByteArrayBase64Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter$A.class
new file mode 100755
index 0000000..e4f4328
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter.class
new file mode 100755
index 0000000..ba208cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_CalendarFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter$A.class
new file mode 100755
index 0000000..756b002
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter.class
new file mode 100755
index 0000000..666de55
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_DateFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_EnumerationFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_EnumerationFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_EnumerationFilter.class
new file mode 100755
index 0000000..1bbc58b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_EnumerationFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_IteratorFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_IteratorFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_IteratorFilter.class
new file mode 100755
index 0000000..1cc5e64
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_IteratorFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ReaderFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ReaderFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ReaderFilter.class
new file mode 100755
index 0000000..199f29d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/filters/CT_ReaderFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$A.class
new file mode 100755
index 0000000..15764ea
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B$1.class
new file mode 100755
index 0000000..7cc7a00
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B.class
new file mode 100755
index 0000000..e5aa5f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C$1.class
new file mode 100755
index 0000000..4c7a2d6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C.class
new file mode 100755
index 0000000..e2808b6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$D.class
new file mode 100755
index 0000000..707d73d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$1.class
new file mode 100755
index 0000000..40ec24d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$2.class
new file mode 100755
index 0000000..ddc9998
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$3.class
new file mode 100755
index 0000000..04b5e7a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1.class
new file mode 100755
index 0000000..97fbc08
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E2.class
new file mode 100755
index 0000000..0496f3b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$F.class
new file mode 100755
index 0000000..033112e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$G.class
new file mode 100755
index 0000000..8d1ea65
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$J.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$J.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$J.class
new file mode 100755
index 0000000..4c0423e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$J.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R1.class
new file mode 100755
index 0000000..aacec87
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R2.class
new file mode 100755
index 0000000..4c7c7ad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R3.class
new file mode 100755
index 0000000..281ba52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common.class
new file mode 100755
index 0000000..38e9940
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Common.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$1.class
new file mode 100755
index 0000000..a4eeae4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A1.class
new file mode 100755
index 0000000..1788a35
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A2.class
new file mode 100755
index 0000000..80d09fe
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A3.class
new file mode 100755
index 0000000..a85e295
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$B.class
new file mode 100755
index 0000000..2e392ef
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$C.class
new file mode 100755
index 0000000..446aaa3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser.class
new file mode 100755
index 0000000..1a968f8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_CommonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A1.class
new file mode 100755
index 0000000..172ad70
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A2.class
new file mode 100755
index 0000000..387e622
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A3.class
new file mode 100755
index 0000000..962ee11
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4.class
new file mode 100755
index 0000000..d8d0dad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4Filter.class
new file mode 100755
index 0000000..cacbb6a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A4Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5.class
new file mode 100755
index 0000000..845987d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5Filter.class
new file mode 100755
index 0000000..c97a982
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$A5Filter.class differ



[20/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.java
new file mode 100755
index 0000000..a03c32c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJOs to HTTP responses as stripped HTML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/html+stripped</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/html</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Produces the same output as {@link HtmlDocSerializer}, but without the header and body tags and page title and description.
+ * 	Used primarily for JUnit testing the {@link HtmlDocSerializer} class.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces(value="text/html+stripped",contentType="text/html")
+public class HtmlStrippedDocSerializer extends HtmlSerializer {
+
+	//---------------------------------------------------------------------------
+	// Overridden methods
+	//---------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		HtmlSerializerContext hctx = (HtmlSerializerContext)ctx;
+		HtmlSerializerWriter w = hctx.getWriter(out);
+		if (o == null
+			|| (o instanceof Collection && ((Collection<?>)o).size() == 0)
+			|| (o.getClass().isArray() && Array.getLength(o) == 0))
+			w.sTag(1, "p").append("No Results").eTag("p").nl();
+		else
+			super.doSerialize(o, w, hctx);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.class
new file mode 100755
index 0000000..3d86ffb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.java
new file mode 100755
index 0000000..5c10459
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/SimpleHtmlWriter.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import java.io.*;
+
+/**
+ * Utility class for creating custom HTML.
+ * <p>
+ * Example:
+ * <p class='bcode'>
+ * 	String table = <jk>new</jk> SimpleHtmlWriter().sTag(<js>"table"</js>).sTag(<js>"tr"</js>).sTag(<js>"td"</js>).append(<js>"hello"</js>).eTag(<js>"td"</js>).eTag(<js>"tr"</js>).eTag(<js>"table"</js>).toString();
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SimpleHtmlWriter extends HtmlSerializerWriter {
+
+	/**
+	 * Constructor.
+	 */
+	public SimpleHtmlWriter() {
+		super(new StringWriter(), true, '\'', null, null);
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return out.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.class
new file mode 100755
index 0000000..0f0e970
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.java
new file mode 100755
index 0000000..4d9829b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/Html.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.html.*;
+
+/**
+ * Annotation that can be applied to classes, fields, and methods to tweak how
+ * they are handled by {@link HtmlSerializer}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({TYPE,FIELD,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface Html {
+
+	/**
+	 * Treat as XML.
+	 * Useful when creating beans that model HTML elements.
+	 */
+	boolean asXml() default false;
+
+	/**
+	 * Treat as plain text.
+	 * Object is serialized to a String using the <code>toString()</code> method and written directly to output.
+	 * Useful when you want to serialize custom HTML.
+	 */
+	boolean asPlainText() default false;
+
+	/**
+	 * When <jk>true</jk>, collections of beans should be rendered as trees instead of tables.
+	 * Default is <jk>false</jk>.
+	 */
+	boolean noTables() default false;
+
+	/**
+	 * When <jk>true</jk>, don't add headers to tables.
+	 * Default is <jk>false</jk>.
+	 */
+	boolean noTableHeaders() default false;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/package.html
new file mode 100755
index 0000000..082a694
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>HTML annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_DESCRIPTION.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_DESCRIPTION.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_DESCRIPTION.png
new file mode 100755
index 0000000..621721b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_DESCRIPTION.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_LINKS.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_LINKS.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_LINKS.png
new file mode 100755
index 0000000..3c07fe6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_LINKS.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_TITLE.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_TITLE.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_TITLE.png
new file mode 100755
index 0000000..5365735
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/doc-files/HTML_TITLE.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.class
new file mode 100755
index 0000000..4a7103e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.java
new file mode 100755
index 0000000..986e4e9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/HtmlElement.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.html.dto;
+
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.html.annotation.*;
+
+/**
+ * Superclass for all HTML elements.
+ * <p>
+ * These are beans that when serialized using {@link HtmlSerializer} generate
+ * valid XHTML elements.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Html(asXml=true)
+public abstract class HtmlElement {}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.class
new file mode 100755
index 0000000..70226c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.java
new file mode 100755
index 0000000..f8e1672
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/Img.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.html.dto;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an HTML IMG element.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="img")
+public class Img extends HtmlElement {
+
+	/** <code>src</code> attribute */
+	@Xml(format=ATTR)
+	public String src;
+
+	/**
+	 * Constructor
+	 *
+	 * @param src <code>src</code> attribute
+	 */
+	public Img(String src) {
+		this.src = src;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/package.html
new file mode 100755
index 0000000..d3e9ed5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/dto/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>HTML Data Transfer Objects</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/package.html
new file mode 100755
index 0000000..b06a2fc
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/package.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>HTML serialization and parsing support</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#HtmlSerializer'>HTML serialization support</a></p> 
+	<li><p><a class='doclink' href='#HtmlParser'>HTML parsing support</a></p> 
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="HtmlSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - HTML serialization support</h2>
+<div class='topic'>
+	TODO
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="HtmlParser"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - HTML parsing support</h2>
+<div class='topic'>
+	TODO
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.class
new file mode 100755
index 0000000..fbb891c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.java
new file mode 100755
index 0000000..4280133
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFile.java
@@ -0,0 +1,743 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import static com.ibm.juno.core.ini.ConfigFileFormat.*;
+import static com.ibm.juno.core.ini.ConfigUtils.*;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+import static java.lang.reflect.Modifier.*;
+
+import java.beans.*;
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Implements the API for accessing the contents of a config file.
+ * <p>
+ * Refer to {@link com.ibm.juno.core.ini} for more information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class ConfigFile implements Map<String,Section> {
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Retrieves an entry value from this config file.
+	 *
+	 * @param sectionName - The section name.  Must not be <jk>null</jk>.
+	 * @param sectionKey - The section key.  Must not be <jk>null</jk>.
+	 * @return The value, or the default value if the section or value doesn't exist.
+	 */
+	public abstract String get(String sectionName, String sectionKey);
+
+	/**
+	 * Sets an entry value in this config file.
+	 *
+	 * @param sectionName - The section name.  Must not be <jk>null</jk>.
+	 * @param sectionKey - The section key.  Must not be <jk>null</jk>.
+	 * @param value The new value.
+	 * @param encoded
+	 * @return The previous value, or <jk>null</jk> if the section or key did not previously exist.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract String put(String sectionName, String sectionKey, Object value, boolean encoded);
+
+	/**
+	 * Removes an antry from this config file.
+	 *
+	 * @param sectionName - The section name.  Must not be <jk>null</jk>.
+	 * @param sectionKey - The section key.  Must not be <jk>null</jk>.
+	 * @return The previous value, or <jk>null</jk> if the section or key did not previously exist.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract String remove(String sectionName, String sectionKey);
+
+	/**
+	 * Returns the current set of keys in the specified section.
+	 *
+	 * @param sectionName - The section name.  Must not be <jk>null</jk>.
+	 * @return The list of keys in the specified section, or <jk>null</jk> if section does not exist.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract Set<String> getSectionKeys(String sectionName);
+
+	/**
+	 * Reloads ths config file object from the persisted file contents if the modified timestamp on the file has changed.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If file could not be read, or file is not associated with this object.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile loadIfModified() throws IOException;
+
+	/**
+	 * Loads ths config file object from the persisted file contents.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If file could not be read, or file is not associated with this object.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile load() throws IOException;
+
+	/**
+	 * Loads ths config file object from the specified reader.
+	 *
+	 * @param r The reader to read from.
+	 * @return This object (for method chaining).
+	 * @throws IOException If file could not be read, or file is not associated with this object.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile load(Reader r) throws IOException;
+
+	/**
+	 * Adds arbitrary lines to the specified config file section.
+	 * <p>
+	 * The lines can be any of the following....
+	 * <ul>
+	 * 	<li><js>"# comment"</js> - A comment line.
+	 * 	<li><js>"key=val"</js> - A key/value pair (equivalent to calling {@link #put(String,Object)}.
+	 * 	<li><js>" foobar "</js> - Anything else (interpreted as a comment).
+	 * </ul>
+	 * <p>
+	 * If the section does not exist, it will automatically be created.
+	 *
+	 * @param section The name of the section to add lines to, or <jk>null</jk> to add to the beginning unnamed section.
+	 * @param lines The lines to add to the section.
+	 * @return This object (for method chaining).
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile addLines(String section, String...lines);
+
+	/**
+	 * Adds header comments to the specified section.
+	 * <p>
+	 * Header comments are defined as lines that start with <jk>"#"</jk> immediately preceding a section header <jk>"[section]"</jk>.
+	 * These are handled as part of the section itself instead of being interpreted as comments in the previous section.
+	 * <p>
+	 * Header comments can be of the following formats...
+	 * <ul>
+	 * 	<li><js>"# comment"</js> - A comment line.
+	 * 	<li><js>"comment"</js> - Anything else (will automatically be prefixed with <js>"# "</js>).
+	 * </ul>
+	 * <p>
+	 * If the section does not exist, it will automatically be created.
+	 *
+	 * @param section The name of the section to add lines to, or <jk>null</jk> to add to the default section.
+	 * @param headerComments The comment lines to add to the section.
+	 * @return This object (for method chaining).
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile addHeaderComments(String section, String...headerComments);
+
+	/**
+	 * Removes any header comments from the specified section.
+	 *
+	 * @param section The name of the section to remove header comments from.
+	 * @return This object (for method chaining).
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile clearHeaderComments(String section);
+
+	/**
+	 * Returns the serializer in use for this config file.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws SerializeException If no serializer is defined on this config file.
+	 */
+	protected abstract WriterSerializer getSerializer() throws SerializeException;
+
+	/**
+	 * Returns the parser in use for this config file.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws ParseException If no parser is defined on this config file.
+	 */
+	protected abstract ReaderParser getParser() throws ParseException;
+
+	/**
+	 * Places a read lock on this config file.
+	 */
+	protected abstract void readLock();
+
+	/**
+	 * Removes the read lock on this config file.
+	 */
+	protected abstract void readUnlock();
+
+
+	//--------------------------------------------------------------------------------
+	// API methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the specified value as a string from the config file.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param def The default value if the section or value does not exist.
+	 * @return The value, or the default value if the section or value doesn't exist.
+	 */
+	public final String getString(String key, String def) {
+		assertFieldNotNull(key, "key");
+		String s = get(getSectionName(key), getSectionKey(key));
+		return (s == null ? def : s);
+	}
+
+	/**
+	 * Removes an entry with the specified key.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return The previous value, or <jk>null</jk> if the section or key did not previously exist.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public final String removeString(String key) {
+		assertFieldNotNull(key, "key");
+		return remove(getSectionName(key), getSectionKey(key));
+	}
+
+	/**
+	 * Gets the entry with the specified key and converts it to the specified value.
+	 * <p>
+	 * The key can be in one of the following formats...
+	 * <ul>
+	 * 	<li><js>"key"</js> - A value in the default section (i.e. defined above any <code>[section]</code> header).
+	 * 	<li><js>"section/key"</js> - A value from the specified section.
+	 * </ul>
+	 * <p>
+	 * If the class type is an array, the value is split on commas and converted individually.
+	 * <p>
+	 * If you specify a primitive element type using this method (e.g. <code><jk>int</jk>.<jk>class</jk></code>,
+	 * 	you will get an array of wrapped objects (e.g. <code>Integer[].<jk>class</jk></code>.
+	 *
+	 * @param c The class to convert the value to.
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.
+	 * @return The value, or <jk>null</jk> if the section or key does not exist.
+	 */
+	@SuppressWarnings("unchecked")
+	public final <T> T getObject(Class<T> c, String key) throws ParseException {
+		assertFieldNotNull(c, "c");
+		return getObject(c, key, c.isArray() ? (T)Array.newInstance(c.getComponentType(), 0) : null);
+	}
+
+	/**
+	 * Gets the entry with the specified key and converts it to the specified value..
+	 * <p>
+	 * The key can be in one of the following formats...
+	 * <ul>
+	 * 	<li><js>"key"</js> - A value in the default section (i.e. defined above any <code>[section]</code> header).
+	 * 	<li><js>"section/key"</js> - A value from the specified section.
+	 * </ul>
+	 *
+	 * @param c The class to convert the value to.
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param def The default value if section or key does not exist.
+	 * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.
+	 * @return The value, or <jk>null</jk> if the section or key does not exist.
+	 */
+	public final <T> T getObject(Class<T> c, String key, T def) throws ParseException {
+		assertFieldNotNull(c, "c");
+		assertFieldNotNull(key, "key");
+		return getObject(c, getSectionName(key), getSectionKey(key), def);
+	}
+
+	/**
+	 * Same as {@link #getObject(Class, String, Object)}, but value is referenced through section name and key instead of full key.
+	 *
+	 * @param c The class to convert the value to.
+	 * @param sectionName - The section name.  Must not be <jk>null</jk>.
+	 * @param sectionKey - The section key.  Must not be <jk>null</jk>.
+	 * @param def The default value if section or key does not exist.
+	 * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.
+	 * @return The value, or the default value if the section or value doesn't exist.
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T getObject(Class<T> c, String sectionName, String sectionKey, T def) throws ParseException {
+		String s = get(sectionName, sectionKey);
+		if (s == null)
+			return def;
+		if (c == String.class)
+			return (T)s;
+		if (c == Integer.class || c == int.class)
+			return (T)(StringUtils.isEmpty(s) ? def : Integer.valueOf(parseIntWithSuffix(s)));
+		if (c == Boolean.class || c == boolean.class)
+			return (T)(StringUtils.isEmpty(s) ? def : Boolean.valueOf(Boolean.parseBoolean(s)));
+		if (c == String[].class) {
+			String[] r = StringUtils.isEmpty(s) ? new String[0] : StringUtils.split(s, ',');
+			return (T)(r.length == 0 ? def : r);
+		}
+		if (c.isArray()) {
+			Class<?> ce = c.getComponentType();
+			if (StringUtils.isEmpty(s))
+				return def;
+			String[] r = StringUtils.split(s, ',');
+			Object o = Array.newInstance(ce, r.length);
+			for (int i = 0; i < r.length; i++)
+				Array.set(o, i, getParser().parse(r[i], ce));
+			return (T)o;
+		}
+		if (StringUtils.isEmpty(s))
+			return def;
+		return getParser().parse(s, c);
+	}
+
+	/**
+	 * Gets the entry with the specified key.
+	 * <p>
+	 * The key can be in one of the following formats...
+	 * <ul>
+	 * 	<li><js>"key"</js> - A value in the default section (i.e. defined above any <code>[section]</code> header).
+	 * 	<li><js>"section/key"</js> - A value from the specified section.
+	 * </ul>
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return The value, or <jk>null</jk> if the section or key does not exist.
+	 */
+	public final String getString(String key) {
+		return getString(key, null);
+	}
+
+	/**
+	 * Gets the entry with the specified key, splits the value on commas, and returns the values as trimmed strings.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return The value, or an empty list if the section or key does not exist.
+	 */
+	public final String[] getStringArray(String key) {
+		return getStringArray(key, new String[0]);
+	}
+
+	/**
+	 * Same as {@link #getStringArray(String)} but returns a default value if the value cannot be found.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param def The default value if section or key does not exist.
+	 * @return The value, or an empty list if the section or key does not exist.
+	 */
+	public final String[] getStringArray(String key, String[] def) {
+		String s = getString(key);
+		if (s == null)
+			return def;
+		String[] r = StringUtils.isEmpty(s) ? new String[0] : StringUtils.split(s, ',');
+		return r.length == 0 ? def : r;
+	}
+
+	/**
+	 * Convenience method for getting int config values.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return The value, or <code>0</code> if the section or key does not exist or cannot be parsed as an integer.
+	 */
+	public final int getInt(String key) {
+		return getInt(key, 0);
+	}
+
+	/**
+	 * Convenience method for getting int config values.
+	 * <p>
+	 * <js>"M"</js> and <js>"K"</js> can be used to identify millions and thousands.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li><code><js>"100K"</js> => 1024000</code>
+	 * 	<li><code><js>"100M"</js> => 104857600</code>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param def The default value if config file or value does not exist.
+	 * @return The value, or the default value if the section or key does not exist or cannot be parsed as an integer.
+	 */
+	public final int getInt(String key, int def) {
+		String s = getString(key);
+		if (StringUtils.isEmpty(s))
+			return def;
+		return parseIntWithSuffix(s);
+	}
+
+	/**
+	 * Convenience method for getting boolean config values.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return The value, or <jk>false</jk> if the section or key does not exist or cannot be parsed as a boolean.
+	 */
+	public final boolean getBoolean(String key) {
+		return getBoolean(key, false);
+	}
+
+	/**
+	 * Convenience method for getting boolean config values.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param def The default value if config file or value does not exist.
+	 * @return The value, or the default value if the section or key does not exist or cannot be parsed as a boolean.
+	 */
+	public final boolean getBoolean(String key, boolean def) {
+		String s = getString(key);
+		return StringUtils.isEmpty(s) ? def : Boolean.parseBoolean(s);
+	}
+
+	/**
+	 * Adds or replaces an entry with the specified key with a POJO serialized to a string using the registered serializer.
+	 * <p>
+	 *	Equivalent to calling <code>put(key, value, isEncoded(key))</code>.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param value The new value POJO.
+	 * @return The previous value, or <jk>null</jk> if the section or key did not previously exist.
+	 * @throws SerializeException If serializer could not serialize the value or if a serializer is not registered with this config file.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public final String put(String key, Object value) throws SerializeException {
+		return put(key, value, isEncoded(key));
+	}
+
+	/**
+	 * Adds or replaces an entry with the specified key with the specified value.
+	 * <p>
+	 * The format of the entry depends on the data type of the value.
+	 * <ul>
+	 * 	<li>Simple types (<code>String</code>, <code>Number</code>, <code>Boolean</code>, primitives)
+	 * 		are serialized as plain strings.
+	 * 	<li>Arrays and collections of simple types are serialized as comma-delimited lists of plain strings.
+	 * 	<li>Other types (e.g. beans) are serialized using the serializer registered with this config file.
+	 * 	<li>Arrays and collections of other types are serialized as comma-delimited lists of serialized strings of each entry.
+	 * </ul>
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @param value The new value.
+	 *	@param encoded If <jk>true</jk>, value is encoded by the registered encoder when the config file is persisted to disk.
+	 * @return The previous value, or <jk>null</jk> if the section or key did not previously exist.
+	 * @throws SerializeException If serializer could not serialize the value or if a serializer is not registered with this config file.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public final String put(String key, Object value, boolean encoded) throws SerializeException {
+		assertFieldNotNull(key, "key");
+		if (value == null)
+			value = "";
+		Class<?> c = value.getClass();
+		if (isSimpleType(c))
+			return put(getSectionName(key), getSectionKey(key), value.toString(), encoded);
+		if (c.isAssignableFrom(Collection.class)) {
+			Collection<?> c2 = (Collection<?>)value;
+			String[] r = new String[c2.size()];
+			int i = 0;
+			for (Object o2 : c2) {
+				boolean isSimpleType = o2 == null ? true : isSimpleType(o2.getClass());
+				r[i++] = (isSimpleType ? Array.get(value, i).toString() : getSerializer().toString(Array.get(value, i)));
+			}
+			return put(getSectionName(key), getSectionKey(key), StringUtils.join(r, ','), encoded);
+		} else if (c.isArray()) {
+			boolean isSimpleType = isSimpleType(c.getComponentType());
+			String[] r = new String[Array.getLength(value)];
+			for (int i = 0; i < r.length; i++) {
+				r[i] = (isSimpleType ? Array.get(value, i).toString() : getSerializer().toString(Array.get(value, i)));
+			}
+			return put(getSectionName(key), getSectionKey(key), StringUtils.join(r, ','), encoded);
+		}
+		return put(getSectionName(key), getSectionKey(key), getSerializer().toString(value), encoded);
+	}
+
+	private final boolean isSimpleType(Class<?> c) {
+		return (c == String.class || c.isPrimitive() || c.isAssignableFrom(Number.class) || c == Boolean.class);
+	}
+
+	/**
+	 * Returns the specified section as a map of key/value pairs.
+	 *
+	 * @param sectionName The section name to retrieve.
+	 * @return A map of the section, or <jk>null</jk> if the section was not found.
+	 */
+	public final ObjectMap getSectionMap(String sectionName) {
+		readLock();
+		try {
+			Set<String> keys = getSectionKeys(sectionName);
+			if (keys == null)
+				return null;
+			ObjectMap m = new ObjectMap();
+			for (String key : keys)
+				m.put(key, get(sectionName, key));
+			return m;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Copies the entries in a section to the specified bean by calling the public setters on that bean.
+	 *
+	 *	@param sectionName The section name to write from.
+	 * @param bean The bean to set the properties on.
+	 * @param ignoreUnknownProperties If <jk>true</jk>, don't throw an {@link IllegalArgumentException} if this section
+	 * 	contains a key that doesn't correspond to a setter method.
+	 * @param permittedPropertyTypes If specified, only look for setters whose property types
+	 * 	are those listed.  If not specified, use all setters.
+	 * @return An object map of the changes made to the bean.
+	 * @throws ParseException If parser was not set on this config file or invalid properties were found in the section.
+	 * @throws IllegalArgumentException
+	 * @throws IllegalAccessException
+	 * @throws InvocationTargetException
+	 */
+	public final ObjectMap writeProperties(String sectionName, Object bean, boolean ignoreUnknownProperties, Class<?>...permittedPropertyTypes) throws ParseException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+		assertFieldNotNull(bean, "bean");
+		ObjectMap om = new ObjectMap();
+		readLock();
+		try {
+			Set<String> keys = getSectionKeys(sectionName);
+			if (keys == null)
+				throw new IllegalArgumentException("Section not found");
+			keys = new LinkedHashSet<String>(keys);
+			for (Method m : bean.getClass().getMethods()) {
+				int mod = m.getModifiers();
+				if (isPublic(mod) && (!isStatic(mod)) && m.getName().startsWith("set") && m.getParameterTypes().length == 1) {
+					Class<?> pt = m.getParameterTypes()[0];
+					if (permittedPropertyTypes == null || permittedPropertyTypes.length == 0 || ArrayUtils.contains(pt, permittedPropertyTypes)) {
+						String propName = Introspector.decapitalize(m.getName().substring(3));
+						Object value = getObject(pt, sectionName, propName, null);
+						if (value != null) {
+							m.invoke(bean, value);
+							om.put(propName, value);
+							keys.remove(propName);
+						}
+					}
+				}
+			}
+			if (! (ignoreUnknownProperties || keys.isEmpty()))
+				throw new ParseException("Invalid properties found in config file section ["+sectionName+"]: " + JsonSerializer.DEFAULT_LAX.toString(keys));
+			return om;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Shortcut for calling <code>asBean(sectionName, c, <jk>false</jk>)</code>.
+	 *
+	 * @param sectionName The section name to write from.
+	 * @param c The bean class to create.
+	 * @return A new bean instance.
+	 * @throws ParseException
+	 */
+	public final <T> T getSectionAsBean(String sectionName, Class<T>c) throws ParseException {
+		return getSectionAsBean(sectionName, c, false);
+	}
+
+	/**
+	 * Converts this config file section to the specified bean instance.
+	 *
+	 *	@param sectionName The section name to write from.
+	 * @param c The bean class to create.
+	 * @param ignoreUnknownProperties If <jk>false</jk>, throws a {@link ParseException} if
+	 * 	the section contains an entry that isn't a bean property name.
+	 * @return A new bean instance.
+	 * @throws ParseException
+	 */
+	public final <T> T getSectionAsBean(String sectionName, Class<T> c, boolean ignoreUnknownProperties) throws ParseException {
+		assertFieldNotNull(c, "c");
+		readLock();
+		try {
+			BeanMap<T> bm = getParser().getBeanContext().newBeanMap(c);
+			for (String k : getSectionKeys(sectionName)) {
+				BeanPropertyMeta<?> bpm = bm.getPropertyMeta(k);
+				if (bpm == null) {
+					if (! ignoreUnknownProperties)
+						throw new ParseException("Unknown property {0} encountered", k);
+				} else {
+					bm.put(k, getObject(bpm.getClassMeta().getInnerClass(), sectionName + '/' + k));
+				}
+			}
+			return bm.getBean();
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this section contains the specified key and the key has a non-blank value.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return <jk>true</jk> if this section contains the specified key and the key has a non-blank value.
+	 */
+	public final boolean containsNonEmptyValue(String key) {
+		return ! StringUtils.isEmpty(getString(key, null));
+	}
+
+	/**
+	 * Gets the section with the specified name.
+	 *
+	 * @param name The section name.
+	 * @return The section, or <jk>null</jk> if section does not exist.
+	 */
+	protected abstract Section getSection(String name);
+
+	/**
+	 * Gets the section with the specified name and optionally creates it if it's not there.
+	 *
+	 * @param name The section name.
+	 * @param create Create the section if it's not there.
+	 * @return The section, or <jk>null</jk> if section does not exist.
+	 * @throws UnsupportedOperationException If config file is read only and section doesn't exist and <code>create</code> is <jk>true</jk>.
+	 */
+	protected abstract Section getSection(String name, boolean create);
+
+	/**
+	 * Appends a section to this config file if it does not already exist.
+	 * <p>
+	 * Returns the existing section if it already exists.
+	 *
+	 * @param name The section name, or <jk>null</jk> for the default section.
+	 * @return The appended or existing section.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile addSection(String name);
+
+	/**
+	 * Creates or overwrites the specified section.
+	 *
+	 * @param name The section name, or <jk>null</jk> for the default section.
+	 * @param contents The contents of the new section.
+	 * @return The appended or existing section.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile setSection(String name, Map<String,String> contents);
+
+	/**
+	 * Removes the section with the specified name.
+	 *
+	 * @param name The name of the section to remove, or <jk>null</jk> for the default section.
+	 * @return The removed section, or <jk>null</jk> if named section does not exist.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile removeSection(String name);
+
+	/**
+	 * Returns <jk>true</jk> if the encoding flag is set on the specified entry.
+	 *
+	 * @param key The key.  See {@link #getString(String)} for a description of the key.
+	 * @return <jk>true</jk> if the encoding flag is set on the specified entry.
+	 */
+	public abstract boolean isEncoded(String key);
+
+	/**
+	 * Saves this config file to disk.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to save file to disk, or file is not associated with this object.
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile save() throws IOException;
+
+	/**
+	 * Saves this config file to the specified writer as an INI file.
+	 * <p>
+	 * The writer will automatically be closed.
+	 *
+	 * @param out The writer to send the output to.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to send contents to the writer.
+	 */
+	public final ConfigFile serializeTo(Writer out) throws IOException {
+		return serializeTo(out, INI);
+	}
+
+	/**
+	 * Same as {@link #serializeTo(Writer)}, except allows you to explicitely specify a format.
+	 *
+	 * @param out The writer to send the output to.
+	 * @param format The {@link ConfigFileFormat} of the output.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to send contents to the writer.
+	 */
+	public abstract ConfigFile serializeTo(Writer out, ConfigFileFormat format) throws IOException;
+
+	/**
+	 * Add a listener to this config file to react to modification events.
+	 *
+	 * @param listener The new listener to add.
+	 * @return This object (for method chaining).
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile addListener(ConfigFileListener listener);
+
+	/**
+	 * Merges the contents of the specified config file into this config file.
+	 * <p>
+	 * Pretty much identical to just replacing this config file, but
+	 * 	causes the {@link ConfigFileListener#onChange(ConfigFile, Set)} method to be invoked
+	 * 	on differences between the file.
+	 * @param cf The config file whose values should be copied into this config file.
+	 * @return This object (for method chaining).
+	 * @throws UnsupportedOperationException If config file is read only.
+	 */
+	public abstract ConfigFile merge(ConfigFile cf);
+
+	/**
+	 * Returns the config file contents as a string.
+	 * <p>
+	 * The contents of the string are the same as the contents that would be serialized to disk.
+	 */
+	@Override /* Object */
+	public abstract String toString();
+
+	/**
+	 * Returns a wrapped instance of this config file where calls to getters
+	 * 	have their values first resolved by the specified {@link StringVarResolver}.
+	 * <p>
+	 * @param vr
+	 * @return This config file wrapped in an instance of {@link ConfigFileWrapped}.
+	 */
+	public abstract ConfigFile getResolving(StringVarResolver vr);
+
+	/**
+	 * Returns a wrapped instance of this config file where calls to getters have their values
+	 * 	first resolved by a default {@link StringVarResolver}.
+	 *
+	 *  The default {@link StringVarResolver} is registered with the following {@link StringVar StringVars}:
+	 * <ul>
+	 * 	<li><code>$S{key}</code>,<code>$S{key,default}</code> - System properties.
+	 * 	<li><code>$E{key}</code>,<code>$E{key,default}</code> - Environment variables.
+	 * 	<li><code>$C{key}</code>,<code>$C{key,default}</code> - Values in this configuration file.
+	 * </ul>
+	 *
+	 * @return A new config file that resolves string variables.
+	 */
+	public abstract ConfigFile getResolving();
+
+	/**
+	 * Wraps this config file in a {@link Writable} interface that renders it as plain text.
+	 *
+	 * @return This config file wrapped in a {@link Writable}.
+	 */
+	public abstract Writable toWritable();
+
+	private int parseIntWithSuffix(String s) {
+		assertFieldNotNull(s, "s");
+		int m = 1;
+		if (s.endsWith("M")) {
+			m = 1024*1024;
+			s = s.substring(0, s.length()-1).trim();
+		} else if (s.endsWith("K")) {
+			m = 1024;
+			s = s.substring(0, s.length()-1).trim();
+		}
+		return Integer.parseInt(s) * m;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.class
new file mode 100755
index 0000000..2af9062
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.java
new file mode 100755
index 0000000..ae991e7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileFormat.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import java.io.*;
+
+/**
+ * Valid formats that can be passed to the {@link ConfigFile#serializeTo(Writer, ConfigFileFormat)} method.
+ */
+public enum ConfigFileFormat {
+	/** Normal INI file format*/
+	INI,
+
+	/** Batch file with "set X" commands */
+	BATCH,
+
+	/** Shell script file with "export X" commands */
+	SHELL;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1$1.class
new file mode 100755
index 0000000..df4b978
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1.class
new file mode 100755
index 0000000..248452a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2$1.class
new file mode 100755
index 0000000..9dcb412
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2.class
new file mode 100755
index 0000000..a533afa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3$1.class
new file mode 100755
index 0000000..b09b475
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3.class
new file mode 100755
index 0000000..d132e6a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$4.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$4.class
new file mode 100755
index 0000000..3f9c85a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.class
new file mode 100755
index 0000000..55cd0f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.java
new file mode 100755
index 0000000..e9a0a64
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileImpl.java
@@ -0,0 +1,729 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import static com.ibm.juno.core.ini.ConfigUtils.*;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.nio.charset.*;
+import java.util.*;
+import java.util.concurrent.locks.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Implementation class for {@link ConfigFile}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ConfigFileImpl extends ConfigFile {
+
+	private final File file;
+	private final Encoder encoder;
+	private final WriterSerializer serializer;
+	private final ReaderParser parser;
+	private final Charset charset;
+	final List<ConfigFileListener> listeners = Collections.synchronizedList(new ArrayList<ConfigFileListener>());
+
+	private Map<String,Section> sections;  // The actual data.
+
+	private static final String DEFAULT = "default";
+
+	private final boolean readOnly;
+
+	volatile boolean hasBeenModified = false;
+	private ReadWriteLock lock = new ReentrantReadWriteLock();
+
+	long modifiedTimestamp;
+
+	/**
+	 * Constructor.
+	 * <p>
+	 * Loads the contents of the specified file into this config file.
+	 * <p>
+	 * If file does not initially exist, this object will start off empty.
+	 *
+	 * @param file The INI file on disk.
+	 * 	If <jk>null</jk>, create an in-memory config file.
+	 * @param readOnly Make this configuration file read-only.
+	 *		Attempting to set any values on this config file will cause {@link UnsupportedOperationException} to be thrown.
+	 *	@param encoder The encoder to use for encoding sensitive values in this configuration file.
+	 * 	If <jk>null</jk>, defaults to {@link XorEncoder#INSTANCE}.
+	 *	@param serializer The serializer to use for serializing POJOs in the {@link #put(String, Object)} method.
+	 * 	If <jk>null</jk>, defaults to {@link JsonSerializer#DEFAULT}.
+	 *	@param parser The parser to use for parsing POJOs in the {@link #getObject(Class,String)} method.
+	 * 	If <jk>null</jk>, defaults to {@link JsonParser#DEFAULT}.
+	 * @param charset The charset on the files.
+	 * 	If <jk>null</jk>, defaults to {@link Charset#defaultCharset()}.
+	 * @throws IOException
+	 */
+	public ConfigFileImpl(File file, boolean readOnly, Encoder encoder, WriterSerializer serializer, ReaderParser parser, Charset charset) throws IOException {
+		this.file = file;
+		this.encoder = encoder == null ? XorEncoder.INSTANCE : encoder;
+		this.serializer = serializer == null ? JsonSerializer.DEFAULT : serializer;
+		this.parser = parser == null ? JsonParser.DEFAULT : parser;
+		this.charset = charset == null ? Charset.defaultCharset() : charset;
+		load();
+		this.readOnly = readOnly;
+		if (readOnly) {
+			this.sections = Collections.unmodifiableMap(this.sections);
+			for (Section s : sections.values())
+				s.setReadOnly();
+		}
+	}
+
+	/**
+	 * Constructor.
+	 * Shortcut for calling <code><jk>new</jk> ConfigFileImpl(file, <jk>false</jk>, <jk>null</jk>, <jk>null</jk>, <jk>null</jk>, <jk>null</jk>);</code>
+	 *
+	 * @param file The config file.  Does not need to exist.
+	 * @throws IOException
+	 */
+	public ConfigFileImpl(File file) throws IOException {
+		this(file, false, null, null, null, null);
+	}
+
+	/**
+	 * Constructor.
+	 * Shortcut for calling <code><jk>new</jk> ConfigFileImpl(<jk>null</jk>, <jk>false</jk>, <jk>null</jk>, <jk>null</jk>, <jk>null</jk>, <jk>null</jk>);</code>
+	 *
+	 * @throws IOException
+	 */
+	public ConfigFileImpl() throws IOException {
+		this(null);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl loadIfModified() throws IOException {
+		if (file == null)
+			return this;
+		writeLock();
+		try {
+			if (file.lastModified() > modifiedTimestamp)
+				load();
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl load() throws IOException {
+		Reader r = null;
+		if (file != null && file.exists())
+			r = new InputStreamReader(new FileInputStream(file), charset);
+		else
+			r = new StringReader("");
+		try {
+			load(r);
+		} finally {
+			r.close();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl load(Reader r) throws IOException {
+		assertFieldNotNull(r, "r");
+		writeLock();
+		try {
+			this.sections = Collections.synchronizedMap(new LinkedHashMap<String,Section>());
+			BufferedReader in = new BufferedReader(r);
+			try {
+				writeLock();
+				hasBeenModified = false;
+				try {
+					sections.clear();
+					String line = null;
+					Section section = getSection(null, true);
+					while ((line = in.readLine()) != null) {
+						if (line.matches("\\s*\\[.*\\].*")) {
+							String sn = line.substring(line.indexOf('[')+1, line.indexOf(']')).trim();
+							section = getSection(sn, true).addHeaderComments(section.removeTrailingComments());
+						} else {
+							section.addLines(null, line);
+						}
+					}
+					in.close();
+					if (hasBeenModified)  // Set when values need to be encoded.
+						save();
+					if (file != null)
+						modifiedTimestamp = file.lastModified();
+				} finally {
+					writeUnlock();
+				}
+			} finally {
+				in.close();
+			}
+		} finally {
+			writeUnlock();
+		}
+		for (ConfigFileListener l : listeners)
+			l.onLoad(this);
+		return this;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Map methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Map */
+	public Section get(Object key) {
+		if (StringUtils.isEmpty(key))
+			key = DEFAULT;
+		readLock();
+		try {
+			return sections.get(key);
+		} finally {
+			readUnlock();
+		}
+	}
+
+	@Override /* Map */
+	public Section put(String key, Section section) {
+		Set<String> changes = createChanges();
+		Section old = put(key, section, changes);
+		signalChanges(changes);
+		return old;
+	}
+
+	private Section put(String key, Section section, Set<String> changes) {
+		if (StringUtils.isEmpty(key))
+			key = DEFAULT;
+		writeLock();
+		try {
+			Section prev = sections.put(key, section);
+			findChanges(changes, prev, section);
+			return prev;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	@Override /* Map */
+	public void putAll(Map<? extends String,? extends Section> map) {
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			for (Map.Entry<? extends String,? extends Section> e : map.entrySet())
+				put(e.getKey(), e.getValue(), changes);
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+	}
+
+	@Override /* Map */
+	public void clear() {
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			for (Section s : values())
+				findChanges(changes, s, null);
+			sections.clear();
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+	}
+
+	@Override /* Map */
+	public boolean containsKey(Object key) {
+		if (StringUtils.isEmpty(key))
+			key = DEFAULT;
+		return sections.containsKey(key);
+	}
+
+	@Override /* Map */
+	public boolean containsValue(Object value) {
+		return sections.containsValue(value);
+	}
+
+	@Override /* Map */
+	public Set<Map.Entry<String,Section>> entrySet() {
+
+		// We need to create our own set so that entries are removed correctly.
+		return new AbstractSet<Map.Entry<String,Section>>() {
+			@Override /* Map */
+			public Iterator<Map.Entry<String,Section>> iterator() {
+				return new Iterator<Map.Entry<String,Section>>() {
+					Iterator<Map.Entry<String,Section>> i = sections.entrySet().iterator();
+					Map.Entry<String,Section> i2;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public Map.Entry<String,Section> next() {
+						i2 = i.next();
+						return i2;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						Set<String> changes = createChanges();
+						findChanges(changes, i2.getValue(), null);
+						i.remove();
+						signalChanges(changes);
+					}
+				};
+			}
+
+			@Override /* Map */
+			public int size() {
+				return sections.size();
+			}
+		};
+	}
+
+	@Override /* Map */
+	public boolean isEmpty() {
+		return sections.isEmpty();
+	}
+
+	@Override /* Map */
+	public Set<String> keySet() {
+
+		// We need to create our own set so that sections are removed correctly.
+		return new AbstractSet<String>() {
+			@Override /* Set */
+			public Iterator<String> iterator() {
+				return new Iterator<String>() {
+					Iterator<String> i = sections.keySet().iterator();
+					String i2;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public String next() {
+						i2 = i.next();
+						return i2;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						Set<String> changes = createChanges();
+						findChanges(changes, sections.get(i2), null);
+						i.remove();
+						signalChanges(changes);
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return sections.size();
+			}
+		};
+	}
+
+	@Override /* Map */
+	public int size() {
+		return sections.size();
+	}
+
+	@Override /* Map */
+	public Collection<Section> values() {
+		return new AbstractCollection<Section>() {
+			@Override /* Collection */
+			public Iterator<Section> iterator() {
+				return new Iterator<Section>() {
+					Iterator<Section> i = sections.values().iterator();
+					Section i2;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public Section next() {
+						i2 = i.next();
+						return i2;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						Set<String> changes = createChanges();
+						findChanges(changes, i2, null);
+						i.remove();
+						signalChanges(changes);
+					}
+				};
+			}
+			@Override /* Collection */
+			public int size() {
+				return sections.size();
+			}
+		};
+	}
+
+	@Override /* Map */
+	public Section remove(Object key) {
+		Set<String> changes = createChanges();
+		Section prev = remove(key, changes);
+		signalChanges(changes);
+		return prev;
+	}
+
+	private Section remove(Object key, Set<String> changes) {
+		writeLock();
+		try {
+			Section prev = sections.remove(key);
+			findChanges(changes, prev, null);
+			return prev;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// API methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* ConfigFile */
+	public String get(String sectionName, String sectionKey) {
+		assertFieldNotNull(sectionKey, "sectionKey");
+		Section s = get(sectionName);
+		if (s == null)
+			return null;
+		Object s2 = s.get(sectionKey);
+		return (s2 == null ? null : s2.toString());
+	}
+
+	@Override /* ConfigFile */
+	public String put(String sectionName, String sectionKey, Object value, boolean encoded) {
+		assertFieldNotNull(sectionKey, "sectionKey");
+		Section s = getSection(sectionName, true);
+		return s.put(sectionKey, value.toString(), encoded);
+	}
+
+	@Override /* ConfigFile */
+	public String remove(String sectionName, String sectionKey) {
+		assertFieldNotNull(sectionKey, "sectionKey");
+		Section s = getSection(sectionName, false);
+		if (s == null)
+			return null;
+		return s.remove(sectionKey);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl addLines(String section, String...lines) {
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			getSection(section, true).addLines(changes, lines);
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl addHeaderComments(String section, String...headerComments) {
+		writeLock();
+		try {
+			if (headerComments == null)
+				headerComments = new String[0];
+			getSection(section, true).addHeaderComments(Arrays.asList(headerComments));
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl clearHeaderComments(String section) {
+		writeLock();
+		try {
+			Section s = getSection(section, false);
+			if (s != null)
+				s.clearHeaderComments();
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public Section getSection(String name) {
+		return getSection(name, false);
+	}
+
+	@Override /* ConfigFile */
+	public Section getSection(String name, boolean create) {
+		if (StringUtils.isEmpty(name))
+			name = DEFAULT;
+		Section s = sections.get(name);
+		if (s != null)
+			return s;
+		if (create) {
+			s = new Section().setParent(this).setName(name);
+			sections.put(name, s);
+			return s;
+		}
+		return null;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl addSection(String name) {
+		writeLock();
+		try {
+			getSection(name, true);
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile setSection(String name, Map<String,String> contents) {
+		writeLock();
+		try {
+			put(name, new Section(contents).setParent(this).setName(name));
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl removeSection(String name) {
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			Section prev = sections.remove(name);
+			if (changes != null && prev != null)
+				findChanges(changes, prev, null);
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public Set<String> getSectionKeys(String sectionName) {
+		Section s = get(sectionName);
+		if (s == null)
+			return null;
+		return s.keySet();
+	}
+
+	@Override /* ConfigFile */
+	public boolean isEncoded(String key) {
+		assertFieldNotNull(key, "key");
+		String section = getSectionName(key);
+		Section s = getSection(section, false);
+		if (s == null)
+			return false;
+		return s.isEncoded(getSectionKey(key));
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl save() throws IOException {
+		writeLock();
+		try {
+			if (file == null)
+				throw new UnsupportedOperationException("No backing file specified for config file.");
+			Writer out = new OutputStreamWriter(new FileOutputStream(file), charset);
+			try {
+				serializeTo(out);
+				hasBeenModified = false;
+				modifiedTimestamp = file.lastModified();
+			} finally {
+				out.close();
+			}
+			for (ConfigFileListener l : listeners)
+				l.onSave(this);
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFileImpl serializeTo(Writer out, ConfigFileFormat format) throws IOException {
+		readLock();
+		try {
+			PrintWriter pw = (out instanceof PrintWriter ? (PrintWriter)out : new PrintWriter(out));
+			for (Section s : sections.values())
+				s.writeTo(pw, format);
+			pw.flush();
+			pw.close();
+			out.close();
+		} finally {
+			readUnlock();
+		}
+		return this;
+	}
+
+	void setHasBeenModified() {
+		hasBeenModified = true;
+	}
+
+	@Override /* ConfigFile */
+	public String toString() {
+		try {
+			StringWriter sw = new StringWriter();
+			toWritable().writeTo(sw);
+			return sw.toString();
+		} catch (IOException e) {
+			return e.getLocalizedMessage();
+		}
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile addListener(ConfigFileListener listener) {
+		assertFieldNotNull(listener, "listener");
+		writeLock();
+		try {
+			this.listeners.add(listener);
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	List<ConfigFileListener> getListeners() {
+		return listeners;
+	}
+
+	@Override /* ConfigFile */
+	public Writable toWritable() {
+		return new ConfigFileWritable(this);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile merge(ConfigFile cf) {
+		assertFieldNotNull(cf, "cf");
+		Set<String> changes = createChanges();
+		writeLock();
+		try {
+			for (String sectionName : this.keySet())
+				if (! cf.containsKey(sectionName))
+					remove(sectionName, changes);
+
+			for (Map.Entry<String,Section> e : cf.entrySet())
+				put(e.getKey(), e.getValue(), changes);
+
+		} finally {
+			writeUnlock();
+		}
+		signalChanges(changes);
+		return this;
+	}
+
+	Encoder getEncoder() {
+		return encoder;
+	}
+
+	@Override /* ConfigFile */
+	protected WriterSerializer getSerializer() throws SerializeException {
+		if (serializer == null)
+			throw new SerializeException("Serializer not defined on config file.");
+		return serializer;
+	}
+
+	@Override /* ConfigFile */
+	protected ReaderParser getParser() throws ParseException {
+		if (parser == null)
+			throw new ParseException("Parser not defined on config file.");
+		return parser;
+	}
+
+	@Override /* ConfigFile */
+	protected void readLock() {
+		lock.readLock().lock();
+	}
+
+	@Override /* ConfigFile */
+	protected void readUnlock() {
+		lock.readLock().unlock();
+	}
+
+	private void writeLock() {
+		if (readOnly)
+			throw new UnsupportedOperationException("Cannot modify read-only ConfigFile.");
+		lock.writeLock().lock();
+		hasBeenModified = true;
+	}
+
+	private void writeUnlock() {
+		lock.writeLock().unlock();
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile getResolving(StringVarResolver vr) {
+		assertFieldNotNull(vr, "vr");
+		return new ConfigFileWrapped(this, vr);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile getResolving() {
+		return getResolving(
+			new StringVarResolver(StringVarResolver.DEFAULT)
+				.addVar("C", new StringVarWithDefault() {
+					@Override /* StringVar */
+					public String resolve(String varVal) {
+						return getString(varVal);
+					}
+				}
+			)
+		);
+	}
+
+	/*
+	 * Finds the keys that are different between the two sections and adds it to
+	 * the specified set.
+	 */
+	private void findChanges(Set<String> s, Section a, Section b) {
+		if (s == null)
+			return;
+		String sname = (a == null ? b.name : a.name);
+		if (a == null) {
+			for (String k : b.keySet())
+				s.add(getFullKey(sname, k));
+		} else if (b == null) {
+			for (String k : a.keySet())
+				s.add(getFullKey(sname, k));
+		} else {
+			for (String k : a.keySet())
+				addChange(s, sname, k, a.get(k), b.get(k));
+			for (String k : b.keySet())
+				addChange(s, sname, k, a.get(k), b.get(k));
+		}
+	}
+
+	private void addChange(Set<String> changes, String section, String key, String oldVal, String newVal) {
+		if (! StringUtils.isEquals(oldVal, newVal))
+			changes.add(getFullKey(section, key));
+	}
+
+	private Set<String> createChanges() {
+		return (listeners.size() > 0 ? new LinkedHashSet<String>() : null);
+	}
+
+	private void signalChanges(Set<String> changes) {
+		if (changes != null && ! changes.isEmpty())
+			for (ConfigFileListener l : listeners)
+				l.onChange(this, changes);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.class
new file mode 100755
index 0000000..2e64bfd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.java
new file mode 100755
index 0000000..a813356
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileListener.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+
+import java.util.*;
+
+
+/**
+ * Listener that can be used to listen for change events in config files.
+ * <p>
+ * Use the {@link ConfigFile#addListener(ConfigFileListener)} method to register listeners.
+ */
+public class ConfigFileListener {
+
+	/**
+	 * Gets called immediately after a config file has been loaded.
+	 *
+	 * @param cf The config file being loaded.
+	 */
+	public void onLoad(ConfigFile cf) {}
+
+	/**
+	 * Gets called immediately after a config file has been saved.
+	 *
+	 * @param cf The config file being saved.
+	 */
+	public void onSave(ConfigFile cf) {}
+
+	/**
+	 * Signifies that the specified values have changed.
+	 *
+	 * @param cf The config file being modified.
+	 * @param changes The full keys (e.g. <js>"Section/key"</js>) of entries that have changed in the config file.
+	 */
+	public void onChange(ConfigFile cf, Set<String> changes) {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.class
new file mode 100755
index 0000000..bd1a0af
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.java
new file mode 100755
index 0000000..a0bbfd1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWrapped.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.ini;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Wraps an instance of {@link ConfigFileImpl} in an interface that will
+ * 	automatically replace {@link StringVarResolver} variables.
+ * <p>
+ * The {@link ConfigFile#getResolving(StringVarResolver)} returns an instance of this class.
+ * <p>
+ * This class overrides the {@link #getString(String, String)} to resolve string variables.
+ * All other method calls are passed through to the inner config file.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ConfigFileWrapped extends ConfigFile {
+
+	private final ConfigFileImpl cf;
+	private final StringVarResolver vr;
+
+	ConfigFileWrapped(ConfigFileImpl cf, StringVarResolver vr) {
+		this.cf = cf;
+		this.vr = vr;
+	}
+
+	@Override /* ConfigFile */
+	public void clear() {
+		cf.clear();
+	}
+
+	@Override /* ConfigFile */
+	public boolean containsKey(Object key) {
+		return cf.containsKey(key);
+	}
+
+	@Override /* ConfigFile */
+	public boolean containsValue(Object value) {
+		return cf.containsValue(value);
+	}
+
+	@Override /* ConfigFile */
+	public Set<java.util.Map.Entry<String,Section>> entrySet() {
+		return cf.entrySet();
+	}
+
+	@Override /* ConfigFile */
+	public Section get(Object key) {
+		return cf.get(key);
+	}
+
+	@Override /* ConfigFile */
+	public boolean isEmpty() {
+		return cf.isEmpty();
+	}
+
+	@Override /* ConfigFile */
+	public Set<String> keySet() {
+		return cf.keySet();
+	}
+
+	@Override /* ConfigFile */
+	public Section put(String key, Section value) {
+		return cf.put(key, value);
+	}
+
+	@Override /* ConfigFile */
+	public void putAll(Map<? extends String,? extends Section> map) {
+		cf.putAll(map);
+	}
+
+	@Override /* ConfigFile */
+	public Section remove(Object key) {
+		return cf.remove(key);
+	}
+
+	@Override /* ConfigFile */
+	public int size() {
+		return cf.size();
+	}
+
+	@Override /* ConfigFile */
+	public Collection<Section> values() {
+		return cf.values();
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile loadIfModified() throws IOException {
+		cf.loadIfModified();
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile load() throws IOException {
+		cf.load();
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile load(Reader r) throws IOException {
+		cf.load(r);
+		return this;
+	}
+
+
+	@Override /* ConfigFile */
+	public boolean isEncoded(String key) {
+		return cf.isEncoded(key);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile addLines(String section, String... lines) {
+		cf.addLines(section, lines);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile addHeaderComments(String section, String... headerComments) {
+		cf.addHeaderComments(section, headerComments);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile clearHeaderComments(String section) {
+		cf.clearHeaderComments(section);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public Section getSection(String name) {
+		return cf.getSection(name);
+	}
+
+	@Override /* ConfigFile */
+	public Section getSection(String name, boolean create) {
+		return cf.getSection(name, create);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile addSection(String name) {
+		cf.addSection(name);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile setSection(String name, Map<String,String> contents) {
+		cf.setSection(name, contents);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile removeSection(String name) {
+		cf.removeSection(name);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile save() throws IOException {
+		cf.save();
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile serializeTo(Writer out, ConfigFileFormat format) throws IOException {
+		cf.serializeTo(out, format);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public String toString() {
+		return cf.toString();
+	}
+
+	@Override /* ConfigFile */
+	@SuppressWarnings("hiding")
+	public ConfigFile getResolving(StringVarResolver vr) {
+		assertFieldNotNull(vr, "vr");
+		return new ConfigFileWrapped(cf, vr);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile getResolving() {
+		return new ConfigFileWrapped(cf, StringVarResolver.DEFAULT);
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile addListener(ConfigFileListener listener) {
+		cf.addListener(listener);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	public Writable toWritable() {
+		return cf.toWritable();
+	}
+
+	@Override /* ConfigFile */
+	public ConfigFile merge(ConfigFile newCf) {
+		cf.merge(newCf);
+		return this;
+	}
+
+	@Override /* ConfigFile */
+	protected WriterSerializer getSerializer() throws SerializeException {
+		return cf.getSerializer();
+	}
+
+	@Override /* ConfigFile */
+	protected ReaderParser getParser() throws ParseException {
+		return cf.getParser();
+	}
+
+	@Override /* ConfigFile */
+	public String get(String sectionName, String sectionKey) {
+		String s = cf.get(sectionName, sectionKey);
+		if (s == null)
+			return null;
+		return vr.resolve(s);
+	}
+
+	@Override /* ConfigFile */
+	public String put(String sectionName, String sectionKey, Object value, boolean encoded) {
+		return cf.put(sectionName, sectionKey, value, encoded);
+	}
+
+	@Override /* ConfigFile */
+	public String remove(String sectionName, String sectionKey) {
+		return cf.remove(sectionName, sectionKey);
+	}
+
+	@Override /* ConfigFile */
+	public Set<String> getSectionKeys(String sectionName) {
+		return cf.getSectionKeys(sectionName);
+	}
+
+	@Override /* ConfigFile */
+	protected void readLock() {
+		cf.readLock();
+	}
+
+	@Override /* ConfigFile */
+	protected void readUnlock() {
+		cf.readUnlock();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.class
new file mode 100755
index 0000000..ff6dfa8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ini/ConfigFileWritable.class differ


[48/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCall.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCall.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCall.java
new file mode 100755
index 0000000..b743965
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCall.java
@@ -0,0 +1,944 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.logging.*;
+import java.util.regex.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.client.config.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.encoders.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Represents a connection to a remote REST resource.
+ * <p>
+ * 	Instances of this class are created by the various {@code doX()} methods on the {@link RestClient} class.
+ * <p>
+ * 	This class uses only Java standard APIs.  Requests can be built up using a fluent interface with method chaining, like so...
+ *
+ * <p class='bcode'>
+ * 	RestClient client = <jk>new</jk> RestClient();
+ * 	RestCall c = client.doPost(<jsf>URL</jsf>).setInput(o).setHeader(x,y);
+ * 	MyBean b = c.getResponse(MyBean.<jk>class</jk>);
+ * </p>
+ * <p>
+ * 	The actual connection and request/response transaction occurs when calling one of the <code>getResponseXXX()</code> methods.
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client &gt; REST client API</a> for more information and code examples.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestCall {
+
+	private final RestClient client;                       // The client that created this call.
+	private final HttpRequestBase request;                 // The request.
+	private HttpResponse response;                         // The response.
+	private List<RestCallInterceptor> interceptors = new ArrayList<RestCallInterceptor>();               // Used for intercepting and altering requests.
+
+	private boolean isConnected = false;                   // connect() has been called.
+	private boolean allowRedirectsOnPosts;
+	private int retries = 1;
+	private int redirectOnPostsTries = 5;
+	private long retryInterval = -1;
+	private RetryOn retryOn = RetryOn.DEFAULT;
+	private boolean ignoreErrors;
+	private boolean byLines = false;
+	private TeeWriter writers = new TeeWriter();
+	private StringWriter capturedResponseWriter;
+	private String capturedResponse;
+	private TeeOutputStream outputStreams = new TeeOutputStream();
+	private boolean isClosed = false;
+	private boolean isFailed = false;
+
+	/**
+	 * Constructs a REST call with the specified method name.
+	 *
+	 * @param client The client that created this request.
+	 * @param request The wrapped Apache HTTP client request object.
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 */
+	protected RestCall(RestClient client, HttpRequestBase request) throws RestCallException {
+		this.client = client;
+		this.request = request;
+		for (RestCallInterceptor i : this.client.interceptors)
+			addInterceptor(i);
+	}
+
+	/**
+	 * Sets the input for this REST call.
+	 *
+	 * @param input The input to be sent to the REST resource (only valid for PUT and POST) requests. <br>
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If a retry was attempted, but the entity was not repeatable.
+	 */
+	public RestCall setInput(final Object input) throws RestCallException {
+		if (! (request instanceof HttpEntityEnclosingRequestBase))
+			throw new RestCallException(0, "Method does not support content entity.", request.getMethod(), request.getURI(), null);
+		HttpEntity entity = (input instanceof HttpEntity ? (HttpEntity)input : new RestRequestEntity(input, client.serializer));
+		((HttpEntityEnclosingRequestBase)request).setEntity(entity);
+		if (retries > 1 && ! entity.isRepeatable())
+			throw new RestCallException("Rest call set to retryable, but entity is not repeatable.");
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting a header value on the request.
+	 * <p>
+	 * Equivalent to calling <code>restCall.getRequest().setHeader(name, value.toString())</code>.
+	 *
+	 * @param name The header name.
+	 * @param value The header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setHeader(String name, Object value) {
+		request.setHeader(name, value.toString());
+		return this;
+	}
+
+	/**
+	 * Make this call retryable if an error response (>=400) is received.
+	 *
+	 * @param retries The number of retries to attempt.
+	 * @param interval The time in milliseconds between attempts.
+	 * @param retryOn Optional object used for determining whether a retry should be attempted.
+	 * 	If <jk>null</jk>, uses {@link RetryOn#DEFAULT}.
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If current entity is not repeatable.
+	 */
+	public RestCall setRetryable(int retries, long interval, RetryOn retryOn) throws RestCallException {
+		if (request instanceof HttpEntityEnclosingRequestBase) {
+		HttpEntity e = ((HttpEntityEnclosingRequestBase)request).getEntity();
+		if (e != null && ! e.isRepeatable())
+			throw new RestCallException("Attempt to make call retryable, but entity is not repeatable.");
+		}
+		this.retries = retries;
+		this.retryInterval = interval;
+		this.retryOn = (retryOn == null ? RetryOn.DEFAULT : retryOn);
+		return this;
+
+	}
+
+	/**
+	 * For this call, allow automatic redirects when a 302 or 307 occurs when
+	 * 	performing a POST.
+	 * <p>
+	 * Note that this can be inefficient since the POST body needs to be serialized
+	 * 	twice.
+	 * The preferred approach if possible is to use the {@link LaxRedirectStrategy} strategy
+	 * 	on the underlying HTTP client.  However, this method is provided if you don't
+	 * 	have access to the underlying client.
+	 *
+	 * @param b Redirect flag.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall allowRedirectsOnPosts(boolean b) {
+		this.allowRedirectsOnPosts = b;
+		return this;
+	}
+
+	/**
+	 * Specify the number of redirects to follow before throwing an exception.
+	 *
+	 * @param maxAttempts Allow a redirect to occur this number of times.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setRedirectMaxAttempts(int maxAttempts) {
+		this.redirectOnPostsTries = maxAttempts;
+		return this;
+	}
+
+	/**
+	 * Add an interceptor for this call only.
+	 *
+	 * @param interceptor The interceptor to add to this call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall addInterceptor(RestCallInterceptor interceptor) {
+		interceptors.add(interceptor);
+		interceptor.onInit(this);
+		return this;
+	}
+
+	/**
+	 * Pipes the request output to the specified writer when {@link #run()} is called.
+	 * <p>
+	 * The writer is not closed.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param w The writer to pipe the output to.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(Writer w) {
+		return pipeTo(w, false);
+	}
+
+	/**
+	 * Pipe output from response to the specified writer when {@link #run()} is called.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param w The writer to write the output to.
+	 * @param close Close the writer when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(Writer w, boolean close) {
+		return pipeTo(null, w, close);
+	}
+
+	/**
+	 * Pipe output from response to the specified writer when {@link #run()} is called and associate
+	 * that writer with an ID so it can be retrieved through {@link #getWriter(String)}.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @param w The writer to write the output to.
+	 * @param close Close the writer when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(String id, Writer w, boolean close) {
+		writers.add(id, w, close);
+		return this;
+	}
+
+	/**
+	 * Retrieves a writer associated with an ID via {@link #pipeTo(String, Writer, boolean)}
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @return The writer, or <jk>null</jk> if no writer is associated with that ID.
+	 */
+	public Writer getWriter(String id) {
+		return writers.getWriter(id);
+	}
+
+	/**
+	 * When output is piped to writers, flush the writers after every line of output.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestCall byLines() {
+		this.byLines = true;
+		return this;
+	}
+
+	/**
+	 * Pipes the request output to the specified output stream when {@link #run()} is called.
+	 * <p>
+	 * The output stream is not closed.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output streams.
+	 *
+	 * @param os The output stream to pipe the output to.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(OutputStream os) {
+		return pipeTo(os, false);
+	}
+
+	/**
+	 * Pipe output from response to the specified output stream when {@link #run()} is called.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output stream.
+	 *
+	 * @param os The output stream to write the output to.
+	 * @param close Close the output stream when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(OutputStream os, boolean close) {
+		return pipeTo(null, os, close);
+	}
+
+	/**
+	 * Pipe output from response to the specified output stream when {@link #run()} is called and associate
+	 * that output stream with an ID so it can be retrieved through {@link #getOutputStream(String)}.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output stream.
+	 *
+	 * @param id A string identifier that can be used to retrieve the output stream using {@link #getOutputStream(String)}
+	 * @param os The output stream to write the output to.
+	 * @param close Close the output stream when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(String id, OutputStream os, boolean close) {
+		outputStreams.add(id, os, close);
+		return this;
+	}
+
+	/**
+	 * Retrieves an output stream associated with an ID via {@link #pipeTo(String, OutputStream, boolean)}
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @return The writer, or <jk>null</jk> if no writer is associated with that ID.
+	 */
+	public OutputStream getOutputStream(String id) {
+		return outputStreams.getOutputStream(id);
+	}
+
+	/**
+	 * Prevent {@link RestCallException RestCallExceptions} from being thrown when HTTP status 400+ is encountered.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall ignoreErrors() {
+		this.ignoreErrors = true;
+		return this;
+	}
+
+	/**
+	 * Stores the response text so that it can later be captured using {@link #getCapturedResponse()}.
+	 * <p>
+	 * This method should only be called once.  Multiple calls to this method are ignored.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestCall captureResponse() {
+		if (capturedResponseWriter == null) {
+			capturedResponseWriter = new StringWriter();
+			writers.add(capturedResponseWriter, false);
+		}
+		return this;
+	}
+
+
+	/**
+	 * Look for the specified regular expression pattern in the response output.
+	 * <p>
+	 * Causes a {@link RestCallException} to be thrown if the specified pattern is found in the output.
+	 * <p>
+	 * This method uses {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
+	 * 	restClient.doGet(<jsf>URL</jsf>)
+	 * 		.failurePattern(<js>"FAILURE|ERROR"</js>)
+	 * 		.run();
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param errorPattern A regular expression to look for in the response output.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall failurePattern(final String errorPattern) {
+		addResponsePattern(
+			new ResponsePattern(errorPattern) {
+				@Override
+				public void onMatch(RestCall rc, Matcher m) throws RestCallException {
+					throw new RestCallException("Failure pattern detected.");
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Look for the specified regular expression pattern in the response output.
+	 * <p>
+	 * Causes a {@link RestCallException} to be thrown if the specified pattern is not found in the output.
+	 * <p>
+	 * This method uses {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
+	 * 	restClient.doGet(<jsf>URL</jsf>)
+	 * 		.successPattern(<js>"SUCCESS"</js>)
+	 * 		.run();
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param successPattern A regular expression to look for in the response output.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall successPattern(String successPattern) {
+		addResponsePattern(
+			new ResponsePattern(successPattern) {
+				@Override
+				public void onNoMatch(RestCall rc) throws RestCallException {
+					throw new RestCallException("Success pattern not detected.");
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Adds a response pattern finder to look for regular expression matches in the response output.
+	 * <p>
+	 * This method can be called multiple times to add multiple response pattern finders.
+	 * <p>
+	 * {@link ResponsePattern ResponsePatterns} use the {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * @param responsePattern The response pattern finder.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall addResponsePattern(final ResponsePattern responsePattern) {
+		captureResponse();
+		addInterceptor(
+			new RestCallInterceptor() {
+				@Override
+				public void onClose(RestCall restCall) throws RestCallException {
+					responsePattern.match(RestCall.this);
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Set configuration settings on this request.
+	 * <p>
+	 * Use {@link RequestConfig#custom()} to create configuration parameters for the request.
+	 *
+	 * @param config The new configuration settings for this request.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setConfig(RequestConfig config) {
+		this.request.setConfig(config);
+		return this;
+	}
+
+	/**
+	 * @return The HTTP response code.
+	 * @throws RestCallException
+	 * @deprecated Use {@link #run()}.
+	 */
+	@Deprecated
+	public int execute() throws RestCallException {
+		return run();
+	}
+
+	/**
+	 * Method used to execute an HTTP response where you're only interested in the HTTP response code.
+	 * <p>
+	 * The response entity is discarded unless one of the pipe methods have been specified to pipe the
+	 * 	 output to an output stream or writer.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>try</jk> {
+	 * 		RestClient client = <jk>new</jk> RestClient();
+	 * 		<jk>int</jk> rc = client.doGet(url).execute();
+	 * 		<jc>// Succeeded!</jc>
+	 * 	} <jk>catch</jk> (RestCallException e) {
+	 * 		<jc>// Failed!</jc>
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 */
+	public int run() throws RestCallException {
+		connect();
+		try {
+			StatusLine status = response.getStatusLine();
+			int sc = status.getStatusCode();
+			if (sc >= 400 && ! ignoreErrors)
+				throw new RestCallException(sc, status.getReasonPhrase(), request.getMethod(), request.getURI(), getResponseAsString()).setHttpResponse(response);
+			if (outputStreams.size() > 0 || writers.size() > 0)
+				getReader();
+			return sc;
+		} catch (RestCallException e) {
+			isFailed = true;
+			throw e;
+		} catch (IOException e) {
+			isFailed = true;
+			throw new RestCallException(e).setHttpResponse(response);
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Connects to the REST resource.
+	 * <p>
+	 * 	If this is a <code>PUT</code> or <code>POST</code>, also sends the input to the remote resource.<br>
+	 * <p>
+	 * 	Typically, you would only call this method if you're not interested in retrieving the body of the HTTP response.
+	 * 	Otherwise, you're better off just calling one of the {@link #getReader()}/{@link #getResponse(Class)}/{@link #pipeTo(Writer)}
+	 * 	methods directly which automatically call this method already.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If an exception or <code>400+</code> HTTP status code occurred during the connection attempt.
+	 */
+	public RestCall connect() throws RestCallException {
+
+		if (isConnected)
+			return this;
+		isConnected = true;
+
+		try {
+			int sc = 0;
+			while (retries > 0) {
+				retries--;
+				Exception ex = null;
+				try {
+			response = client.execute(request);
+					sc = (response == null || response.getStatusLine() == null) ? -1 : response.getStatusLine().getStatusCode();
+				} catch (Exception e) {
+					ex = e;
+					sc = -1;
+					if (response != null)
+						EntityUtils.consumeQuietly(response.getEntity());
+				}
+				if (! retryOn.onCode(sc))
+					retries = 0;
+				if (retries > 0) {
+					for (RestCallInterceptor rci : interceptors)
+						rci.onRetry(this, sc, request, response, ex);
+					request.reset();
+					long w = retryInterval;
+					synchronized(this) {
+						wait(w);
+					}
+				} else if (ex != null) {
+					throw ex;
+				}
+			}
+			for (RestCallInterceptor rci : interceptors)
+				rci.onConnect(this, sc, request, response);
+			if (response == null)
+				throw new RestCallException("HttpClient returned a null response");
+			StatusLine sl = response.getStatusLine();
+			String method = request.getMethod();
+			sc = sl.getStatusCode(); // Read it again in case it was changed by one of the interceptors.
+			if (sc >= 400 && ! ignoreErrors)
+				throw new RestCallException(sc, sl.getReasonPhrase(), method, request.getURI(), getResponseAsString()).setHttpResponse(response);
+			if ((sc == 307 || sc == 302) && allowRedirectsOnPosts && method.equalsIgnoreCase("POST")) {
+				if (redirectOnPostsTries-- < 1)
+					throw new RestCallException(sc, "Maximum number of redirects occurred.  Location header: " + response.getFirstHeader("Location"), method, request.getURI(), getResponseAsString());
+				Header h = response.getFirstHeader("Location");
+				if (h != null) {
+					reset();
+					request.setURI(URI.create(h.getValue()));
+					retries++;  // Redirects should affect retries.
+					connect();
+				}
+			}
+
+		} catch (RestCallException e) {
+			isFailed = true;
+			try {
+			close();
+			} catch (RestCallException e2) { /* Ignore */ }
+			throw e;
+		} catch (Exception e) {
+			isFailed = true;
+			close();
+			throw new RestCallException(e).setHttpResponse(response);
+		}
+
+		return this;
+	}
+
+	private void reset() {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+		request.reset();
+		isConnected = false;
+		isClosed = false;
+		isFailed = false;
+		if (capturedResponseWriter != null)
+			capturedResponseWriter.getBuffer().setLength(0);
+	}
+
+	/**
+	 * Connects to the remote resource (if <code>connect()</code> hasn't already been called) and returns the HTTP response message body as a reader.
+	 * <p>
+	 * 	If an {@link Encoder} has been registered with the {@link RestClient}, then the underlying input stream
+	 * 		will be wrapped in the encoded stream (e.g. a <code>GZIPInputStream</code>).
+	 * <p>
+	 * 	If present, automatically handles the <code>charset</code> value in the <code>Content-Type</code> response header.
+	 * <p>
+	 * 	<b>IMPORTANT:</b>  It is your responsibility to close this reader once you have finished with it.
+	 *
+	 * @return The HTTP response message body reader.  <jk>null</jk> if response was successful but didn't contain a body (e.g. HTTP 204).
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 */
+	public Reader getReader() throws IOException {
+		InputStream is = getInputStream();
+		if (is == null)
+			return null;
+
+		// Figure out what the charset of the response is.
+		String cs = null;
+		Header contentType = response.getLastHeader("Content-Type");
+		String ct = contentType == null ? null : contentType.getValue();
+
+		// First look for "charset=" in Content-Type header of response.
+		if (ct != null && ct.contains("charset="))
+			cs = ct.substring(ct.indexOf("charset=")+8).trim();
+
+		if (cs == null)
+			cs = "UTF-8";
+
+		Reader isr = new InputStreamReader(is, cs);
+
+		if (writers.size() > 0) {
+			StringWriter sw = new StringWriter();
+			writers.add(sw, true);
+			IOPipe.create(isr, writers).byLines(byLines).run();
+			return new StringReader(sw.toString());
+		}
+
+		return new InputStreamReader(is, cs);
+	}
+
+	/**
+	 * Returns the response text as a string if {@link #captureResponse()} was called on this object.
+	 * <p>
+	 * Note that while similar to {@link #getResponseAsString()}, this method can be called multiple times
+	 * 	to retrieve the response text multiple times.
+	 * <p>
+	 * Note that this method returns <jk>null</jk> if you have not called one of the methods that cause
+	 * 	the response to be processed.  (e.g. {@link #run()}, {@link #getResponse()}, {@link #getResponseAsString()}.
+	 *
+	 * @return The captured response, or <jk>null</jk> if {@link #captureResponse()} has not been called.
+	 * @throws IllegalStateException If trying to call this method before the response is consumed.
+	 */
+	public String getCapturedResponse() {
+		if (! isClosed)
+			throw new IllegalStateException("This method cannot be called until the response has been consumed.");
+		if (capturedResponse == null && capturedResponseWriter != null && capturedResponseWriter.getBuffer().length() > 0)
+			capturedResponse = capturedResponseWriter.toString();
+		return capturedResponse;
+	}
+
+	/**
+	 * Returns the parser specified on the client to use for parsing HTTP response bodies.
+	 *
+	 * @return The parser.
+	 * @throws RestCallException If no parser was defined on the client.
+	 */
+	protected Parser<?> getParser() throws RestCallException {
+		if (client.parser == null)
+			throw new RestCallException(0, "No parser defined on client", request.getMethod(), request.getURI(), null);
+		return client.parser;
+	}
+
+	/**
+	 * Returns the serializer specified on the client to use for serializing HTTP request bodies.
+	 *
+	 * @return The serializer.
+	 * @throws RestCallException If no serializer was defined on the client.
+	 */
+	protected Serializer<?> getSerializer() throws RestCallException {
+		if (client.serializer == null)
+			throw new RestCallException(0, "No serializer defined on client", request.getMethod(), request.getURI(), null);
+		return client.serializer;
+	}
+
+	/**
+	 * Returns the value of the <code>Content-Length</code> header.
+	 *
+	 * @return The value of the <code>Content-Length</code> header, or <code>-1</code> if header is not present.
+	 * @throws IOException
+	 */
+	public int getContentLength() throws IOException {
+		connect();
+		Header h = response.getLastHeader("Content-Length");
+		if (h == null)
+			return -1;
+		long l = Long.parseLong(h.getValue());
+		if (l > Integer.MAX_VALUE)
+			return Integer.MAX_VALUE;
+		return (int)l;
+	}
+
+	/**
+	 * Connects to the remote resource (if <code>connect()</code> hasn't already been called) and returns the HTTP response message body as an input stream.
+	 * <p>
+	 * 	If an {@link Encoder} has been registered with the {@link RestClient}, then the underlying input stream
+	 * 		will be wrapped in the encoded stream (e.g. a <code>GZIPInputStream</code>).
+	 * <p>
+	 * 	<b>IMPORTANT:</b>  It is your responsibility to close this reader once you have finished with it.
+	 *
+	 * @return The HTTP response message body input stream. <jk>null</jk> if response was successful but didn't contain a body (e.g. HTTP 204).
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 * @throws IllegalStateException If an attempt is made to read the response more than once.
+	 */
+	public InputStream getInputStream() throws IOException {
+		if (isClosed)
+			throw new IllegalStateException("Method cannot be called.  Response has already been consumed.");
+		connect();
+		if (response == null)
+			throw new RestCallException("Response was null");
+		if (response.getEntity() == null)  // HTTP 204 results in no content.
+			return null;
+		InputStream is = response.getEntity().getContent();
+
+		if (outputStreams.size() > 0) {
+			ByteArrayInOutStream baios = new ByteArrayInOutStream();
+			outputStreams.add(baios, true);
+			IOPipe.create(is, baios).run();
+			return baios.getInputStream();
+		}
+		return is;
+	}
+
+	/**
+	 * Connects to the remote resource (if {@code connect()} hasn't already been called) and returns the HTTP response message body as plain text.
+	 *
+	 * @return The response as a string.
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 */
+	public String getResponseAsString() throws IOException {
+		try {
+			Reader r = getReader();
+			String s = IOUtils.read(r).toString();
+			return s;
+		} catch (IOException e) {
+			isFailed = true;
+			throw e;
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Converts the output from the connection into an object of the specified class using the registered {@link Parser}.
+	 *
+	 * @param type The class to convert the input to.
+	 * @param <T> The class to convert the input to.
+	 * @return The parsed output.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public <T> T getResponse(Class<T> type) throws IOException, ParseException {
+		BeanContext bc = getParser().getBeanContext();
+		if (bc == null)
+			bc = BeanContext.DEFAULT;
+		return getResponse(bc.getClassMeta(type));
+	}
+
+	/**
+	 * Parses the output from the connection into the specified type and then wraps that in a {@link PojoRest}.
+	 * <p>
+	 * Useful if you want to quickly retrieve a single value from inside of a larger JSON document.
+	 *
+	 * @param innerType The class type of the POJO being wrapped.
+	 * @return The parsed output wapped in a {@link PojoRest}.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public PojoRest getResponsePojoRest(Class<?> innerType) throws IOException, ParseException {
+		return new PojoRest(getResponse(innerType));
+	}
+
+	/**
+	 * Converts the output from the connection into an {@link ObjectMap} and then wraps that in a {@link PojoRest}.
+	 * <p>
+	 * Useful if you want to quickly retrieve a single value from inside of a larger JSON document.
+	 *
+	 * @return The parsed output wapped in a {@link PojoRest}.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public PojoRest getResponsePojoRest() throws IOException, ParseException {
+		return getResponsePojoRest(ObjectMap.class);
+	}
+
+	/**
+	 * Convenience method when you want to parse into a Map&lt;K,V&gt; object.
+	 * 
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	Map&lt;String,MyBean&gt; m = client.doGet(url).getResponseMap(LinkedHashMap.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * A simpler approach is often to just extend the map class you want and just use the normal {@link #getResponse(Class)} method:
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyMap <jk>extends</jk> LinkedHashMap&lt;String,MyBean&gt; {}
+	 *
+	 * 	Map&lt;String,MyBean&gt; m = client.doGet(url).getResponse(MyMap.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param mapClass The map class to use (e.g. <code>TreeMap</code>)
+	 * @param keyClass The class type of the keys (e.g. <code>String</code>)
+	 * @param valueClass The class type of the values (e.g. <code>MyBean</code>)
+	 * @return The response parsed as a map.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public final <K,V,T extends Map<K,V>> T getResponseMap(Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getMapClassMeta(mapClass, keyClass, valueClass);
+		return getResponse(cm);
+	}
+
+	/**
+	 * Convenience method when you want to parse into a Collection&lt;E&gt; object.
+	 * 
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	List&lt;MyBean&gt; l = client.doGet(url).getResponseCollection(LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * 			A simpler approach is often to just extend the collection class you want and just use the normal {@link #getResponse(Class)} method:
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyList <jk>extends</jk> LinkedList&lt;MyBean&gt; {}
+	 *
+	 * 	List&lt;MyBean&gt; l = client.doGet(url).getResponse(MyList.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param collectionClass The collection class to use (e.g. <code>LinkedList</code>)
+	 * @param entryClass The class type of the values (e.g. <code>MyBean</code>)
+	 * @return The response parsed as a collection.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public final <E,T extends Collection<E>> T getResponseCollection(Class<T> collectionClass, Class<E> entryClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getCollectionClassMeta(collectionClass, entryClass);
+		return getResponse(cm);
+	}
+
+	<T> T getResponse(ClassMeta<T> type) throws IOException, ParseException {
+		try {
+		Parser<?> p = getParser();
+		T o = null;
+		int contentLength = getContentLength();
+			if (! p.isReaderParser()) {
+			InputStream is = getInputStream();
+			o = ((InputStreamParser)p).parse(is, contentLength, type);
+		} else {
+			Reader r = getReader();
+			o = ((ReaderParser)p).parse(r, contentLength, type);
+			}
+		return o;
+		} catch (ParseException e) {
+			isFailed = true;
+			throw e;
+		} catch (IOException e) {
+			isFailed = true;
+			throw e;
+		} finally {
+			close();
+		}
+	}
+
+	BeanContext getBeanContext() throws RestCallException {
+		BeanContext bc = getParser().getBeanContext();
+		if (bc == null)
+			bc = BeanContext.DEFAULT;
+		return bc;
+	}
+
+	/**
+	 * Returns access to the {@link HttpUriRequest} passed to {@link HttpClient#execute(HttpUriRequest)}.
+	 *
+	 * @return The {@link HttpUriRequest} object.
+	 */
+	public HttpUriRequest getRequest() {
+		return request;
+	}
+
+	/**
+	 * Returns access to the {@link HttpResponse} returned by {@link HttpClient#execute(HttpUriRequest)}.
+	 * Returns <jk>null</jk> if {@link #connect()} has not yet been called.
+	 *
+	 * @return The HTTP response object.
+	 * @throws IOException
+	 */
+	public HttpResponse getResponse() throws IOException {
+		connect();
+		return response;
+	}
+
+	/**
+	 * Shortcut for calling <code>getRequest().setHeader(header)</code>
+	 *
+	 * @param header The header to set on the request.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setHeader(Header header) {
+		request.setHeader(header);
+		return this;
+	}
+
+	/** Use close() */
+	@Deprecated
+	public void consumeResponse() {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+	}
+
+	/**
+	 * Cleans up this HTTP call.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException Can be thrown by one of the {@link RestCallInterceptor#onClose(RestCall)} calls.
+	 */
+	public RestCall close() throws RestCallException {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+		isClosed = true;
+		if (! isFailed)
+			for (RestCallInterceptor r : interceptors)
+				r.onClose(this);
+		return this;
+	}
+
+	/**
+	 * Adds a {@link RestCallLogger} to the list of interceptors on this class.
+	 *
+	 * @param level The log level to log events at.
+	 * @param log The logger.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall logTo(Level level, Logger log) {
+		addInterceptor(new RestCallLogger(level, log));
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallException.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallException.java
new file mode 100755
index 0000000..b0129f4
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallException.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static java.lang.String.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.regex.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Exception representing a <code>400+</code> HTTP response code against a remote resource.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestCallException extends IOException {
+
+	private static final long serialVersionUID = 1L;
+
+	private int responseCode;
+	private String response, responseStatusMessage;
+	HttpResponseException e;
+	private HttpResponse httpResponse;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The exception message.
+	 */
+	public RestCallException(String msg) {
+		super(msg);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param e The inner cause of the exception.
+	 */
+	public RestCallException(Exception e) {
+		super(e.getLocalizedMessage(), e);
+		if (e instanceof FileNotFoundException) {
+			responseCode = 404;
+		} else if (e.getMessage() != null) {
+			Pattern p = Pattern.compile("[^\\d](\\d{3})[^\\d]");
+			Matcher m = p.matcher(e.getMessage());
+			if (m.find())
+				responseCode = Integer.parseInt(m.group(1));
+		}
+		setStackTrace(e.getStackTrace());
+	}
+
+	/**
+	 * Create an exception with a simple message and the status code and body of the specified response.
+	 *
+	 * @param msg The exception message.
+	 * @param response The HTTP response object.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public RestCallException(String msg, HttpResponse response) throws ParseException, IOException {
+		super(format("%s%nstatus='%s'%nResponse: %n%s%n", msg, response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), IOUtils.UTF8)));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param responseCode The response code.
+	 * @param responseMsg The response message.
+	 * @param method The HTTP method (for message purposes).
+	 * @param url The HTTP URL (for message purposes).
+	 * @param response The reponse from the server.
+	 */
+	public RestCallException(int responseCode, String responseMsg, String method, URI url, String response) {
+		super(format("HTTP method '%s' call to '%s' caused response code '%s,%s'.%nResponse: %n%s%n", method, url, responseCode, responseMsg, response));
+		this.responseCode = responseCode;
+		this.responseStatusMessage = responseMsg;
+		this.response = response;
+	}
+
+	/**
+	 * Sets the HTTP response object that caused this exception.
+	 *
+	 * @param httpResponse The HTTP respose object.
+	 * @return This object (for method chaining).
+	 */
+	protected RestCallException setHttpResponse(HttpResponse httpResponse) {
+		this.httpResponse = httpResponse;
+		return this;
+	}
+
+	/**
+	 * Returns the HTTP response object that caused this exception.
+	 *
+	 * @return The HTTP response object that caused this exception, or <jk>null</jk> if no response was created yet when the exception was thrown.
+	 */
+	public HttpResponse getHttpResponse() {
+		return this.httpResponse;
+	}
+
+	/**
+	 * Returns the HTTP response status code.
+	 *
+	 * @return The response status code.  If a connection could not be made at all, returns <code>0<code>.
+	 */
+	public int getResponseCode() {
+		return responseCode;
+	}
+
+	/**
+	 * Returns the HTTP response message body text.
+	 *
+	 * @return The response message body text.
+	 */
+	public String getResponseMessage() {
+		return response;
+	}
+
+	/**
+	 * Returns the response status message as a plain string.
+	 *
+	 * @return The response status message.
+	 */
+	public String getResponseStatusMessage() {
+		return responseStatusMessage;
+	}
+
+	/**
+	 * Sets the inner cause for this exception.
+	 * @param cause The inner cause.
+	 * @return This object (for method chaining).
+	 */
+	@Override /* Throwable */
+	public synchronized RestCallException initCause(Throwable cause) {
+		super.initCause(cause);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallInterceptor.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallInterceptor.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallInterceptor.java
new file mode 100755
index 0000000..52c278b
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallInterceptor.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import org.apache.http.*;
+
+/**
+ * Used to intercept http connection responses to allow modification of that response before processing
+ * and for listening for call lifecycle events.
+ * <p>
+ * Useful if you want to prevent {@link RestCallException RestCallExceptions} from being thrown on error conditions.
+ */
+public abstract class RestCallInterceptor {
+
+	/**
+	 * Called when {@link RestCall} object is created.
+	 *
+	 * @param restCall The restCall object invoking this method.
+	 */
+	public void onInit(RestCall restCall) {}
+
+	/**
+	 * Called immediately after an HTTP response has been received.
+	 *
+	 * @param statusCode The HTTP status code received.
+	 * @param restCall The restCall object invoking this method.
+	 * @param req The HTTP request object.
+	 * @param res The HTTP response object.
+	 */
+	public void onConnect(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res) {}
+
+	/**
+	 * Called if retry is going to be attempted.
+	 *
+	 * @param statusCode The HTTP status code received.
+	 * @param restCall The restCall object invoking this method.
+	 * @param req The HTTP request object.
+	 * @param res The HTTP response object.
+	 * @param ex The exception thrown from the client.
+	 */
+	public void onRetry(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res, Exception ex) {}
+
+	/**
+	 * Called when {@link RestCall#close()} is called.
+	 *
+	 * @param restCall The restCall object invoking this method.
+	 * @throws RestCallException
+	 */
+	public void onClose(RestCall restCall) throws RestCallException {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallLogger.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallLogger.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallLogger.java
new file mode 100755
index 0000000..a0dc722
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestCallLogger.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.text.*;
+import java.util.logging.*;
+
+import org.apache.http.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.util.*;
+
+/**
+ * Specialized interceptor for logging calls to a log file.
+ * <p>
+ * Causes a log entry to be created that shows all the request and response headers and content
+ * 	at the end of the request.
+ * <p>
+ * Use the {@link RestClient#logTo(Level, Logger)} and {@link RestCall#logTo(Level, Logger)}
+ * <p>
+ * methods to create instances of this class.
+ */
+public class RestCallLogger extends RestCallInterceptor {
+
+	private Level level;
+	private Logger log;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param level The log level to log messages at.
+	 * @param log The logger to log to.
+	 */
+	protected RestCallLogger(Level level, Logger log) {
+		this.level = level;
+		this.log = log;
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onInit(RestCall restCall) {
+		if (log.isLoggable(level))
+			restCall.captureResponse();
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onConnect(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res) {
+		// Do nothing.
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onRetry(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res, Exception ex) {
+		if (log.isLoggable(level)) {
+			if (ex == null)
+			log.log(level, MessageFormat.format("Call to {0} returned {1}.  Will retry.", req.getRequestLine().getUri(), statusCode)); //$NON-NLS-1$
+			else
+				log.log(level, MessageFormat.format("Call to {0} caused exception {1}.  Will retry.", req.getRequestLine().getUri(), ex.getLocalizedMessage()), ex); //$NON-NLS-1$
+		}
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onClose(RestCall restCall) throws RestCallException {
+		try {
+			if (log.isLoggable(level)) {
+				String output = restCall.getCapturedResponse();
+				StringBuilder sb = new StringBuilder();
+				HttpUriRequest req = restCall.getRequest();
+				HttpResponse res = restCall.getResponse();
+				if (req != null) {
+					sb.append("\n=== HTTP Call ==================================================================");
+
+					sb.append("\n=== REQUEST ===\n").append(req);
+					sb.append("\n---request headers---");
+					for (Header h : req.getAllHeaders())
+						sb.append("\n").append(h);
+					if (req instanceof HttpEntityEnclosingRequestBase) {
+						sb.append("\n---request entity---");
+						HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
+						HttpEntity e = req2.getEntity();
+						if (e == null)
+							sb.append("\nEntity is null");
+						else {
+							if (e.getContentType() != null)
+								sb.append("\n").append(e.getContentType());
+							if (e.getContentEncoding() != null)
+								sb.append("\n").append(e.getContentEncoding());
+							if (e.isRepeatable()) {
+								try {
+									sb.append("\n---request content---\n").append(EntityUtils.toString(e));
+								} catch (Exception ex) {
+									throw new RuntimeException(ex);
+								}
+							}
+						}
+					}
+				}
+				if (res != null) {
+					sb.append("\n=== RESPONSE ===\n").append(res.getStatusLine());
+					sb.append("\n---response headers---");
+					for (Header h : res.getAllHeaders())
+						sb.append("\n").append(h);
+					sb.append("\n---response content---\n").append(output);
+					sb.append("\n=== END ========================================================================");
+				}
+				log.log(level, sb.toString());
+			}
+		} catch (IOException e) {
+			log.log(Level.SEVERE, e.getLocalizedMessage(), e);
+		}
+	}
+}



[36/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B1.class
new file mode 100755
index 0000000..3e53a6d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B2.class
new file mode 100755
index 0000000..b5c273f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C1.class
new file mode 100755
index 0000000..b2c48fd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C2.class
new file mode 100755
index 0000000..fa39b9e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html.class
new file mode 100755
index 0000000..78e590a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/html/CT_Html.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$1.class
new file mode 100755
index 0000000..4f3f469
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$2.class
new file mode 100755
index 0000000..e1565e6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$3.class
new file mode 100755
index 0000000..5f206f6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$4.class
new file mode 100755
index 0000000..43644d0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$5.class
new file mode 100755
index 0000000..52dd1d5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$6.class
new file mode 100755
index 0000000..4f344c6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$7.class
new file mode 100755
index 0000000..e71f428
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$8.class
new file mode 100755
index 0000000..1f488a6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$9.class
new file mode 100755
index 0000000..57437e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$A.class
new file mode 100755
index 0000000..7594f7a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$B.class
new file mode 100755
index 0000000..300e876
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile.class
new file mode 100755
index 0000000..a1d6996
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigFile.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr$1.class
new file mode 100755
index 0000000..0ae6f06
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr.class
new file mode 100755
index 0000000..f103ba9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/ini/CT_ConfigMgr.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$A.class
new file mode 100755
index 0000000..234b338
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B$1.class
new file mode 100755
index 0000000..a1dd60a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B.class
new file mode 100755
index 0000000..482c533
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C$1.class
new file mode 100755
index 0000000..ccfeac7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C.class
new file mode 100755
index 0000000..25b3813
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$D.class
new file mode 100755
index 0000000..6bceca1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$1.class
new file mode 100755
index 0000000..99090af
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$2.class
new file mode 100755
index 0000000..59a5506
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$3.class
new file mode 100755
index 0000000..47c8572
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1.class
new file mode 100755
index 0000000..9a3aca1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E2.class
new file mode 100755
index 0000000..b05fb1a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$F.class
new file mode 100755
index 0000000..5b53868
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$G.class
new file mode 100755
index 0000000..16b74da
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R1.class
new file mode 100755
index 0000000..228f395
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R2.class
new file mode 100755
index 0000000..9c21dab
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R3.class
new file mode 100755
index 0000000..a6a3df6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common.class
new file mode 100755
index 0000000..e3416c3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Common.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$1.class
new file mode 100755
index 0000000..dd91b2b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A1.class
new file mode 100755
index 0000000..3cf7b9e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A2.class
new file mode 100755
index 0000000..28f4f7a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A3.class
new file mode 100755
index 0000000..cea48c5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$B.class
new file mode 100755
index 0000000..7808d93
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$C.class
new file mode 100755
index 0000000..dfec14a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser.class
new file mode 100755
index 0000000..580627c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$A.class
new file mode 100755
index 0000000..f491965
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$B.class
new file mode 100755
index 0000000..069d706
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml.class
new file mode 100755
index 0000000..92d61b8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_CommonXml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$A.class
new file mode 100755
index 0000000..c5e6557
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$B.class
new file mode 100755
index 0000000..194337d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BA.class
new file mode 100755
index 0000000..767278a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BB.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BB.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BB.class
new file mode 100755
index 0000000..9208f73
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BB.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BC.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BC.class
new file mode 100755
index 0000000..6cb10c0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BD.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BD.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BD.class
new file mode 100755
index 0000000..5d754a2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BD.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BE.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BE.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BE.class
new file mode 100755
index 0000000..64f5034
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$BE.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$C.class
new file mode 100755
index 0000000..3995a34
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$D.class
new file mode 100755
index 0000000..f6ceaa6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf.class
new file mode 100755
index 0000000..4333c46
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_Rdf.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A.class
new file mode 100755
index 0000000..8eefa0f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A1.class
new file mode 100755
index 0000000..fef1ac8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser.class
new file mode 100755
index 0000000..cfb54c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/jena/CT_RdfParser.class differ


[24/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.java
new file mode 100755
index 0000000..47c6826
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaProperty.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+/**
+ * Represents a JSON property in the JSON-Schema core specification.
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.jsonschema} for usage information.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SchemaProperty extends Schema {
+
+	/**
+	 * Default constructor.
+	 */
+	public SchemaProperty() {}
+
+	/**
+	 * Convenience constructor.
+	 *
+	 * @param name The name of this property.
+	 */
+	public SchemaProperty(String name) {
+		setName(name);
+	}
+
+	/**
+	 * Convenience constructor.
+	 *
+	 * @param name The name of this property.
+	 * @param type The JSON type of this property.
+	 */
+	public SchemaProperty(String name, JsonType type) {
+		setName(name);
+		setType(type);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.class
new file mode 100755
index 0000000..6bc08cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.java
new file mode 100755
index 0000000..d611ca8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaPropertySimpleArray.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+/**
+ * Convenience class for representing a property that's an array of simple types.
+ * <p>
+ * 	An instance of this object is equivalent to calling...
+ *
+ * <p class='bcode'>
+ * 	SchemaProperty p = <jk>new</jk> SchemaProperty(name)
+ * 		.setType(JsonType.<jsf>ARRAY</jsf>)
+ * 		.setItems(
+ * 			<jk>new</jk> Schema().setType(elementType)
+ * 		);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SchemaPropertySimpleArray extends SchemaProperty {
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the schema property.
+	 * @param elementType The JSON type of the elements in the array.
+	 */
+	public SchemaPropertySimpleArray(String name, JsonType elementType) {
+		setName(name);
+		setType(JsonType.ARRAY);
+		setItems(
+			new Schema().setType(elementType)
+		);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.class
new file mode 100755
index 0000000..3537129
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.java
new file mode 100755
index 0000000..9bbbf03
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/SchemaRef.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.jsonschema;
+
+import java.net.*;
+
+/**
+ * Convenience class for representing a schema reference such as <js>"{'$ref':'/url/to/ref'}"</js>.
+ * <p>
+ * 	An instance of this object is equivalent to calling...
+ *
+ * <p class='bcode'>
+ * 	Schema s = <jk>new</jk> Schema().setRef(uri);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SchemaRef extends Schema {
+
+	/**
+	 * Constructor.
+	 *
+	 * @param uri The URI of the target reference.  Can be <jk>null</jk>.
+	 */
+	public SchemaRef(String uri) {
+		this.setRef(uri == null ? null : URI.create(uri));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Html.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Html.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Html.png
new file mode 100755
index 0000000..3848b4f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Html.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Json.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Json.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Json.png
new file mode 100755
index 0000000..6c8ddd1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Json.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Options.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Options.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Options.png
new file mode 100755
index 0000000..5250d3b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Options.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Turtle.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Turtle.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Turtle.png
new file mode 100755
index 0000000..478de82
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Turtle.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_UrlEncoded.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_UrlEncoded.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_UrlEncoded.png
new file mode 100755
index 0000000..86576e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_UrlEncoded.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Xml.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Xml.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Xml.png
new file mode 100755
index 0000000..0195c5a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_Xml.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_XmlRdfAbbrev.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_XmlRdfAbbrev.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_XmlRdfAbbrev.png
new file mode 100755
index 0000000..129f9df
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/doc-files/Example_XmlRdfAbbrev.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/package.html
new file mode 100755
index 0000000..1034f18
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/jsonschema/package.html
@@ -0,0 +1,511 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>JSON-Schema Data Transfer Objects</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>Overview</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#SchemaDefinition'>JSON-Schema schema definition</a></p>
+		<li><p><a class='doclink' href='#Serialize'>Creating JSON-Schema documents</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#SerializeToOther'>Serializing to other data types</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Parse'>Parsing JSON-Schema documents</a></p>
+	</ol>
+</ol>
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports serializing and parsing of JSON-Schema documents through the use of beans defined in the <code>com.ibm.juno.core.dto.jsonschema</code> package.<br>
+		These beans are used with the existing {@link com.ibm.juno.core.json.JsonSerializer} and {@link com.ibm.juno.core.json.JsonParser} classes to produce and consume JSON-Schema documents. 
+	</p>
+	<p>
+		<b>NOTE:</b>  JSON-Schema is currently in draft form.  This API may change as the JSON-Schema specification changes.
+	</p>
+	
+	<!-- ======================================================================================================== -->
+	<a id="SchemaDefinition"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - JSON-Schema schema definition</h3>
+	<div class='topic'>
+		<p>
+			The draft JSON-Schema specification that the JSON-Schema beans are modeled after is as follows:
+		</p>
+		<p class='bcode'>
+	{
+	    <js>"id"</js>: <js>"http://json-schema.org/draft-04/schema#"</js>,
+	    <js>"$schema"</js>: <js>"http://json-schema.org/draft-04/schema#"</js>,
+	    <js>"description"</js>: <js>"Core schema meta-schema"</js>,
+	    <js>"definitions"</js>: {
+	        <js>"schemaArray"</js>: {
+	            <js>"type"</js>: <js>"array"</js>,
+	            <js>"minItems"</js>: 1,
+	            <js>"items"</js>: { <js>"$ref"</js>: <js>"#"</js> }
+	        },
+	        <js>"positiveInteger"</js>: {
+	            <js>"type"</js>: <js>"integer"</js>,
+	            <js>"minimum"</js>: 0
+	        },
+	        <js>"positiveIntegerDefault0"</js>: {
+	            <js>"allOf"</js>: [ { <js>"$ref"</js>: <js>"#/definitions/positiveInteger"</js> }, { <js>"default"</js>: 0 } ]
+	        },
+	        <js>"simpleTypes"</js>: {
+	            <js>"enum"</js>: [ <js>"array"</js>, <js>"boolean"</js>, <js>"integer"</js>, <js>"null"</js>, <js>"number"</js>, <js>"object"</js>, <js>"string"</js> ]
+	        },
+	        <js>"stringArray"</js>: {
+	            <js>"type"</js>: <js>"array"</js>,
+	            <js>"items"</js>: { <js>"type"</js>: <js>"string"</js> },
+	            <js>"minItems"</js>: 1,
+	            <js>"uniqueItems"</js>: <jk>true</jk>
+	        }
+	    },
+	    <js>"type"</js>: <js>"object"</js>,
+	    <js>"properties"</js>: {
+	        <js>"id"</js>: {
+	            <js>"type"</js>: <js>"string"</js>,
+	            <js>"format"</js>: <js>"uri"</js>
+	        },
+	        <js>"$schema"</js>: {
+	            <js>"type"</js>: <js>"string"</js>,
+	            <js>"format"</js>: <js>"uri"</js>
+	        },
+	        <js>"title"</js>: {
+	            <js>"type"</js>: <js>"string"</js>
+	        },
+	        <js>"description"</js>: {
+	            <js>"type"</js>: <js>"string"</js>
+	        },
+	        <js>"default"</js>: {},
+	        <js>"multipleOf"</js>: {
+	            <js>"type"</js>: <js>"number"</js>,
+	            <js>"minimum"</js>: 0,
+	            <js>"exclusiveMinimum"</js>: <jk>true</jk>
+	        },
+	        <js>"maximum"</js>: {
+	            <js>"type"</js>: <js>"number"</js>
+	        },
+	        <js>"exclusiveMaximum"</js>: {
+	            <js>"type"</js>: <js>"boolean"</js>,
+	            <js>"default"</js>: <jk>false</jk>
+	        },
+	        <js>"minimum"</js>: {
+	            <js>"type"</js>: <js>"number"</js>
+	        },
+	        <js>"exclusiveMinimum"</js>: {
+	            <js>"type"</js>: <js>"boolean"</js>,
+	            <js>"default"</js>: <jk>false</jk>
+	        },
+	        <js>"maxLength"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveInteger"</js> },
+	        <js>"minLength"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveIntegerDefault0"</js> },
+	        <js>"pattern"</js>: {
+	            <js>"type"</js>: <js>"string"</js>,
+	            <js>"format"</js>: <js>"regex"</js>
+	        },
+	        <js>"additionalItems"</js>: {
+	            <js>"anyOf"</js>: [
+	                { <js>"type"</js>: <js>"boolean"</js> },
+	                { <js>"$ref"</js>: <js>"#"</js> }
+	            ],
+	            <js>"default"</js>: {}
+	        },
+	        <js>"items"</js>: {
+	            <js>"anyOf"</js>: [
+	                { <js>"$ref"</js>: <js>"#"</js> },
+	                { <js>"$ref"</js>: <js>"#/definitions/schemaArray"</js> }
+	            ],
+	            <js>"default"</js>: {}
+	        },
+	        <js>"maxItems"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveInteger"</js> },
+	        <js>"minItems"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveIntegerDefault0"</js> },
+	        <js>"uniqueItems"</js>: {
+	            <js>"type"</js>: <js>"boolean"</js>,
+	            <js>"default"</js>: <jk>false</jk>
+	        },
+	        <js>"maxProperties"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveInteger"</js> },
+	        <js>"minProperties"</js>: { <js>"$ref"</js>: <js>"#/definitions/positiveIntegerDefault0"</js> },
+	        <js>"required"</js>: { <js>"$ref"</js>: <js>"#/definitions/stringArray"</js> },
+	        <js>"additionalProperties"</js>: {
+	            <js>"anyOf"</js>: [
+	                { <js>"type"</js>: <js>"boolean"</js> },
+	                { <js>"$ref"</js>: <js>"#"</js> }
+	            ],
+	            <js>"default"</js>: {}
+	        },
+	        <js>"definitions"</js>: {
+	            <js>"type"</js>: <js>"object"</js>,
+	            <js>"additionalProperties"</js>: { <js>"$ref"</js>: <js>"#"</js> },
+	            <js>"default"</js>: {}
+	        },
+	        <js>"properties"</js>: {
+	            <js>"type"</js>: <js>"object"</js>,
+	            <js>"additionalProperties"</js>: { <js>"$ref"</js>: <js>"#"</js> },
+	            <js>"default"</js>: {}
+	        },
+	        <js>"patternProperties"</js>: {
+	            <js>"type"</js>: <js>"object"</js>,
+	            <js>"additionalProperties"</js>: { <js>"$ref"</js>: <js>"#"</js> },
+	            <js>"default"</js>: {}
+	        },
+	        <js>"dependencies"</js>: {
+	            <js>"type"</js>: <js>"object"</js>,
+	            <js>"additionalProperties"</js>: {
+	                <js>"anyOf"</js>: [
+	                    { <js>"$ref"</js>: <js>"#"</js> },
+	                    { <js>"$ref"</js>: <js>"#/definitions/stringArray"</js> }
+	                ]
+	            }
+	        },
+	        <js>"enum"</js>: {
+	            <js>"type"</js>: <js>"array"</js>,
+	            <js>"minItems"</js>: 1,
+	            <js>"uniqueItems"</js>: <jk>true</jk>
+	        },
+	        <js>"type"</js>: {
+	            <js>"anyOf"</js>: [
+	                { <js>"$ref"</js>: <js>"#/definitions/simpleTypes"</js> },
+	                {
+	                    <js>"type"</js>: <js>"array"</js>,
+	                    <js>"items"</js>: { <js>"$ref"</js>: <js>"#/definitions/simpleTypes"</js> },
+	                    <js>"minItems"</js>: 1,
+	                    <js>"uniqueItems"</js>: <jk>true</jk>
+	                }
+	            ]
+	        },
+	        <js>"allOf"</js>: { <js>"$ref"</js>: <js>"#/definitions/schemaArray"</js> },
+	        <js>"anyOf"</js>: { <js>"$ref"</js>: <js>"#/definitions/schemaArray"</js> },
+	        <js>"oneOf"</js>: { <js>"$ref"</js>: <js>"#/definitions/schemaArray"</js> },
+	        <js>"not"</js>: { <js>"$ref"</js>: <js>"#"</js> }
+	    },
+	    <js>"dependencies"</js>: {
+	        <js>"exclusiveMaximum"</js>: [ <js>"maximum"</js> ],
+	        <js>"exclusiveMinimum"</js>: [ <js>"minimum"</js> ]
+	    },
+	    <js>"default"</js>: {}
+	}
+		</p>
+		<p>
+			The bean classes that make up the model are as follows:
+		</p>
+		<ul>
+			<li>{@link com.ibm.juno.core.dto.jsonschema.Schema} - Top level schema object.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.SchemaProperty} - A subclass of <code>Schema</code> for representing properties.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.SchemaPropertySimpleArray} - A convenience subclass of <code>SchemaProperty</code> for representing properties of simple array types.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.SchemaRef} - Represents a URI reference to another schema.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.SchemaArray} - An array of <code>Schema</code> objects.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.JsonType} - An enum of possible JSON data types.
+			<li>{@link com.ibm.juno.core.dto.jsonschema.JsonTypeArray} - An array of <code>JsonType</code> objects.
+		</ul>
+	</div>	
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Serialize"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - Creating JSON-Schema documents</h3>
+	<div class='topic'>
+		<p>
+			JSON-Schema documents can be constructed using the Juno JSON-Schema beans as a document model object.
+			These beans are defined with fluent-style setters to make constructing documents as easy as possible.
+		</p>
+		<p>
+			The following is an example JSON-Schema document:
+		</p>
+		<p class='bcode'>
+	{
+		<js>"title"</js>: <js>"Example Schema"</js>,
+		<js>"type"</js>: <js>"object"</js>,
+		<js>"properties"</js>: {
+			<js>"firstName"</js>: {
+				<js>"type"</js>: <js>"string"</js>
+			},
+			<js>"lastName"</js>: {
+				<js>"type"</js>: <js>"string"</js>
+			},
+			<js>"age"</js>: {
+				<js>"description"</js>: <js>"Age in years"</js>,
+				<js>"type"</js>: <js>"integer"</js>,
+				<js>"minimum"</js>: 0
+			}
+		},
+		<js>"required"</js>: [<js>"firstName"</js>, <js>"lastName"</js>]
+	}		
+		</p>
+		<p>
+			This document can be constructing using the following code:
+		</p>
+		<p class='bcode'>
+	<jc>// Create the document object model</jc>
+	Schema s = <jk>new</jk> Schema()
+		.setTitle(<js>"Example Schema"</js>)
+		.setType(JsonType.<jsf>OBJECT</jsf>)
+		.addProperties(
+			<jk>new</jk> SchemaProperty(<js>"firstName"</js>, JsonType.<jsf>STRING</jsf>),
+			<jk>new</jk> SchemaProperty(<js>"lastName"</js>, JsonType.<jsf>STRING</jsf>),
+			<jk>new</jk> SchemaProperty(<js>"age"</js>, JsonType.<jsf>INTEGER</jsf>)
+				.setDescription(<js>"Age in years"</js>)
+				.setMinimum(0)
+		)
+		.addRequired(<js>"firstName"</js>, <js>"lastName"</js>);
+		
+	<jc>// Serialize to JSON</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(s);
+		</p>	
+		<p>
+			The following is a more-complex example showing various kinds of constraints.
+		</p>		
+		<p class='bcode'>
+	{
+	    <js>"id"</js>: <js>"http://some.site.somewhere/entry-schema#"</js>,
+	    <js>"$schema"</js>: <js>"http://json-schema.org/draft-04/schema#"</js>,
+	    <js>"description"</js>: <js>"schema for an fstab entry"</js>,
+	    <js>"type"</js>: <js>"object"</js>,
+	    <js>"required"</js>: [ <js>"storage"</js> ],
+	    <js>"properties"</js>: {
+	        <js>"storage"</js>: {
+	            <js>"type"</js>: <js>"object"</js>,
+	            <js>"oneOf"</js>: [
+	                { <js>"$ref"</js>: <js>"#/definitions/diskDevice"</js> },
+	                { <js>"$ref"</js>: <js>"#/definitions/diskUUID"</js> },
+	                { <js>"$ref"</js>: <js>"#/definitions/nfs"</js> },
+	                { <js>"$ref"</js>: <js>"#/definitions/tmpfs"</js> }
+	            ]
+	        },
+	        <js>"fstype"</js>: {
+	            <js>"enum"</js>: [ <js>"ext3"</js>, <js>"ext4"</js>, <js>"btrfs"</js> ]
+	        },
+	        <js>"options"</js>: {
+	            <js>"type"</js>: <js>"array"</js>,
+	            <js>"minItems"</js>: 1,
+	            <js>"items"</js>: { <js>"type"</js>: <js>"string"</js> },
+	            <js>"uniqueItems"</js>: <jk>true</jk>
+	        },
+	        <js>"readonly"</js>: { <js>"type"</js>: <js>"boolean"</js> }
+	    },
+	    <js>"definitions"</js>: {
+	        <js>"diskDevice"</js>: {},
+	        <js>"diskUUID"</js>: {},
+	        <js>"nfs"</js>: {},
+	        <js>"tmpfs"</js>: {}
+	    }
+	}
+		</p>
+		<p>
+			This document can be constructing using the following code:
+		</p>
+		<p class='bcode'>
+	Schema s = <jk>new</jk> Schema()
+		.setId(<js>"http://some.site.somewhere/entry-schema#"</js>)
+		.setSchemaVersionId(<js>"http://json-schema.org/draft-04/schema#"</js>)
+		.setDescription(<js>"schema for an fstab entry"</js>)
+		.setType(JsonType.<jsf>OBJECT</jsf>)
+		.addRequired(<js>"storage"</js>)
+		.addProperties(
+			<jk>new</jk> SchemaProperty(<js>"storage"</js>)
+				.setType(JsonType.<jsf>OBJECT</jsf>)
+				.addOneOf(
+					<jk>new</jk> SchemaRef(<js>"#/definitions/diskDevice"</js>),
+					<jk>new</jk> SchemaRef(<js>"#/definitions/diskUUID"</js>),
+					<jk>new</jk> SchemaRef(<js>"#/definitions/nsf"</js>),
+					<jk>new</jk> SchemaRef(<js>"#/definitions/tmpfs"</js>)
+				),
+			<jk>new</jk> SchemaProperty(<js>"fstype"</js>)
+				.addEnum(<js>"ext3"</js>, <js>"ext4"</js>, <js>"btrfs"</js>),
+			<jk>new</jk> SchemaPropertySimpleArray(<js>"options"</js>, JsonType.<jsf>STRING</jsf>)
+				.setMinItems(1)
+				.setUniqueItems(<jk>true</jk>),
+			<jk>new</jk> SchemaProperty(<js>"readonly"</js>)
+				.setType(JsonType.<jsf>BOOLEAN</jsf>)
+		)
+		.addDefinition(<js>"diskDevice"</js>,
+			<jk>new</jk> Schema()
+		)
+		.addDefinition(<js>"diskUUID"</js>,
+			<jk>new</jk> Schema()
+		)
+		.addDefinition(<js>"nfs"</js>,
+			<jk>new</jk> Schema()
+		)
+		.addDefinition(<js>"tmpfs"</js>,
+			<jk>new</jk> Schema()
+		);
+
+	<jc>// Serialize to JSON</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(s);
+		</p>
+	
+	
+		<!-- ======================================================================================================== -->
+		<a id="SerializeToOther"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.1 - Serializing to other data types</h4>
+		<div class='topic'>
+			<p>
+				Since the JSON-Schema DTOs are simple beans, they can be used to serialize to a variety of other language types as well as JSON.
+				This also allows JSON-Schema documents to be easily served up using the Juno REST API.
+			</p>
+			<p>
+				The sample web application includes a REST resource that generates a JSON-Schema document.  
+				We'll use this resource to show what the JSON-Schema document looks like in other languages.
+			</p>
+			<p class='bcode'>
+	<jd>/**
+	 * Sample resource that shows how to serialize JSON-Schema documents.
+	 */</jd>
+	<ja>@RestResource</ja>(
+		path=<js>"/jsonSchema"</js>,
+		messages=<js>"nls/JsonSchemaResource"</js>,
+		properties={
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"Sample JSON-Schema document"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS'}"</js>)
+		}
+	)
+	<jk>public class</jk> JsonSchemaResource <jk>extends</jk> RestServletJenaDefault {
+	
+		<jk>private</jk> Schema <jf>schema</jf>;     <jc>// The schema document</jc>
+		
+		<jd>/** Servlet initialization */</jd> 
+		<ja>@Override</ja>
+		<jk>public void</jk> init() {
+	
+			<jk>try</jk> {
+				<jf>schema</jf> = <jk>new</jk> Schema()
+					.setId(<js>"http://example.com/sample-schema#"</js>)
+					.setSchemaVersionUri(<js>"http://json-schema.org/draft-04/schema#"</js>)
+					.setTitle(<js>"Example Schema"</js>)
+					.setType(JsonType.<jsf>OBJECT</jsf>)
+					.addProperties(
+						<jk>new</jk> SchemaProperty(<js>"firstName"</js>, JsonType.<jsf>STRING</jsf>),
+						<jk>new</jk> SchemaProperty(<js>"lastName"</js>, JsonType.<jsf>STRING</jsf>),
+						<jk>new</jk> SchemaProperty(<js>"age"</js>, JsonType.<jsf>INTEGER</jsf>)
+							.setDescription(<js>"Age in years"</js>)
+							.setMinimum(0)
+					)
+					.addRequired(<js>"firstName"</js>, <js>"lastName"</js>);
+			} <jk>catch</jk> (Exception e) {
+				<jk>throw new</jk> RuntimeException(e);
+			}
+		}
+		
+		<jd>/** GET request handler */</jd>
+		<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/"</js>)
+		<jk>public</jk> Schema getSchema() <jk>throws</jk> Exception {
+			<jk>return</jk> <jf>schema</jf>;
+		}
+		
+		<jd>/** 
+		 * PUT request handler.
+		 * Replaces the schema document with the specified content, and then mirrors it as the response. 
+		 */</jd>
+		<ja>@RestMethod</ja>(name=<js>"PUT"</js>, path=<js>"/"</js>)
+		<jk>public</jk> Schema setSchema(<ja>@Content</ja> Schema schema) <jk>throws</jk> Exception {
+			<jk>this</jk>.<jf>schema</jf> = schema;
+			<jk>return</jk> <jk>this</jk>.<jf>schema</jf>;
+		}
+	
+		<jd>/** OPTIONS request handler */</jd>
+	 	<ja>@RestMethod</ja>(name=<js>"OPTIONS"</js>, path=<js>"/*"</js>)
+		<jk>public</jk> ResourceOptions doOptions(RestRequest req) {
+			<jk>return new</jk> ResourceOptions(<jk>this</jk>, req);
+		}
+	}
+			</p>
+			<p>
+				When you point your browser to this resource, the default content type is HTML (since that's what the browser asks for
+				by default).
+			</p>
+			<h6 class='figure'>HTML</h6>
+			<img class='bordered' src="doc-files/Example_Html.png">
+			<p>
+				The REST API allows you to specify the <code>Accept</code> header as a GET parameter, and the <code>plainText=true</code>
+					parameter forces the returned <code>Content-Type</code> to be <code>text/plain</code>.
+				We'll use this to view the JSON-Schema document in other languages.
+			</p>			
+			
+			<h6 class='figure'>Normal JSON</h6>
+			<img class='bordered' src="doc-files/Example_Json.png">
+			
+			<h6 class='figure'>XML</h6>
+			<img class='bordered' src="doc-files/Example_Xml.png">
+
+			<h6 class='figure'>URL-Encoded</h6>
+			<img class='bordered' src="doc-files/Example_UrlEncoded.png">
+
+			<h6 class='figure'>Abbreviated RDF/XML</h6>
+			<img class='bordered' src="doc-files/Example_XmlRdfAbbrev.png">
+
+			<h6 class='figure'>Turtle</h6>
+			<img class='bordered' src="doc-files/Example_Turtle.png">
+			
+			<p>
+				The full list of options for this resource can be accessed by the <code>options</code> link on the HTML page.
+			</p>
+			
+			<h6 class='figure'>Resource Options</h6>
+			<img class='bordered' src="doc-files/Example_Options.png">
+		</div>	
+		
+	<!-- ======================================================================================================== -->
+	<a id="Parse"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - Parsing JSON-Schema documents</h3>
+	<div class='topic'>
+		<p>
+			Use the {@link com.ibm.juno.core.json.JsonParser} to parse JSON-Schema documents into DTOs:
+		</p>
+		<p class='bcode'>		
+	<jc>// Use parser to load JSON-Schema document into JSON-Schema DTOs</jc>
+	Schema schema = JsonParser.<jsf>DEFAULT</jsf>.parse(json, Schema.<jk>class</jk>);
+		</p>
+		<p>
+			Schema objects can also be constructed from the other media types using the appropriate parsers.
+		</p>
+	</div>
+
+</div>
+<p align="center"><i><b>*** f�n ***</b></i></p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/package.html
new file mode 100755
index 0000000..9f97884
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Data transfer objects</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.class
new file mode 100755
index 0000000..79acd6a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.java
new file mode 100755
index 0000000..abe8e5d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/Encoder.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.encoders;
+
+import java.io.*;
+
+/**
+ * Used for enabling decompression on requests and compression on responses, such as support for GZIP compression.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Used to wrap input and output streams withing compression/decompression streams.
+ * <p>
+ * 	Encoders are registered with <code>RestServlets</code> through the <ja>@RestResource.encoders()</ja> annotation.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class Encoder {
+
+	/**
+	 * Converts the specified compressed input stream into an uncompressed stream.
+	 *
+	 * @param is The compressed stream.
+	 * @return The uncompressed stream.
+	 * @throws IOException If any errors occur, such as on a stream that's not a valid GZIP input stream.
+	 */
+	public abstract InputStream getInputStream(InputStream is) throws IOException;
+
+	/**
+	 * Converts the specified uncompressed output stream into an uncompressed stream.
+	 *
+	 * @param os The uncompressed stream.
+	 * @return The compressed stream stream.
+	 * @throws IOException If any errors occur.
+	 */
+	public abstract OutputStream getOutputStream(OutputStream os) throws IOException;
+
+	/**
+	 * Returns the codings in <code>Content-Encoding</code> and <code>Accept-Encoding</code> headers
+	 * 	that this encoder handles (e.g. <js>"gzip"</js>).
+	 *
+	 * @return The codings that this encoder handles.
+	 */
+	public abstract String[] getCodings();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup$EncoderEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup$EncoderEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup$EncoderEntry.class
new file mode 100755
index 0000000..45e34e1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup$EncoderEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.class
new file mode 100755
index 0000000..b6a78a4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.java
new file mode 100755
index 0000000..0106432
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/EncoderGroup.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.encoders;
+
+import static com.ibm.juno.core.utils.ArrayUtils.*;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents the group of {@link Encoder encoders} keyed by codings.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Maintains a set of encoders and the codings that they can handle.
+ * <p>
+ * 	The {@link #findMatch(String)} and {@link #getEncoder(String)} methods are then
+ * 		used to find appropriate encoders for specific <code>Accept-Encoding</code>
+ * 		and <code>Content-Encoding</code> header values.
+ *
+ *
+ * <h6 class='topic'>Match ordering</h6>
+ * <p>
+ * 	Encoders are matched against <code>Accept-Encoding</code> strings in the order they exist in this group.
+ * <p>
+ * 	Adding new entries will cause the entries to be prepended to the group.
+ *  	This allows for previous encoders to be overridden through subsequent calls.
+ * <p>
+ * 	For example, calling <code>g.append(E1.<jk>class</jk>,E2.<jk>class</jk>).append(E3.<jk>class</jk>,E4.<jk>class</jk>)</code>
+ * 	will result in the order <code>E3, E4, E1, E2</code>.
+ *
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	<jc>// Create an encoder group with support for gzip compression.</jc>
+ * 	EncoderGroup g = <jk>new</jk> EncoderGroup().append(GzipEncoder.<jk>class</jk>);
+ *
+ * 	<jc>// Should return "gzip"</jc>
+ * 	String matchedCoding = g.findMatch(<js>"compress;q=1.0, gzip;q=0.8, identity;q=0.5, *;q=0"</js>);
+ *
+ * 	<jc>// Get the encoder</jc>
+ * 	IEncoder encoder = g.getEncoder(matchedCoding);
+ * </p>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class EncoderGroup {
+
+	private Map<String,EncoderEntry> entryMap = new TreeMap<String,EncoderEntry>(String.CASE_INSENSITIVE_ORDER);
+	private LinkedList<EncoderEntry> tempEntries = new LinkedList<EncoderEntry>();
+	private EncoderEntry[] entries;
+
+	/**
+	 * Returns the coding string for the matching encoder that can handle the specified <code>Accept-Encoding</code>
+	 * 	or <code>Content-Encoding</code> header value.
+	 * <p>
+	 * 	Returns <jk>null</jk> if no encoders can handle it.
+	 * <p>
+	 * 	This method is fully compliant with the RFC2616/14.3 and 14.11 specifications.
+	 *
+	 * @param acceptEncoding The <code>Accept-Encoding</code> or <code>Content-Encoding</code> value.
+	 * @return The coding value (e.g. <js>"gzip"</js>).
+	 */
+	public String findMatch(String acceptEncoding) {
+		if (getEntries().length == 0)
+			return null;
+
+		MediaRange[] ae = MediaRange.parse(acceptEncoding);
+
+		if (ae.length == 0)
+			ae = MediaRange.parse("*");
+
+		for (MediaRange a : ae)
+			for (EncoderEntry e : getEntries())
+				for (MediaRange a2 : e.encodingRanges)
+					if (a.matches(a2))
+						return a2.getType();
+
+		return null;
+	}
+
+	/**
+	 * Adds the specified encoders to this group.
+	 *
+	 * @param e The encoders to instantiate and add to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception If an instantiation error occurred.
+	 */
+	public EncoderGroup append(Class<? extends Encoder>...e) throws Exception {
+		for (Class<? extends Encoder> r : reverse(e))
+			append(r.newInstance());
+		return this;
+	}
+
+	/**
+	 * Adds the specified encoders to this group.
+	 *
+	 * @param e The encoder to instantiate and add to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception If an instantiation error occurred.
+	 */
+	public EncoderGroup append(Class<? extends Encoder> e) throws Exception {
+		append(e.newInstance());
+		return this;
+	}
+
+	/**
+	 * Adds the specified encoders to this group.
+	 *
+	 * @param e The encoders to add to this group.
+	 * @return This object (for method chaining).
+	 */
+	public EncoderGroup append(Encoder...e) {
+		entries = null;
+		for (Encoder r : reverse(e)) {
+			EncoderEntry ee = new EncoderEntry(r);
+			tempEntries.addFirst(ee);
+			for (String s : ee.encodings)
+				this.entryMap.put(s, ee);
+		}
+		return this;
+	}
+
+	/**
+	 * Adds the encoders in the specified group to this group.
+	 *
+	 * @param g The group containing the encoders to add to this group.
+	 * @return This object (for method chaining).
+	 */
+	public EncoderGroup append(EncoderGroup g) {
+		for (EncoderEntry e : reverse(g.getEntries()))
+			append(e.encoder);
+		return this;
+	}
+
+	/**
+	 * Returns the encoder registered with the specified coding (e.g. <js>"gzip"</js>).
+	 *
+	 * @param coding The coding string.
+	 * @return The encoder, or <jk>null</jk> if encoder isn't registered with that coding.
+	 */
+	public Encoder getEncoder(String coding) {
+		EncoderEntry e = entryMap.get(coding);
+		return (e == null ? null : e.encoder);
+	}
+
+	/**
+	 * Returns the set of codings supported by all encoders in this group.
+	 *
+	 * @return The set of codings supported by all encoders in this group.  Never <jk>null</jk>.
+	 */
+	public List<String> getSupportedEncodings() {
+		List<String> l = new ArrayList<String>();
+		for (EncoderEntry e : getEntries())
+			for (String enc : e.encodings)
+				if (! l.contains(enc))
+					l.add(enc);
+		return l;
+	}
+
+	private EncoderEntry[] getEntries() {
+		if (entries == null)
+			entries = tempEntries.toArray(new EncoderEntry[tempEntries.size()]);
+		return entries;
+	}
+
+	static class EncoderEntry {
+		Encoder encoder;
+		MediaRange[] encodingRanges;
+		String[] encodings;
+
+		EncoderEntry(Encoder e) {
+			encoder = e;
+
+			encodings = new String[e.getCodings().length];
+			int i = 0;
+			for (String enc : e.getCodings())
+				encodings[i++] = enc;
+
+			List<MediaRange> l = new LinkedList<MediaRange>();
+			for (i = 0; i < encodings.length; i++)
+				l.addAll(Arrays.asList(MediaRange.parse(encodings[i])));
+			encodingRanges = l.toArray(new MediaRange[l.size()]);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder$1.class
new file mode 100755
index 0000000..9a33700
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.class
new file mode 100755
index 0000000..c0325ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.java
new file mode 100755
index 0000000..5b2886a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/GzipEncoder.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.encoders;
+
+import java.io.*;
+import java.util.zip.*;
+
+/**
+ * Encoder for handling <js>"gzip"</js> encoding and decoding.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class GzipEncoder extends Encoder {
+
+	@Override /* Encoder */
+	public OutputStream getOutputStream(OutputStream os) throws IOException {
+		return new GZIPOutputStream(os) {
+			@Override /* OutputStream */
+			public final void close() throws IOException {
+				finish();
+				super.close();
+			}
+		};
+	}
+
+	@Override /* Encoder */
+	public InputStream getInputStream(InputStream is) throws IOException {
+		return new GZIPInputStream(is);
+	}
+
+	/**
+	 * Returns <code>[<js>"gzip"</js>]</code>.
+	 */
+	@Override /* Encoder */
+	public String[] getCodings() {
+		return new String[]{"gzip"};
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.class
new file mode 100755
index 0000000..a0b1737
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.java
new file mode 100755
index 0000000..7fcfff9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/IdentityEncoder.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.encoders;
+
+import java.io.*;
+
+/**
+ * Encoder for handling <js>"identity"</js> encoding and decoding (e.g. no encoding at all).
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class IdentityEncoder extends Encoder {
+
+	/** Singleton */
+	public static final IdentityEncoder INSTANCE = new IdentityEncoder();
+
+	/** Constructor. */
+	protected IdentityEncoder() {}
+
+	@Override /* Encoder */
+	public InputStream getInputStream(InputStream is) throws IOException {
+		return is;
+	}
+
+	@Override /* Encoder */
+	public OutputStream getOutputStream(OutputStream os) throws IOException {
+		return os;
+	}
+
+	/**
+	 * Returns <code>[<js>"identity"</js>]</code>.
+	 */
+	@Override /* Encoder */
+	public String[] getCodings() {
+		return new String[]{"identity"};
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/package.html
new file mode 100755
index 0000000..c536ac9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/encoders/package.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Encoder API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.class
new file mode 100755
index 0000000..178f374
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.java
new file mode 100755
index 0000000..3199113
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/AnnotationBeanFilter.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Bean filter constructed from a {@link Bean @Bean} annotation found on a class.
+ * <p>
+ * <b>*** Internal class - Not intended for external use ***</b>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type that this filter applies to.
+ */
+public final class AnnotationBeanFilter<T> extends BeanFilter<T> {
+
+	/**
+	 * Constructor.
+	 *
+	 * @param annotatedClass The class found to have a {@link Bean @Bean} annotation.
+	 * @param annotations The {@link Bean @Bean} annotations found on the class and all parent classes in child-to-parent order.
+	 */
+	public AnnotationBeanFilter(Class<T> annotatedClass, List<Bean> annotations) {
+		super(annotatedClass);
+
+		ListIterator<Bean> li = annotations.listIterator(annotations.size());
+		while (li.hasPrevious()) {
+			Bean b = li.previous();
+
+			if (b.properties().length > 0)
+				setProperties(b.properties());
+
+			if (b.excludeProperties().length > 0)
+				setExcludeProperties(b.excludeProperties());
+
+			setPropertyNamer(b.propertyNamer());
+
+			if (b.interfaceClass() != Object.class)
+				setInterfaceClass(b.interfaceClass());
+
+			if (b.stopClass() != Object.class)
+				setStopClass(b.stopClass());
+
+			if (! b.subTypeProperty().isEmpty()) {
+				setSubTypeProperty(b.subTypeProperty());
+
+				LinkedHashMap<Class<?>,String> subTypes = new LinkedHashMap<Class<?>,String>();
+				for (BeanSubType bst : b.subTypes())
+					subTypes.put(bst.type(), bst.id());
+
+				setSubTypes(subTypes);
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.class
new file mode 100755
index 0000000..2392596
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.java
new file mode 100755
index 0000000..0f91aae
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/BeanFilter.java
@@ -0,0 +1,472 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import java.beans.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Parent class for all bean filters.
+ * <p>
+ * 	Bean filters are used to control aspects of how beans are handled during serialization and parsing.
+ * <p>
+ * 	This class can be considered a programmatic equivalent to using the {@link Bean @Bean} annotation on bean classes.
+ * 	Thus, it can be used to perform the same function as the <code>@Bean</code> annotation when you don't have
+ * 		the ability to annotate those classes (e.g. you don't have access to the source code).
+ * <p>
+ * 	Note that value returned by the {@link Filter#forClass()} method is automatically determined through reflection
+ * 		when the no-arg constructor is used.
+ *
+ * <p>
+ * 	When defining bean filters, you can either call the setters in the contructor, or override getters.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	<jc>// Create our serializer with a filter.</jc>
+ * 	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(AddressFilter.<jk>class</jk>);
+ *
+ * 	Address a = <jk>new</jk> Address();
+ * 	String json = s.serialize(a); <jc>// Serializes only street, city, state.</jc>
+ *
+ * 	<jc>// Filter class defined via setters</jc>
+ * 	<jk>public class</jk> AddressFilter <jk>extends</jk> BeanFilter&lt;Address&gt; {
+ * 		<jk>public</jk> AddressFilter() {
+ * 			setProperties(<js>"street"</js>,<js>"city"</js>,<js>"state"</js>);
+ * 		}
+ * 	}
+ *
+ * 	<jc>// Filter class defined by overriding getters</jc>
+ * 	<jk>public class</jk> AddressFilter <jk>extends</jk> BeanFilter&lt;Address&gt; {
+ * 		<jk>public</jk> String[] getProperties() {
+ * 			<jk>return new</jk> String[]{<js>"street"</js>,<js>"city"</js>,<js>"state"</js>};
+ * 		}
+ * 	}
+ * </p>
+ * <p>
+ * 	The examples in this class use the setters approach.
+ *
+ * <h6 class='topic'>Additional information</h6>
+ * 	See {@link com.ibm.juno.core.filter} for more information.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type that this filter applies to.
+ */
+public abstract class BeanFilter<T> extends Filter {
+
+	private String[] properties, excludeProperties;
+	private LinkedHashMap<Class<?>, String> subTypes;
+	private String subTypeAttr;
+	private Class<? extends PropertyNamer> propertyNamer;
+	private Class<?> interfaceClass, stopClass;
+
+	/**
+	 * Constructor that determines the for-class value using reflection.
+	 */
+	@SuppressWarnings("unchecked")
+	public BeanFilter() {
+		super();
+		this.type = FilterType.BEAN;
+
+		Class<?> c = this.getClass().getSuperclass();
+		Type t = this.getClass().getGenericSuperclass();
+		while (c != BeanFilter.class) {
+			t = c.getGenericSuperclass();
+			c = c.getSuperclass();
+		}
+
+		// Attempt to determine the T and G classes using reflection.
+		if (t instanceof ParameterizedType) {
+			ParameterizedType pt = (ParameterizedType)t;
+			Type[] pta = pt.getActualTypeArguments();
+			if (pta.length > 0) {
+				Type nType = pta[0];
+				if (nType instanceof Class)
+					this.forClass = (Class<T>)nType;
+
+				else
+					throw new RuntimeException("Unsupported parameter type: " + nType);
+			}
+		}
+	}
+
+	/**
+	 * Constructor that specifies the for-class explicitly.
+	 * <p>
+	 * This constructor only needs to be called when the class type cannot be inferred through reflection.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> SomeArbitraryFilter <jk>extends</jk> BeanFilter&lt?&gt; {
+	 * 		<jk>public</jk> SomeArbitraryFilter(Class&lt?&gt; forClass) {
+	 * 			<jk>super</jk>(forClass);
+	 * 			...
+	 * 		}
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param forClass The class that this bean filter applies to.
+	 */
+	public BeanFilter(Class<T> forClass) {
+		super(forClass);
+		this.type = FilterType.BEAN;
+	}
+
+	/**
+	 * Returns the set and order of names of properties associated with a bean class.
+	 *
+	 * @see #setProperties(String...)
+	 * @return The name of the properties associated with a bean class, or <jk>null</jk> if all bean properties should be used.
+	 */
+	public String[] getProperties() {
+		return properties;
+	}
+
+	/**
+	 * Specifies the set and order of names of properties associated with a bean class.
+	 * <p>
+	 * 	The order specified is the same order that the entries will be returned by the {@link BeanMap#entrySet()} and related methods.
+	 * <p>
+	 * 	This method is an alternative to using the {@link Bean#properties()} annotation on a class.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Create our serializer with a filter.</jc>
+	 * 	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(AddressFilter.<jk>class</jk>);
+	 *
+	 * 	Address a = <jk>new</jk> Address();
+	 * 	String json = s.serialize(a); <jc>// Serializes only street, city, state.</jc>
+	 *
+	 * 	<jc>// Filter class</jc>
+	 * 	<jk>public class</jk> AddressFilter <jk>extends</jk> BeanFilter&lt;Address&gt; {
+	 * 		<jk>public</jk> AddressFilter() {
+	 * 			setProperties(<js>"street"</js>,<js>"city"</js>,<js>"state"</js>);
+	 * 		}
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param properties The name of the properties associated with a bean class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setProperties(String...properties) {
+		this.properties = properties;
+		return this;
+	}
+
+	/**
+	 * Returns the list of properties to ignore on a bean.
+	 *
+	 * @see #setExcludeProperties(String...)
+	 * @return The name of the properties to ignore on a bean, or <jk>null</jk> to not ignore any properties.
+	 */
+	public String[] getExcludeProperties() {
+		return excludeProperties;
+	}
+
+	/**
+	 * Specifies a list of properties to ignore on a bean.
+	 * <p>
+	 * 	This method is an alternative to using the {@link Bean#excludeProperties()} annotation on a class.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Create our serializer with a filter.</jc>
+	 * 	WriterSerializer s = <jk>new</jk> JsonSerializer().addFilters(NoCityOrStateFilter.<jk>class</jk>);
+	 *
+	 * 	Address a = <jk>new</jk> Address();
+	 * 	String json = s.serialize(a); <jc>// Excludes city and state.</jc>
+	 *
+	 * 	<jc>// Filter class</jc>
+	 * 	<jk>public class</jk> NoCityOrStateFilter <jk>extends</jk> BeanFilter&lt;Address&gt; {
+	 * 		<jk>public</jk> AddressFilter() {
+	 * 			setExcludeProperties(<js>"city"</js>,<js>"state"</js>);
+	 * 		}
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param excludeProperties The name of the properties to ignore on a bean class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setExcludeProperties(String...excludeProperties) {
+		this.excludeProperties = excludeProperties;
+		return this;
+	}
+
+	/**
+	 * Returns the {@link PropertyNamer} associated with the bean to tailor the names of bean properties.
+	 *
+	 * @see #setPropertyNamer(Class)
+	 * @return The property namer class, or <jk>null</jk> if no property namer is associated with this bean property.
+	 */
+	public Class<? extends PropertyNamer> getPropertyNamer() {
+		return propertyNamer;
+	}
+
+	/**
+	 * Associates a {@link PropertyNamer} with this bean to tailor the names of the bean properties.
+	 * <p>
+	 * 	Property namers are used to transform bean property names from standard form to some other form.
+	 * 	For example, the {@link PropertyNamerDashedLC} will convert property names to dashed-lowercase, and
+	 * 		these will be used as attribute names in JSON, and element names in XML.
+	 * <p>
+	 * 	This method is an alternative to using the {@link Bean#propertyNamer()} annotation on a class.
+	 *
+	 * @param propertyNamer The property namer class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setPropertyNamer(Class<? extends PropertyNamer> propertyNamer) {
+		this.propertyNamer = propertyNamer;
+		return this;
+	}
+
+	/**
+	 * Returns the name of the sub type property associated with the bean class.
+	 *
+	 * @see #setSubTypeProperty(String)
+	 * @return The sub type property name, or <jk>null</jk> if bean has no subtypes defined.
+	 */
+	public String getSubTypeProperty() {
+		return subTypeAttr;
+	}
+
+	/**
+	 * 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>
+	 * 	<jk>public abstract class</jk> A {
+	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
+	 * 	}
+	 *
+	 * 	<jc>// Subclass 1</jc>
+	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f1</jf>;
+	 * 	}
+	 *
+	 * 	<jc>// Subclass 2</jc>
+	 * 	<jk>public class</jk> A2 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f2</jf>;
+	 * 	}
+	 *
+	 * 	<jc>// Filter for defining subtypes</jc>
+	 * 	<jk>public class</jk> AFilter <jk>extends</jk> BeanFilter&lt;A&gt; {
+	 * 		<jk>public</jk> AFilter() {
+	 * 			setSubTypeProperty(<js>"subType"</js>);
+	 * 			addSubType(Al.<jk>class</jk>, <js>"A1"</js>);
+	 * 			addSubType(A2.<jk>class</jk>, <js>"A2"</js>);
+	 * 		}
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	The following shows what happens when serializing a subclassed object to JSON:
+	 * <p class='bcode'>
+	 * 	JsonSerializer s = <jk>new</jk> JsonSerializer().addFilters(AFilter.<jk>class</jk>);
+	 * 	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 class='bcode'>
+	 * 	JsonParser p = <jk>new</jk> JsonParser().addFilters(AFilter.<jk>class</jk>);
+	 * 	A a = p.parse(r, A.<jk>class</jk>);
+	 * 	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
+	 * </p>
+	 * <p>
+	 * 	This method is an alternative to using the {@link Bean#subTypeProperty()} annotation on a class.
+	 *
+	 * @param subTypeAttr The name of the attribute representing the subtype.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setSubTypeProperty(String subTypeAttr) {
+		this.subTypeAttr = subTypeAttr;
+		return this;
+	}
+
+	/**
+	 * Returns the subtypes associated with the bean class.
+	 *
+	 * @see #setSubTypeProperty(String)
+	 * @return The set of sub types associated with this bean class, or <jk>null</jk> if bean has no subtypes defined.
+	 */
+	public LinkedHashMap<Class<?>, String> getSubTypes() {
+		return subTypes;
+	}
+
+	/**
+	 * Specifies the set of subclasses of this bean class in addition to a string identifier for that subclass.
+	 *
+	 * @see #setSubTypeProperty(String)
+	 * @param subTypes the map of subtype classes to subtype identifier strings.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setSubTypes(LinkedHashMap<Class<?>, String> subTypes) {
+		this.subTypes = subTypes;
+		return this;
+	}
+
+	/**
+	 * Convenience method for adding a single subtype in leu of using {@link #setSubTypes(LinkedHashMap)} in one call.
+	 *
+	 * @see #setSubTypeProperty(String)
+	 * @param c The subtype class.
+	 * @param id The subtype identifier string for the specified subtype class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> addSubType(Class<?> c, String id) {
+		if (subTypes == null)
+			subTypes = new LinkedHashMap<Class<?>, String>();
+		subTypes.put(c, id);
+		return this;
+	}
+
+	/**
+	 * Returns the interface class associated with this class.
+	 *
+	 * @see #setInterfaceClass(Class)
+	 * @return The interface class associated with this class, or <jk>null</jk> if no interface class is associated.
+	 */
+	public Class<?> getInterfaceClass() {
+		return interfaceClass;
+	}
+
+	/**
+	 * Identifies a class to be used as the interface class for this and all subclasses.
+	 * <p>
+	 * 	Functionally equivalent to using the {@link Bean#interfaceClass()} annotation.
+	 * <p>
+	 * 	When specified, only the list of properties defined on the interface class will be used during serialization.
+	 * 	Additional properties on subclasses will be ignored.
+	 * <p class='bcode'>
+	 * 	<jc>// Parent class</jc>
+	 * 	<jk>public abstract class</jk> A {
+	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
+	 * 	}
+	 *
+	 * 	<jc>// Sub class</jc>
+	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f1</jf> = <js>"f1"</js>;
+	 * 	}
+	 *
+	 * 	<jc>// Filter class</jc>
+	 * 	<jk>public class</jk> AFilter <jk>extends</jk> BeanFilter&lt;A&gt; {
+	 * 		<jk>public</jk> AFilter() {
+	 * 			setInterfaceClass(A.<jk>class</jk>);
+	 * 		}
+	 * 	}
+	 *
+	 * 	JsonSerializer s = new JsonSerializer().addFilters(AFilter.<jk>class</jk>);
+	 * 	A1 a1 = <jk>new</jk> A1();
+	 * 	String r = s.serialize(a1);
+	 * 	<jsm>assertEquals</jsm>(<js>"{f0:'f0'}"</js>, r);  <jc>// Note f1 is not serialized</jc>
+	 * </p>
+	 * <p>
+	 * 	Note that this filter can be used on the parent class so that it filters to all child classes,
+	 * 		or can be set individually on the child classes.
+	 * <p>
+	 * 	This method is an alternative to using the {@link Bean#interfaceClass()}} annotation.
+	 *
+	 * @param interfaceClass The interface class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setInterfaceClass(Class<?> interfaceClass) {
+		this.interfaceClass = interfaceClass;
+		return this;
+	}
+
+	/**
+	 * Returns the stop class associated with this class.
+	 *
+	 * @see #setStopClass(Class)
+	 * @return The stop class associated with this class, or <jk>null</jk> if no stop class is associated.
+	 */
+	public Class<?> getStopClass() {
+		return stopClass;
+	}
+
+	/**
+	 * Identifies a stop class for this class and all subclasses.
+	 * <p>
+	 * 	Functionally equivalent to using the {@link Bean#stopClass()} annotation.
+	 * <p>
+	 * 	Identical in purpose to the stop class specified by {@link Introspector#getBeanInfo(Class, Class)}.
+	 * 	Any properties in the stop class or in its baseclasses will be ignored during analysis.
+	 * <p>
+	 * 	For example, in the following class hierarchy, instances of <code>C3</code> will include property <code>p3</code>, but
+	 * 		not <code>p1</code> or <code>p2</code>.
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> C1 {
+	 * 		<jk>public int</jk> getP1();
+	 * 	}
+	 *
+	 * 	<jk>public class</jk> C2 <jk>extends</jk> C1 {
+	 * 		<jk>public int</jk> getP2();
+	 * 	}
+	 *
+	 * 	<ja>@Bean</ja>(stopClass=C2.<jk>class</jk>)
+	 * 	<jk>public class</jk> C3 <jk>extends</jk> C2 {
+	 * 		<jk>public int</jk> getP3();
+	 * 	}
+	 * </p>
+	 *
+	 * @param stopClass The stop class.
+	 * @return This object (for method chaining).
+	 */
+	public BeanFilter<T> setStopClass(Class<?> stopClass) {
+		this.stopClass = stopClass;
+		return this;
+	}
+
+	/**
+	 * Subclasses can override this property to convert property values to some other
+	 * 	object just before serialization.
+	 *
+	 * @param bean The bean from which the property was read.
+	 * @param name The property name.
+	 * @param value The value just extracted from calling the bean getter.
+	 * @return The value to serialize.  Default is just to return the existing value.
+	 */
+	public Object readProperty(Object bean, String name, Object value) {
+		return value;
+	}
+
+	/**
+	 * Subclasses can override this property to convert property values to some other
+	 * 	object just before calling the bean setter.
+	 *
+	 * @param bean The bean from which the property was read.
+	 * @param name The property name.
+	 * @param value The value just parsed.
+	 * @return <jk>true</jk> if we set the property, <jk>false</jk> if we should allow the
+	 * 	framework to call the setter.
+	 */
+	public boolean writeProperty(Object bean, String name, Object value) {
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$FilterType.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$FilterType.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$FilterType.class
new file mode 100755
index 0000000..c5fe96d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$FilterType.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$NULL.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$NULL.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$NULL.class
new file mode 100755
index 0000000..8f2d92b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter$NULL.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.class
new file mode 100755
index 0000000..96e2efc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.java
new file mode 100755
index 0000000..153b679
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/Filter.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Parent class for all bean and POJO filters.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Filters are used to alter how POJOs are handled by bean contexts (and subsequently serializers and parsers).
+ * 	The are a very powerful feature of the Juno framework that allows virtually any POJO to be serialized and parsed.
+ * 	For example, they can be used to...
+ * <ul>
+ * 	<li>Convert a non-serializable POJO into a serializable POJO during serialization (and optionally vis-versa during parsing).
+ * 	<li>Control various aspects of beans, such as what properties are visible, bean subclasses, etc...
+ * </ul>
+ * <p>
+ * 	There are 2 subclasses of filters:
+ * <ul>
+ * 	<li>{@link PojoFilter} - Non-bean filters for converting POJOs into serializable equivalents.
+ * 	<li>{@link BeanFilter} - Bean filters for configuring how beans are handled.
+ * </ul>
+ * <p>
+ * 	Filters are associated with bean contexts (and serializers/parsers) through the {@link BeanContextFactory#addFilters(Class[])}
+ * 		and {@link CoreApi#addFilters(Class[])} methods.
+ *
+ *
+ * <h6 class='topic'>Additional information</h6>
+ * 	See {@link com.ibm.juno.core.filter} for more information.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class Filter {
+
+	/** Represents no filter. */
+	public static class NULL extends Filter {}
+
+	/** The filter subtype */
+	public static enum FilterType {
+		/** PojoFilter */
+		POJO,
+		/** BeanFilter */
+		BEAN
+	}
+
+	/** The class that this filter applies to. */
+	protected Class<?> forClass;
+
+	/** The bean context that this filter instance belongs to. */
+	protected BeanContext beanContext;
+
+	/** Whether this is a BeanFilter or PojoFilter. */
+	protected FilterType type = FilterType.POJO;
+
+	Filter() {}
+
+	Filter(Class<?> forClass) {
+		this.forClass = forClass;
+	}
+
+
+	/**
+	 * Returns the class that this filter applies to.
+	 *
+	 * @return The class that this filter applies to.
+	 */
+	public Class<?> forClass() {
+		return forClass;
+	}
+
+	/**
+	 * Returns the implementation class.
+	 * Useful for debugging when calling {@link BeanContext#toString()}.
+	 *
+	 * @return The implementation class of this filter.
+	 */
+	public Class<?> getImplClass() {
+		return this.getClass();
+	}
+
+	/**
+	 * Returns whether this is an instance of {@link PojoFilter} or {@link BeanFilter}.
+	 *
+	 * @return The filter type.
+	 */
+	public FilterType getType() {
+		return type;
+	}
+
+	/**
+	 * Returns the {@link BeanContext} that created this filter.
+	 *
+	 * @return The bean context that created this filter.
+	 */
+	protected BeanContext getBeanContext() {
+		return beanContext;
+	}
+
+	/**
+	 * Sets the bean context that this filter instance was created by.
+	 *
+	 * @param beanContext The bean context that created this filter.
+	 * @return This object (for method chaining).
+	 */
+	public Filter setBeanContext(BeanContext beanContext) {
+		this.beanContext = beanContext;
+		return this;
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return getClass().getName().hashCode() + forClass().getName().hashCode();
+	}
+
+	/**
+	 * Checks if the specified filter class is the same as this one.
+	 *
+	 * @param f The filter to check.
+	 * @return <jk>true</jk> if the specified filter is equivalent to this one.
+	 */
+	public boolean isSameAs(Filter f) {
+		return f.getClass().equals(getClass()) && f.forClass().equals(forClass());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.class
new file mode 100755
index 0000000..6df5a7d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.java
new file mode 100755
index 0000000..4496c79
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/InterfaceBeanFilter.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.filter;
+
+import com.ibm.juno.core.*;
+
+
+/**
+ * Simple bean filter that simply identifies a class to be used as an interface
+ * 	class for all child classes.
+ * <p>
+ * 	These objects are created when you pass in non-<code>Filter</code> classes to {@link BeanContextFactory#addFilters(Class...)},
+ * 		and are equivalent to adding a <code><ja>@Bean</ja>(interfaceClass=Foo.<jk>class</jk>)</code> annotation on the <code>Foo</code> class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type that this filter applies to.
+ */
+public class InterfaceBeanFilter<T> extends BeanFilter<T> {
+
+	/**
+	 * Constructor.
+	 *
+	 * @param interfaceClass The class to use as an interface on all child classes.
+	 */
+	public InterfaceBeanFilter(Class<T> interfaceClass) {
+		super(interfaceClass);
+		setInterfaceClass(interfaceClass);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter$NULL.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter$NULL.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter$NULL.class
new file mode 100755
index 0000000..d072bf8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter$NULL.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.class
new file mode 100755
index 0000000..8893adc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/filter/PojoFilter.class differ


[13/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/package.html
new file mode 100755
index 0000000..98cb75a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/package.html
@@ -0,0 +1,210 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Base toolkit for serializers, parsers, and bean contexts</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#BeanContext_Api'>Bean Context API</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#BeanMap'>The BeanMap class</a></p> 
+		<li><p><a class='doclink' href='#BeanContext'>The BeanContext class</a></p>
+		<li><p><a class='doclink' href='#Bean'>Bean annotations</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#ObjectMap_ObjectList'>ObjectMap and ObjectList APIs</a></p>
+	<li><p><a class='doclink' href='#PojoCategories'>POJO Categories</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="BeanContext_Api"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Bean Context API</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.BeanContext} class is the core class in the Juno architecture.  It serves multiple functions...
+	</p>
+	<ul class='normal'>
+		<li>It provides the ability to create instances of {@link com.ibm.juno.core.BeanMap BeanMaps}.
+		<li>It serves as a repository for {@link com.ibm.juno.core.filter.Filter Filters}, which are used to tailor how beans and non-beans are handled. 
+		<li>It's used by all built-in {@link com.ibm.juno.core.serializer.Serializer Serializers} and {@link com.ibm.juno.core.parser.Parser Parsers} for working with POJOs in a consistent way.
+	</ul>
+	
+	<!-- ======================================================================================================== -->
+	<a id="BeanMap"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - The BeanMap class</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.BeanMap} class allows you to access the properties of a bean through the familiar {@code Map} interface. 
+			So, for example, you can use the {@code Map.get(key)} method to retrieve a property value in leu of it's getter method, and the {@code Map.put(key, value)} method to set a property value in leu of it's setter method.
+		</p>
+		<p>
+			The serialization and parsing of beans in Juno is accomplished by wrapping Java beans inside instances of the class {@code BeanMap}. 
+		</p>
+		<p>
+			<b>Note:</b> Instances of {@link com.ibm.juno.core.BeanMap} objects are always retrieved through the {@link com.ibm.juno.core.BeanContext} class. You cannot instantiate {@code BeanMaps} directly since the rules for defining what constitutes a bean depend on various settings in the bean context.
+		</p>
+		<p>
+			In general, the performance on using the {@link com.ibm.juno.core.BeanMap} class to access properties is equivalent to using reflection directly.
+		</p>
+		<p>
+			See the {@link com.ibm.juno.core.BeanMap} javadoc for more information.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="BeanContext"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - The BeanContext class</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.BeanContext} class is the workhorse class used to wrap Java beans inside {@link com.ibm.juno.core.BeanMap BeanMaps}. 
+			There are several options provided on the {@link com.ibm.juno.core.BeanContext} class to tailor the definition of a bean.
+		</p>
+		<p>
+			The following is a very simple example of how to wrap a bean inside a {@link com.ibm.juno.core.BeanMap} wrapper and use the wrapper interface to get and set property values on the bean. 
+			In this case, we're using the DEFAULT bean context.
+		</p>
+		<p class='bcode'>
+	<jc>// A sample pseudo bean class.</jc>
+	<jk>public class</jk> Person {
+		<jk>public</jk> String getName();
+		<jk>public void</jk> setName(String name);
+		<jk>public int</jk> getAge();
+		<jk>public void</jk> setAge(<jk>int</jk> age);
+	}
+	
+	<jc>// Get an instance of a bean context.
+	// In this case, just use the default bean context.</jc>
+	BeanContext beanContext = BeanContext.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Create an instance of our bean and wrap it in a bean map.</jc>
+	Person p = <jk>new</jk> Person();
+	BeanMap&lt;Person&gt; m = beanContext.forBean(p);
+	
+	<jc>// Set some properties on the bean.</jc>
+	m.put(<js>"name"</js>, <js>"John Smith"</js>);
+	m.put(<js>"age"</js>, 21);
+	
+	<jc>// Print out bean properties.</jc>
+	System.out.println(m.get(<js>"name"</js>));	<jc>// Prints "John Smith"</jc>
+	System.out.println(p.getName());	  <jc>// Prints "John Smith"</jc>
+	System.out.println(m.get(<js>"age"</js>));	 <jc>// Prints 21</jc>
+	System.out.println(p.getAge());		<jc>// Prints 21</jc>
+	
+	<jc>// The bean context class can also create instances of bean maps.</jc>
+	m = beanContext.newBeanMap(Person.<jk>class</jk>);
+	p = m.getBean();	<jc>// Get the new wrapped bean.</jc>
+	
+	<jc>// The bean context class can also create instances of beans.</jc>
+	p = beanContext.newBean(Person.<jk>class</jk>);
+		</p>
+		<p>
+			There are 3 ways to get an instance of a {@link com.ibm.juno.core.BeanContext}:
+		</p>
+		<p class='bcode'>
+	<jc>// Use one of the default bean contexts.</jc>
+	BeanContext beanContext = BeanContext.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Create a context from scratch with your own settings.</jc>
+	beanContext = <jk>new</jk> BeanContext().addFilters(DateFilter.ISO8601DT.<jk>class</jk>);
+	
+	<jc>// Clone and modify an existing context.</jc>
+	beanContext = BeanContext.<jsf>DEFAULT</jsf>.clone().addFilters(DateFilter.ISO8601DT.<jk>class</jk>);
+		</p>
+		<p>
+			The {@link com.ibm.juno.core.BeanContext} class is a highly-customizable class.  
+			See the {@link com.ibm.juno.core.BeanContext} javadoc for more information.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Bean"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - Bean annotations</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the following annotations that can be used to fine-tune what properties are associated with beans:
+		</p>
+		<ul class='normal'>
+			<li>{@link com.ibm.juno.core.annotation.Bean} - Fine-tune properties associated with beans.
+			<li>{@link com.ibm.juno.core.annotation.BeanProperty} - Fine-tune bean properties (fields / getters / setters).
+			<li>{@link com.ibm.juno.core.annotation.BeanConstructor} - Define read-only bean properties that can only be set through constructor arguments.
+			<li>{@link com.ibm.juno.core.annotation.BeanIgnore} - Prevent bean classes/methods/fields from being interpreted as bean constructs.
+		</ul>
+		<p>
+			These annotations always override the settings defined in the {@link com.ibm.juno.core.BeanContext} class.
+		</p>
+		<p>
+			For example, the following bean class will only have one property associated with it, <js>"name"</js>, since it's the only one listed in the list of properties.
+		</p>
+		<p class='bcode'>
+	<jc>// Bean with only one 'name' property</jc>
+	<ja>@Bean</ja>(properties={<js>"name"</js>})
+	<jk>public class</jk> Person {
+		<jk>public</jk> String getName();
+		<jk>public void</jk> setName(String name);
+		<jk>public int</jk> getAge();
+		<jk>public void</jk> setAge(<jk>int</jk> age);
+	}
+		</p>
+		<p>
+			When this bean is serialized using one of the {@link com.ibm.juno.core.serializer.Serializer Serializers}, the age property will be ignored.
+		</p>
+		<p>
+			Using the <ja>@Bean</ja> and <ja>@BeanProperty</ja> annotations, it's also possible to include non-standard properties (for example, getters or setters with non-standard names), or override the names of properties (for example, {@code "Name"} or {@code "fullName"} instead of {@code "name"}).
+		</p>
+		<p>
+			It should be noted that the {@link com.ibm.juno.core.filter.BeanFilter} class can also be used to exclude properties from beans.  
+			However, only the annotations can be used to include non-standard properties or override property names.
+		</p>
+		<p>
+			See the {@link com.ibm.juno.core.annotation.Bean}, {@link com.ibm.juno.core.annotation.BeanProperty}, {@link com.ibm.juno.core.annotation.BeanConstructor}, and {@link com.ibm.juno.core.annotation.BeanIgnore} javadocs for more information.
+		</p>
+	</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.class
new file mode 100755
index 0000000..ec2f7c0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.java
new file mode 100755
index 0000000..e4b8518
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/InputStreamParser.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Subclass of {@link Parser} for byte-based parsers.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This class is typically the parent class of all byte-based parsers.
+ * 	It has 1 abstract method to implement...
+ * <ul>
+ * 	<li><code>parse(InputStream, ClassMeta, ParserContext)</code>
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>@Consumes annotation</h6>
+ * <p>
+ * 	The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class InputStreamParser extends Parser<InputStream> {
+
+	@Override /* Parser */
+	public boolean isReaderParser() {
+		return false;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	protected abstract <T> T doParse(InputStream in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.class
new file mode 100755
index 0000000..858b57f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.java
new file mode 100755
index 0000000..f013dfb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParseException.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import java.text.*;
+
+/**
+ * Exception that indicates invalid syntax encountered during parsing.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ParseException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The error message.
+	 * @param args Optional printf arguments to replace in the error message.
+	 */
+	public ParseException(String msg, Object...args) {
+		super(args.length == 0 ? msg : MessageFormat.format(msg, args));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param lineNumber The line number where the parse error was detected.
+	 * @param colNumber The column number where the parse error was detected.
+	 * @param msg The error message.
+	 * @param args Optional printf arguments to replace in the error message.
+	 */
+	public ParseException(int lineNumber, int colNumber, String msg, Object... args) {
+		super(
+			(lineNumber != -1 ? MessageFormat.format("Parse exception occurred at line=''{0}'', column=''{1}''.  ", lineNumber, colNumber) : "")
+			+ (args.length == 0 ? msg : MessageFormat.format(msg, args))
+		);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause of the parse exception.
+	 */
+	public ParseException(Exception cause) {
+		super(cause == null ? null : cause.getLocalizedMessage());
+		initCause(cause);
+	}
+
+	/**
+	 * Returns the highest-level <code>ParseException</code> in the stack trace.
+	 * Useful for JUnit testing of error conditions.
+	 *
+	 * @return The root parse exception, or this exception if there isn't one.
+	 */
+	public ParseException getRootCause() {
+		ParseException t = this;
+		while (! (t.getCause() == null || ! (t.getCause() instanceof ParseException)))
+			t = (ParseException)t.getCause();
+		return t;
+	}
+
+	/**
+	 * Sets the inner cause for this exception.
+	 *
+	 * @param cause The inner cause.
+	 * @return This object (for method chaining).
+	 */
+	@Override /* Throwable */
+	public synchronized ParseException initCause(Throwable cause) {
+		super.initCause(cause);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.class
new file mode 100755
index 0000000..222d41a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.java
new file mode 100755
index 0000000..0394bc6
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/Parser.java
@@ -0,0 +1,573 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import static com.ibm.juno.core.utils.StringUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.text.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.filters.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parent class for all Juno parsers.
+ *
+ *
+ * <h6 class='topic'>@Consumes annotation</h6>
+ * <p>
+ * 	The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method.
+ *
+ *
+ * <a id='ValidDataConversions'></a><h6 class='topic'>Valid data conversions</h6>
+ * 	Parsers can parse any parsable POJO types, as specified in the <a class='doclink' href='../package-summary.html#PojoCategories'>POJO Categories</a>.
+ * <p>
+ * 	Some examples of conversions are shown below...
+ * </p>
+ * 	<table class='styled'>
+ * 		<tr>
+ * 			<th>Data type</th>
+ * 			<th>Class type</th>
+ * 			<th>JSON example</th>
+ * 			<th>XML example</th>
+ * 			<th>Class examples</th>
+ * 		</tr>
+ * 		<tr>
+ * 			<td>object</td>
+ * 			<td>Maps, Java beans</td>
+ * 			<td class='code'>{name:<js>'John Smith'</js>,age:21}</td>
+ * 			<td class='code'><xt>&lt;object&gt;
+ * 	&lt;name</xt> <xa>type</xa>=<xs>'string'</xs><xt>&gt;</xt>John Smith<xt>&lt;/name&gt;
+ * 	&lt;age</xt> <xa>type</xa>=<xs>'number'</xs><xt>&gt;</xt>21<xt>&lt;/age&gt;
+ * &lt;/object&gt;</xt></td>
+ * 			<td class='code'>HashMap, TreeMap&lt;String,Integer&gt;</td>
+ * 		</tr>
+ * 		<tr>
+ * 			<td>array</td>
+ * 			<td>Collections, Java arrays</td>
+ * 			<td class='code'>[1,2,3]</td>
+ * 			<td class='code'><xt>&lt;array&gt;
+ * 	&lt;number&gt;</xt>1<xt>&lt;/number&gt;
+ * 	&lt;number&gt;</xt>2<xt>&lt;/number&gt;
+ * 	&lt;number&gt;</xt>3<xt>&lt;/number&gt;
+ * &lt;/array&gt;</xt></td>
+ * 			<td class='code'>List&lt;Integer&gt;, <jk>int</jk>[], Float[], Set&lt;Person&gt;</td>
+ * 		</tr>
+ * 		<tr>
+ * 			<td>number</td>
+ * 			<td>Numbers</td>
+ * 			<td class='code'>123</td>
+ * 			<td class='code'><xt>&lt;number&gt;</xt>123<xt>&lt;/number&gt;</xt></td>
+ * 			<td class='code'>Integer, Long, Float, <jk>int</jk></td>
+ * 		</tr>
+ * 		<tr>
+ * 			<td>boolean</td>
+ * 			<td>Booleans</td>
+ * 			<td class='code'><jk>true</jk></td>
+ * 			<td class='code'><xt>&lt;boolean&gt;</xt>true<xt>&lt;/boolean&gt;</xt></td>
+ * 			<td class='code'>Boolean</td>
+ * 		</tr>
+ * 		<tr>
+ * 			<td>string</td>
+ * 			<td>CharSequences</td>
+ * 			<td class='code'><js>'foobar'</js></td>
+ * 			<td class='code'><xt>&lt;string&gt;</xt>foobar<xt>&lt;/string&gt;</xt></td>
+ * 			<td class='code'>String, StringBuilder</td>
+ * 		</tr>
+ * 	</table>
+ * <p>
+ * 	In addition, any class types with {@link PojoFilter PojoFilters} associated with them on the registered
+ * 		{@link #getBeanContext() beanContext} can also be passed in.
+ * <p>
+ * 	For example, if the {@link CalendarFilter} filter is used to generalize {@code Calendar} objects to {@code String} objects.  When registered
+ * 	with this parser, you can construct {@code Calendar} objects from {@code Strings} using the following syntax...
+ * <p class='bcode'>
+ * 	Calendar c = parser.parse(<js>"'Sun Mar 03 04:05:06 EST 2001'"</js>, GregorianCalendar.<jk>class</jk>);
+ * <p>
+ * 	If <code>Object.<jk>class</jk></code> is specified as the target type, then the parser
+ * 	automatically determines the data types and generates the following object types...
+ * </p>
+ * <table class='styled'>
+ * 	<tr><th>JSON type</th><th>Class type</th></tr>
+ * 	<tr><td>object</td><td>{@link ObjectMap}</td></tr>
+ * 	<tr><td>array</td><td>{@link ObjectList}</td></tr>
+ * 	<tr><td>number</td><td>{@link Number} <br>(depending on length and format, could be {@link Integer}, {@link Double}, {@link Float}, etc...)</td></tr>
+ * 	<tr><td>boolean</td><td>{@link Boolean}</td></tr>
+ * 	<tr><td>string</td><td>{@link String}</td></tr>
+ * </table>
+ *
+ *
+ * <a id='SupportedTypes'></a><h6 class='topic'>Supported types</h6>
+ * <p>
+ * 	Several of the methods below take {@link Type} parameters to identify the type of
+ * 		object to create.  Any of the following types can be passed in to these methods...
+ * </p>
+ * <ul>
+ * 	<li>{@link ClassMeta}
+ * 	<li>{@link Class}
+ * 	<li>{@link ParameterizedType}
+ * 	<li>{@link GenericArrayType}
+ * </ul>
+ * <p>
+ * 	However, {@code ParameterizedTypes} and {@code GenericArrayTypes} should not contain
+ * 		{@link WildcardType WildcardTypes} or {@link TypeVariable TypeVariables}.
+ * <p>
+ * 	Passing in <jk>null</jk> or <code>Object.<jk>class</jk></code> typically signifies that it's up to the parser
+ * 	to determine what object type is being parsed parsed based on the rules above.
+
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <R> The input type (e.g. Reader or InputStream)
+ */
+public abstract class Parser<R> extends CoreApi {
+
+	/** General serializer properties currently set on this serializer. */
+	protected transient ParserProperties pp = new ParserProperties();
+	private transient List<ParserListener> listeners = new LinkedList<ParserListener>();
+	private String[] mediaTypes;
+
+	// Hidden constructor to force subclass from InputStreamParser or ReaderParser.
+	Parser() {}
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Workhorse method.  Subclasses are expected to implement this method.
+	 *
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param type The class type of the object to create.
+	 * 	If <jk>null</jk> or <code>Object.<jk>class</jk></code>, object type is based on what's being parsed.
+	 * 	For example, when parsing JSON text, it may return a <code>String</code>, <code>Number</code>, <code>ObjectMap</code>, etc...
+	 * @param ctx The runtime context object returned by {@link #createContext(ObjectMap, Method, Object)}.
+	 * 	If <jk>null</jk>, one will be created using {@link #createContext()}.
+	 * @param <T> The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	protected abstract <T> T doParse(R in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException;
+
+	/**
+	 * Returns <jk>true</jk> if this parser subclasses from {@link ReaderParser}.
+	 *
+	 * @return <jk>true</jk> if this parser subclasses from {@link ReaderParser}.
+	 */
+	public abstract boolean isReaderParser();
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Parses the content of the reader and creates an object of the specified type.
+	 *
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param type The class type of the object to create.
+	 * 	If <jk>null</jk> or <code>Object.<jk>class</jk></code>, object type is based on what's being parsed.
+	 * 	For example, when parsing JSON text, it may return a <code>String</code>, <code>Number</code>, <code>ObjectMap</code>, etc...
+	 * @param ctx The runtime context object returned by {@link #createContext(ObjectMap, Method, Object)}.
+	 * @param <T> The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final <T> T parse(R in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		try {
+			if (in == null)
+				throw new IOException("Null input stream or reader passed to parser.");
+			return doParse(in, estimatedSize, type, ctx);
+		} catch (RuntimeException e) {
+			throw new ParseException(e);
+		} finally {
+			ctx.close();
+		}
+	}
+
+	/**
+	 * Parses the content of the reader and creates an object of the specified type.
+	 * <p>
+	 * Equivalent to calling <code>parser.parse(in, type, <jk>null</jk>);</code>
+	 *
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param type The class type of the object to create.
+	 * 	If <jk>null</jk> or <code>Object.<jk>class</jk></code>, object type is based on what's being parsed.
+	 * 	For example, when parsing JSON text, it may return a <code>String</code>, <code>Number</code>, <code>ObjectMap</code>, etc...
+	 * @param <T> The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final <T> T parse(R in, int estimatedSize, ClassMeta<T> type) throws ParseException, IOException {
+		ParserContext ctx = createContext();
+		return parse(in, estimatedSize, type, ctx);
+	}
+
+	/**
+	 * Parses input into the specified object type.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	MyBean b = p.parse(json, MyBean.<jk>class</jk>);
+	 * </p>
+	 * <p>
+	 * This method equivalent to the following code:
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	ClassMeta&lt;MyBean&gt; cm = p.getBeanContext().getClassMeta(MyBean.<jk>class</jk>);
+	 * 	MyBean b = p.parse(json, cm, <jk>null</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class type of the object to create.
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param type The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final <T> T parse(R in, int estimatedSize, Class<T> type) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getClassMeta(type);
+		return parse(in, estimatedSize, cm);
+	}
+
+	/**
+	 * Parses input into a map with specified key and value types.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	Map&lt;String,MyBean&gt; m = p.parseMap(json, LinkedHashMap.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * 			A simpler approach is often to just extend the map class you want and just use the normal {@link #parse(Object, int, Class)} method:
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyMap <jk>extends</jk> LinkedHashMap&lt;String,MyBean&gt; {}
+	 *
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	Map&lt;String,MyBean&gt; m = p.parse(json, MyMap.<jk>class</jk>);
+	 * </p>
+	 * <p>
+	 * This method equivalent to the following code:
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	ClassMeta&lt;Map&lt;String,MyBean&gt;&gt; cm = p.getBeanContext().getMapClassMeta(LinkedList.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * 	Map&ltString,MyBean&gt; m = p.parse(json, cm, <jk>null</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class type of the object to create.
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param mapClass The map class type.
+	 * @param keyClass The key class type.
+	 * @param valueClass The value class type.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final <K,V,T extends Map<K,V>> T parseMap(R in, int estimatedSize, Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getMapClassMeta(mapClass, keyClass, valueClass);
+		return parse(in, estimatedSize, cm);
+	}
+
+	/**
+	 * Parses input into a collection with a specified element type.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	List&lt;MyBean&gt; l = p.parseCollection(json, LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * A simpler approach is often to just extend the collection class you want and just use the normal {@link #parse(Object, int, Class)} method:
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyBeanCollection <jk>extends</jk> LinkedList&lt;MyBean&gt; {}
+	 *
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	List&lt;MyBean&gt; l = p.parse(json, MyBeanCollection.<jk>class</jk>);
+	 * </p>
+	 * <p>
+	 * This method equivalent to the following code:
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	ReaderParser p = JsonParser.<jsf>DEFAULT</jsf>;
+	 * 	ClassMeta&lt;List&lt;MyBean&gt;&gt; cm = p.getBeanContext().getCollectionClassMeta(LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * 	List&lt;MyBean&gt; l = p.parse(json, cm, <jk>null</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class type of the object to create.
+	 * @param in The input stream or reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param collectionClass The collection class type.
+	 * @param entryClass The class type of entries in the collection.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final <E,T extends Collection<E>> T parseCollection(R in, int estimatedSize, Class<T> collectionClass, Class<E> entryClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getCollectionClassMeta(collectionClass, entryClass);
+		return parse(in, estimatedSize, cm);
+	}
+
+	/**
+	 * Create the context object that will be passed in to the parse method.
+	 * <p>
+	 * 	It's up to implementers to decide what the context object looks like, although typically
+	 * 	it's going to be a subclass of {@link ParserContext}.
+	 *
+	 * @param properties Optional additional properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 * @return The new context.
+	 */
+	public ParserContext createContext(ObjectMap properties, Method javaMethod, Object outer) {
+		return new ParserContext(getBeanContext(), pp, properties, javaMethod, outer);
+	}
+
+	/**
+	 * Create a basic context object without overriding properties or specifying <code>javaMethod</code>.
+	 * <p>
+	 * Equivalent to calling <code>createContext(<jk>null</jk>, <jk>null</jk>)</code>.
+	 *
+	 * @return The new context.
+	 */
+	protected final ParserContext createContext() {
+		return createContext(null, null, null);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Adds a {@link ParserListener} to this parser to listen for parse events.
+	 *
+	 * @param listener The listener to associate with this parser.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public Parser<R> addListener(ParserListener listener) throws LockedException {
+		checkLock();
+		this.listeners.add(listener);
+		return this;
+	}
+
+	/**
+	 * Returns the current parser listeners associated with this parser.
+	 *
+	 * @return The current list of parser listeners.
+	 */
+	public List<ParserListener> getListeners() {
+		return listeners;
+	}
+
+	/**
+	 * Converts the specified string to the specified type.
+	 *
+	 * @param outer The outer object if we're converting to an inner object that needs to be created within the context of an outer object.
+	 * @param s The string to convert.
+	 * @param type The class type to convert the string to.
+	 * @return The string converted as an object of the specified type.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @param <T> The class type to convert the string to.
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	protected <T> T convertAttrToType(Object outer, String s, ClassMeta<T> type) throws ParseException {
+		if (s == null)
+			return null;
+
+		if (type == null)
+			type = (ClassMeta<T>)object();
+		PojoFilter filter = type.getPojoFilter();
+		ClassMeta<?> gType = type.getFilteredClassMeta();
+
+		Object o = s;
+		if (gType.isChar())
+			o = s.charAt(0);
+		else if (gType.isNumber())
+			o = parseNumber(s, (Class<? extends Number>)gType.getInnerClass());
+		else if (gType.isBoolean())
+			o = Boolean.parseBoolean(s);
+		else if (! (gType.isCharSequence() || gType.isObject())) {
+			if (gType.canCreateNewInstanceFromString(outer)) {
+				try {
+					o = gType.newInstanceFromString(outer, s);
+				} catch (Exception e) {
+					throw new ParseException("Unable to construct new object of type ''{0}'' from input string ''{1}''", type, s).initCause(e);
+				}
+			} else {
+				throw new ParseException("Invalid conversion from string to class ''{0}''", type);
+			}
+		}
+
+		if (filter != null)
+			o = filter.unfilter(o, type);
+
+
+		return (T)o;
+	}
+
+	/**
+	 * Convenience method for calling the {@link ParentProperty @ParentProperty} method on
+	 * the specified object if it exists.
+	 *
+	 * @param cm The class type of the object.
+	 * @param o The object.
+	 * @param parent The parent to set.
+	 * @throws ParseException
+	 */
+	protected void setParent(ClassMeta<?> cm, Object o, Object parent) throws ParseException {
+		Method m = cm.getParentProperty();
+		if (m != null) {
+			try {
+				m.invoke(o, parent);
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+	}
+
+	/**
+	 * Convenience method for calling the {@link NameProperty @NameProperty} method on
+	 * the specified object if it exists.
+	 *
+	 * @param cm The class type of the object.
+	 * @param o The object.
+	 * @param name The name to set.
+	 * @throws ParseException
+	 */
+	protected void setName(ClassMeta<?> cm, Object o, Object name) throws ParseException {
+		Method m = cm.getNameProperty();
+		if (m != null) {
+			try {
+				m.invoke(o, name);
+			} catch (Exception e) {
+				throw new ParseException(e);
+			}
+		}
+	}
+
+
+	/**
+	 * Method that gets called when an unknown bean property name is encountered.
+	 *
+	 * @param ctx The parser context.
+	 * @param propertyName The unknown bean property name.
+	 * @param beanMap The bean that doesn't have the expected property.
+	 * @param line The line number where the property was found.  <code>-1</code> if line numbers are not available.
+	 * @param col The column number where the property was found.  <code>-1</code> if column numbers are not available.
+	 * @throws ParseException Automatically thrown if {@link BeanContextProperties#BEAN_ignoreUnknownBeanProperties} setting
+	 * 	on this parser is <jk>false</jk>
+	 * @param <T> The class type of the bean map that doesn't have the expected property.
+	 */
+	protected <T> void onUnknownProperty(ParserContext ctx, String propertyName, BeanMap<T> beanMap, int line, int col) throws ParseException {
+		if (propertyName.equals("uri") || propertyName.equals("type") || propertyName.equals("_class"))
+			return;
+		if (! ctx.getBeanContext().isIgnoreUnknownBeanProperties())
+			throw new ParseException(line, col, "Unknown property ''{0}'' encountered while trying to parse into class ''{1}''", propertyName, beanMap.getClassMeta());
+		if (listeners.size() > 0)
+			for (ParserListener listener : listeners)
+				listener.onUnknownProperty(propertyName, beanMap.getClassMeta().getInnerClass(), beanMap.getBean(), line, col);
+	}
+
+
+	/**
+	 * Returns the media types handled based on the value of the {@link Consumes} annotation on the parser class.
+	 * <p>
+	 * This method can be overridden by subclasses to determine the media types programatically.
+	 *
+	 * @return The list of media types.  Never <jk>null</jk>.
+	 */
+	public String[] getMediaTypes() {
+		if (mediaTypes == null) {
+			Consumes c = ReflectionUtils.getAnnotation(Consumes.class, getClass());
+			if (c == null)
+				throw new RuntimeException(MessageFormat.format("Class ''{0}'' is missing the @Consumes annotation", getClass().getName()));
+			mediaTypes = c.value();
+		}
+		return mediaTypes;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+
+	@Override /* CoreApi */
+	public Parser<R> setProperty(String property, Object value) throws LockedException {
+		super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Parser<R> addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Parser<R> addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> Parser<R> addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Parser<R> setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public Parser<R> lock() {
+		super.lock();
+		return this;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* Lockable */
+	public Parser<R> clone() throws CloneNotSupportedException {
+		return (Parser<R>)super.clone();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.class
new file mode 100755
index 0000000..788eb28
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.java
new file mode 100755
index 0000000..30b2365
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserContext.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.logging.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Context object that lives for the duration of a single parsing of {@link Parser} and its subclasses.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ParserContext {
+
+	private static Logger logger = Logger.getLogger(ParserContext.class.getName());
+
+	private boolean debug, closed;
+	private final BeanContext beanContext;
+	private final List<String> warnings = new LinkedList<String>();
+
+	private ObjectMap properties;
+	private Method javaMethod;
+	private Object outer;
+
+	/**
+	 * Create a new parser context with the specified options.
+	 *
+	 * @param beanContext The bean context being used.
+	 * @param pp The default parser properties.
+	 * @param properties The override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	public ParserContext(BeanContext beanContext, ParserProperties pp, ObjectMap properties, Method javaMethod, Object outer) {
+		this.debug = pp.debug;
+		this.beanContext = beanContext;
+		this.properties = properties;
+		this.javaMethod = javaMethod;
+		this.outer = outer;
+	}
+
+	/**
+	 * Returns the bean context associated with this context.
+	 *
+	 * @return The bean context associated with this context.
+	 */
+	public final BeanContext getBeanContext() {
+		return beanContext;
+	}
+
+	/**
+	 * Returns the Java method that invoked this parser.
+	 * <p>
+	 * When using the REST API, this is the Java method invoked by the REST call.
+	 * Can be used to access annotations defined on the method or class.
+	 *
+	 * @return The Java method that invoked this parser.
+	*/
+	public final Method getJavaMethod() {
+		return javaMethod;
+	}
+
+	/**
+	 * Returns the outer object used for instantiating top-level non-static member classes.
+	 * When using the REST API, this is the servlet object.
+	 *
+	 * @return The outer object.
+	*/
+	public final Object getOuter() {
+		return outer;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_debug} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_debug} setting value in this context.
+	 */
+	public final boolean isDebug() {
+		return debug;
+	}
+
+	/**
+	 * Returns the runtime properties associated with this context.
+	 *
+	 * @return The runtime properties associated with this context.
+	 */
+	public final ObjectMap getProperties() {
+		return properties;
+	}
+
+	/**
+	 * Logs a warning message.
+	 *
+	 * @param msg The warning message.
+	 * @param args Optional printf arguments to replace in the error message.
+	 */
+	public void addWarning(String msg, Object... args) {
+		msg = args.length == 0 ? msg : String.format(msg, args);
+		logger.warning(msg);
+		warnings.add(warnings.size() + 1 + ": " + msg);
+	}
+
+	/**
+	 * Perform cleanup on this context object if necessary.
+	 *
+	 * @throws ParseException
+	 */
+	public void close() throws ParseException {
+		if (closed)
+			throw new ParseException("Attempt to close ParserContext more than once.");
+		if (debug && warnings.size() > 0)
+			throw new ParseException("Warnings occurred during parsing: \n" + StringUtils.join(warnings, "\n"));
+	}
+
+	@Override /* Object */
+	protected void finalize() throws Throwable {
+		if (! closed)
+			throw new RuntimeException("ParserContext was not closed.");
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup$ParserEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup$ParserEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup$ParserEntry.class
new file mode 100755
index 0000000..01c92d0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup$ParserEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.class
new file mode 100755
index 0000000..85a3152
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.java
new file mode 100755
index 0000000..225eb77
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserGroup.java
@@ -0,0 +1,317 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import static com.ibm.juno.core.utils.ArrayUtils.*;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents a group of {@link Parser Parsers} that can be looked up by media type.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Provides the following features:
+ * <ul>
+ * 	<li>Finds parsers based on HTTP <code>Content-Type</code> header values.
+ * 	<li>Sets common properties on all parsers in a single method call.
+ * 	<li>Locks all parsers in a single method call.
+ * 	<li>Clones existing groups and all parsers within the group in a single method call.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Match ordering</h6>
+ * <p>
+ * 	Parsers are matched against <code>Content-Type</code> strings in the order they exist in this group.
+ * <p>
+ * 	Adding new entries will cause the entries to be prepended to the group.
+ *  	This allows for previous parsers to be overridden through subsequent calls.
+ * <p>
+ * 	For example, calling <code>g.append(P1.<jk>class</jk>,P2.<jk>class</jk>).append(P3.<jk>class</jk>,P4.<jk>class</jk>)</code>
+ * 	will result in the order <code>P3, P4, P1, P2</code>.
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct a new parser group</jc>
+ * 	ParserGroup g = <jk>new</jk> ParserGroup();
+ *
+ * 	<jc>// Add some parsers to it</jc>
+ * 	g.append(JsonParser.<jk>class</jk>, XmlParser.<jk>class</jk>);
+ *
+ * 	<jc>// Change settings on parsers simultaneously</jc>
+ * 	g.setProperty(BeanContextProperties.<jsf>BEAN_beansRequireSerializable</jsf>, <jk>true</jk>)
+ * 		.addFilters(CalendarFilter.ISO8601DT.<jk>class</jk>)
+ * 		.lock();
+ *
+ * 	<jc>// Find the appropriate parser by Content-Type</jc>
+ * 	ReaderParser p = (ReaderParser)g.getParser(<js>"text/json"</js>);
+ *
+ * 	<jc>// Parse a bean from JSON</jc>
+ * 	String json = <js>"{...}"</js>;
+ * 	AddressBook addressBook = p.parse(json, AddressBook.<jk>class</jk>);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ParserGroup extends Lockable {
+
+	private transient Map<String,ParserEntry> entryMap = new HashMap<String,ParserEntry>();
+	private transient LinkedList<ParserEntry> tempEntries = new LinkedList<ParserEntry>();
+	private transient ParserEntry[] entries;
+
+
+	/**
+	 * Registers the specified REST parsers with this parser group.
+	 *
+	 * @param p The parsers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup append(Parser<?>...p) {
+		checkLock();
+		entries = null;
+		for (Parser<?> pp : reverse(p))  {
+			ParserEntry e = new ParserEntry(pp);
+			tempEntries.addFirst(e);
+			for (String mediaType : e.mediaTypes)
+				entryMap.put(mediaType, e);
+		}
+		return this;
+	}
+
+	/**
+	 * Same as {@link #append(Parser[])}, except specify classes instead of class instances
+	 * 	 of {@link Parser}.
+	 * <p>
+	 * Note that this can only be used on {@link Parser Parsers} with no-arg constructors.
+	 *
+	 * @param p The parsers to append to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception Thrown if {@link Parser} could not be constructed.
+	 */
+	public ParserGroup append(Class<? extends Parser<?>>...p) throws Exception {
+		checkLock();
+		for (Class<? extends Parser<?>> c : reverse(p)) {
+			try {
+			append(c.newInstance());
+			} catch (NoClassDefFoundError e) {
+				// Ignore if dependent library not found (e.g. Jena).
+				System.err.println(e);
+			}
+		}
+		return this;
+	}
+
+	/**
+	 * Same as {@link #append(Class[])}, except specify a single class to avoid unchecked compile warnings.
+	 *
+	 * @param p The parser to append to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception Thrown if {@link Parser} could not be constructed.
+	 */
+	public ParserGroup append(Class<? extends Parser<?>> p) throws Exception {
+		checkLock();
+		try {
+		append(p.newInstance());
+		} catch (NoClassDefFoundError e) {
+			// Ignore if dependent library not found (e.g. Jena).
+			System.err.println(e);
+		}
+		return this;
+	}
+
+	/**
+	 * Returns the parser registered to handle the specified media type.
+	 * <p>
+	 * The media-type string must not contain any parameters such as <js>";charset=X"</js>.
+	 *
+	 * @param mediaType The media-type string (e.g. <js>"text/json"</js>).
+	 * @return The REST parser that handles the specified request content type, or <jk>null</jk> if
+	 * 		no parser is registered to handle it.
+	 */
+	public Parser<?> getParser(String mediaType) {
+		ParserEntry e = entryMap.get(mediaType);
+		return (e == null ? null : e.parser);
+	}
+
+	/**
+	 * Searches the group for a parser that can handle the specified media type.
+	 *
+	 * @param mediaType The accept string.
+	 * @return The media type registered by one of the parsers that matches the <code>mediaType</code> string,
+	 * 	or <jk>null</jk> if no media types matched.
+	 */
+	public String findMatch(String mediaType) {
+		MediaRange[] mr = MediaRange.parse(mediaType);
+		if (mr.length == 0)
+			mr = MediaRange.parse("*/*");
+
+		for (MediaRange a : mr)
+			for (ParserEntry e : getEntries())
+				for (MediaRange a2 : e.mediaRanges)
+					if (a.matches(a2))
+						return a2.getMediaType();
+
+		return null;
+	}
+
+	/**
+	 * Returns the media types that all parsers in this group can handle
+	 * <p>
+	 * Entries are ordered in the same order as the parsers in the group.
+	 *
+	 * @return The list of media types.
+	 */
+	public List<String> getSupportedMediaTypes() {
+		List<String> l = new ArrayList<String>();
+		for (ParserEntry e : getEntries())
+			for (String mt : e.mediaTypes)
+				if (! l.contains(mt))
+					l.add(mt);
+		return l;
+	}
+
+	private ParserEntry[] getEntries() {
+		if (entries == null)
+			entries = tempEntries.toArray(new ParserEntry[tempEntries.size()]);
+		return entries;
+	}
+
+	static class ParserEntry {
+		Parser<?> parser;
+		MediaRange[] mediaRanges;
+		String[] mediaTypes;
+
+		ParserEntry(Parser<?> p) {
+			parser = p;
+
+			mediaTypes = new String[p.getMediaTypes().length];
+			int i = 0;
+			for (String mt : p.getMediaTypes())
+				mediaTypes[i++] = mt.toLowerCase(Locale.ENGLISH);
+
+			List<MediaRange> l = new LinkedList<MediaRange>();
+			for (i = 0; i < mediaTypes.length; i++)
+				l.addAll(Arrays.asList(MediaRange.parse(mediaTypes[i])));
+			mediaRanges = l.toArray(new MediaRange[l.size()]);
+		}
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Convenience methods for setting properties on all parsers.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Shortcut for calling {@link Parser#setProperty(String, Object)} on all parsers in this group.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		for (ParserEntry e : getEntries())
+			e.parser.setProperty(property, value);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Parser#setProperties(ObjectMap)} on all parsers in this group.
+	 *
+	 * @param properties The properties to set.  Ignored if <jk>null</jk>.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup setProperties(ObjectMap properties) {
+		checkLock();
+		if (properties != null)
+			for (Map.Entry<String,Object> e : properties.entrySet())
+				setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Parser#addNotBeanClasses(Class[])} on all parsers in this group.
+	 *
+	 * @param classes The classes to specify as not-beans to the underlying bean context of all parsers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup addNotBeanClasses(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (ParserEntry e : getEntries())
+			e.parser.addNotBeanClasses(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Parser#addFilters(Class[])} on all parsers in this group.
+	 *
+	 * @param classes The classes to add bean filters for to the underlying bean context of all parsers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup addFilters(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (ParserEntry e : getEntries())
+			e.parser.addFilters(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Parser#addImplClass(Class, Class)} on all parsers in this group.
+	 *
+	 * @param <T> The interface or abstract class type.
+	 * @param interfaceClass The interface or abstract class.
+	 * @param implClass The implementation class.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public <T> ParserGroup addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		checkLock();
+		for (ParserEntry e : getEntries())
+			e.parser.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Locks this group and all parsers in this group.
+	 */
+	@Override /* Lockable */
+	public ParserGroup lock() {
+		super.lock();
+		for (ParserEntry e : getEntries())
+			e.parser.lock();
+		return this;
+	}
+
+	/**
+	 * Clones this group and all parsers in this group.
+	 */
+	@Override /* Lockable */
+	public ParserGroup clone() throws CloneNotSupportedException {
+		ParserGroup c = (ParserGroup)super.clone();
+		c.entryMap = new HashMap<String,ParserEntry>();
+		c.tempEntries = new LinkedList<ParserEntry>();
+		c.entries = null;
+		ParserEntry[] e = getEntries();
+		for (int i = e.length-1; i >= 0; i--)
+			c.append(e[i].parser.clone());
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.class
new file mode 100755
index 0000000..1e80272
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.java
new file mode 100755
index 0000000..8b24cc1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserListener.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Class for listening for certain parse events during a document parse.
+ * <p>
+ * 	Listeners can be registered with parsers through the {@link Parser#addListener(ParserListener)} method.
+ * </p>
+ * 	It should be noted that listeners are not automatically copied over to new parsers when a parser is cloned.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ParserListener {
+
+	/**
+	 * Gets called when an unknown bean property is detected in a document.
+	 * <p>
+	 * 	This method only gets called if {@link BeanContextProperties#BEAN_ignoreUnknownBeanProperties} setting is <jk>true</jk>.
+	 * 	Otherwise, the parser will throw a {@link ParseException}.
+	 *
+	 * @param <T> The class type of the bean.
+	 * @param propertyName The property name encountered in the document.
+	 * @param beanClass The bean class.
+	 * @param bean The bean.
+	 * @param line The line number where the unknown property was found (-1 if parser doesn't support line/column indicators).
+	 * @param col The column number where the unknown property was found (-1 if parser doesn't support line/column indicators).
+	 */
+	public <T> void onUnknownProperty(String propertyName, Class<T> beanClass, T bean, int line, int col) {
+		// Do something with information
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.class
new file mode 100755
index 0000000..d02c9bc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.java
new file mode 100755
index 0000000..0392b51
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserProperties.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Configurable properties common to all {@link Parser} classes.
+ * <p>
+ * 	Use the {@link Parser#setProperty(String, Object)} method to set property values.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ParserProperties implements Cloneable {
+
+	/**
+	 * Debug mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * Enables the following additional information during parsing:
+	 * <ul>
+	 * 	<li>When bean setters throws exceptions, the exception includes the object stack information
+	 * 		in order to determine how that method was invoked.
+	 * </ul>
+	 */
+	public static final String PARSER_debug = "Parser.debug";
+
+	boolean
+		debug = false;
+
+	/**
+	 * Sets the specified property value.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(PARSER_debug))
+			debug = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	@Override /* Object */
+	public ParserProperties clone() throws CloneNotSupportedException {
+		return (ParserProperties)super.clone();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.class
new file mode 100755
index 0000000..9dd18f7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.java
new file mode 100755
index 0000000..18b9478
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ParserReader.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import java.io.*;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Similar to a {@link java.io.PushbackReader} with a pushback buffer of 1 character.
+ * <p>
+ * 	Code is optimized to work with a 1 character buffer.
+ * <p>
+ * 	Additionally keeps track of current line and column number, and provides the ability to set
+ * 	mark points and capture characters from the previous mark point.
+ * <p>
+ * 	<b>Warning:</b>  Not thread safe.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ParserReader extends Reader {
+
+	/** Wrapped reader */
+	protected Reader r;
+
+	private char[] buff;       // Internal character buffer
+	private int line = 1;      // Current line number
+	private int column;        // Current column number
+	private int iCurrent = 0;  // Current pointer into character buffer
+	private int iMark = -1;    // Mark position in buffer
+	private int iEnd = 0;      // The last good character position in the buffer
+	private boolean endReached, holesExist;
+
+	ParserReader() {}
+
+	/**
+	 * Constructor for input from a {@link CharSequence}.
+	 *
+	 * @param in The character sequence being read from.
+	 */
+	public ParserReader(CharSequence in) {
+		this.r = new CharSequenceReader(in);
+		if (in == null)
+			this.buff = new char[0];
+		else
+			this.buff = new char[in.length() < 1024 ? in.length() : 1024];
+	}
+
+	/**
+	 * Constructor for input from a {@link Reader}).
+	 *
+	 * @param r The Reader being wrapped.
+	 * @param buffSize The buffer size to use for the buffered reader.
+	 */
+	public ParserReader(Reader r, int buffSize) {
+		if (r instanceof ParserReader)
+			this.r = ((ParserReader)r).r;
+		else
+			this.r = r;
+		this.buff = new char[buffSize <= 0 ? 1024 : Math.max(buffSize, 20)];
+	}
+
+	/**
+	 * Returns the current line number position in this reader.
+	 *
+	 * @return The current line number.
+	 */
+	public final int getLine() {
+		return line;
+	}
+
+	/**
+	 * Returns the current column number position in this reader.
+	 *
+	 * @return The current column number.
+	 */
+	public final int getColumn() {
+		return column;
+	}
+
+	/**
+	 * Reads a single character.
+	 * Note that this method does NOT process extended unicode characters (i.e. characters
+	 * 	above 0x10000), but rather returns them as two <jk>char</jk>s.
+	 * Use {@link #readCodePoint()} to ensure proper handling of extended unicode.
+	 *
+	 * @return The character read, or -1 if the end of the stream has been reached.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	@Override /* Reader */
+	public final int read() throws IOException {
+		int c = readFromBuff();
+		if (c == -1)
+			return -1;
+		if (c == '\n') {
+			line++;
+			column = 0;
+		} else {
+			column++;
+		}
+		return c;
+	}
+
+	/**
+	 * Same as {@link #read()} but detects and combines extended unicode characters (i.e. characters
+	 * 	above 0x10000).
+	 *
+	 * @return The character read, or -1 if the end of the stream has been reached.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final int readCodePoint() throws IOException {
+		int c = read();
+
+		// Characters that take up 2 chars.
+		if (c >= 0xd800 && c <= 0xdbff) {
+			int low = read();
+			if (low >= 0xdc00 && low <= 0xdfff)
+				c = 0x10000 + ((c - 0xd800) << 10) + (low - 0xdc00);
+		}
+
+		return c;
+	}
+
+	private final int readFromBuff() throws IOException {
+		while (iCurrent >= iEnd) {
+			if (endReached)
+				return -1;
+
+			// If there's still space at the end of this buffer, fill it.
+			// Make sure there's at least 2 character spaces free for extended unicode characters.
+			//if (false) {
+			if (iEnd+1 < buff.length) {
+				int x = read(buff, iCurrent, buff.length-iEnd);
+				if (x == -1) {
+					endReached = true;
+					return -1;
+				}
+				iEnd += x;
+
+			} else {
+				// If we're currently marking, then we want to copy from the current mark point
+				// to the beginning of the buffer and then fill in the remainder of buffer.
+				if (iMark >= 0) {
+
+					// If we're marking from the beginning of the array, we double the size of the
+					// buffer.  This isn't likely to occur often.
+					if (iMark == 0) {
+						char[] buff2 = new char[buff.length<<1];
+						System.arraycopy(buff, 0, buff2, 0, buff.length);
+						buff = buff2;
+
+					// Otherwise, we copy what's currently marked to the beginning of the buffer.
+					} else {
+						int copyBuff = iMark;
+						System.arraycopy(buff, copyBuff, buff, 0, buff.length - copyBuff);
+						iCurrent -= copyBuff;
+						iMark -= copyBuff;
+					}
+					int expected = buff.length - iCurrent;
+
+					int x = read(buff, iCurrent, expected);
+					if (x == -1) {
+						endReached = true;
+						iEnd = iCurrent;
+						return -1;
+					}
+					iEnd = iCurrent + x;
+				} else {
+					// Copy the last 10 chars in the buffer to the beginning of the buffer.
+					int copyBuff = Math.min(iCurrent, 10);
+					System.arraycopy(buff, iCurrent-copyBuff, buff, 0, copyBuff);
+
+					// Number of characters we expect to copy on the next read.
+					int expected = buff.length - copyBuff;
+					int x = read(buff, copyBuff, expected);
+					iCurrent = copyBuff;
+					if (x == -1) {
+						endReached = true;
+						iEnd = iCurrent;
+						return -1;
+					}
+					iEnd = iCurrent + x;
+				}
+			}
+		}
+		return buff[iCurrent++];
+	}
+
+	/**
+	 * Start buffering the calls to read() so that the text can be gathered from the mark
+	 * point on calling {@code getFromMarked()}.
+	 */
+	public final void mark() {
+		iMark = iCurrent;
+	}
+
+
+	/**
+	 * Peeks the next character in the stream.
+	 * <p>
+	 * 	This is equivalent to doing a {@code read()} followed by an {@code unread()}.
+	 *
+	 * @return The peeked character, or (char)-1 if the end of the stream has been reached.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final int peek() throws IOException {
+		int c = read();
+		if (c != -1)
+			unread();
+		return c;
+	}
+
+	/**
+	 * Read the specified number of characters off the stream.
+	 *
+	 * @param num The number of characters to read.
+	 * @return The characters packaged as a String.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final String read(int num) throws IOException {
+		char[] c = new char[num];
+		for (int i = 0; i < num; i++) {
+			int c2 = read();
+			if (c2 == -1)
+				return new String(c, 0, i);
+			c[i] = (char)c2;
+		}
+		return new String(c);
+	}
+
+	/**
+	 * Pushes the last read character back into the stream.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final ParserReader unread() throws IOException {
+		if (iCurrent <= 0)
+			throw new IOException("Buffer underflow.");
+		iCurrent--;
+		column--;
+		return this;
+	}
+
+	/**
+	 * Close this reader and the underlying reader.
+	 *
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	@Override /* Reader */
+	public void close() throws IOException {
+		r.close();
+	}
+
+	/**
+	 * Returns the contents of the reusable character buffer as a string, and
+	 * resets the buffer for next usage.
+	 *
+	 * @return The contents of the reusable character buffer as a string.
+	 */
+	public final String getMarked() {
+		return getMarked(0, 0);
+	}
+
+	/**
+	 * Same as {@link #getMarked()} except allows you to specify offsets
+	 * 	into the buffer.
+	 * <p>
+	 * For example, to return the marked string, but trim the first and last characters,
+	 * 	call the following:
+	 * <p class='bcode'>
+	 * 	getFromMarked(1, -1);
+	 * </p>
+	 *
+	 * @param offsetStart The offset of the start position.
+	 * @param offsetEnd The offset of the end position.
+	 * @return The contents of the reusable character buffer as a string.
+	 */
+	public final String getMarked(int offsetStart, int offsetEnd) {
+		int offset = 0;
+
+		// Holes are \u00FF 'delete' characters that we need to get rid of now.
+		if (holesExist) {
+			for (int i = iMark; i < iCurrent; i++) {
+				char c = buff[i];
+				if (c == 127)
+					offset++;
+				else
+					buff[i-offset] = c;
+			}
+			holesExist = false;
+		}
+		int start = iMark + offsetStart, len = iCurrent - iMark + offsetEnd - offsetStart - offset;
+		String s = new String(buff, start, len);
+		iMark = -1;
+		return s;
+	}
+
+	/**
+	 * Trims off the last character in the marking buffer.
+	 * Useful for removing escape characters from sequences.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public final ParserReader delete() {
+		return delete(1);
+	}
+
+	/**
+	 * Trims off the specified number of last characters in the marking buffer.
+	 * Useful for removing escape characters from sequences.
+	 *
+	 * @param count The number of characters to delete.
+	 * @return This object (for method chaining).
+	 */
+	public final ParserReader delete(int count) {
+		for (int i = 0; i < count; i++)
+			buff[iCurrent-i-1] = 127;
+		holesExist = true;
+		return this;
+	}
+
+	/**
+	 * Replaces the last character in the marking buffer with the specified character.
+	 * <code>offset</code> must be at least <code>1</code> for normal characters, and
+	 * <code>2</code> for extended unicode characters in order for the replacement
+	 * to fit into the buffer.
+	 *
+	 * @param c The new character.
+	 * @param offset The offset.
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	public final ParserReader replace(int c, int offset) throws IOException {
+		if (c < 0x10000) {
+			if (offset < 1)
+				throw new IOException("Buffer underflow.");
+			buff[iCurrent-offset] = (char)c;
+		} else {
+			if (offset < 2)
+				throw new IOException("Buffer underflow.");
+			c -= 0x10000;
+			buff[iCurrent-offset] = (char)(0xd800 + (c >> 10));
+			buff[iCurrent-offset+1] = (char)(0xdc00 + (c & 0x3ff));
+			offset--;
+		}
+		// Fill in the gap with DEL characters.
+		for (int i = 1; i < offset; i++)
+			buff[iCurrent-i] = 127;
+		holesExist |= (offset > 1);
+		return this;
+	}
+
+	/**
+	 * Replace the last read character in the buffer with the specified character.
+	 *
+	 * @param c The new character.
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	public final ParserReader replace(char c) throws IOException {
+		return replace(c, 1);
+	}
+
+	/**
+	 * Subclasses can override this method to provide additional filtering (e.g. {#link UrlEncodingParserReader}).
+	 * Default implementation simply calls the same method on the underlying reader.
+	 */
+	@Override /* Reader */
+	public int read(char[] cbuf, int off, int len) throws IOException {
+		return r.read(cbuf, off, len);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.class
new file mode 100755
index 0000000..430fce6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.class differ


[21/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.java
new file mode 100755
index 0000000..cf96164
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParser.java
@@ -0,0 +1,743 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static com.ibm.juno.core.html.HtmlParser.Tag.*;
+import static com.ibm.juno.core.utils.StringUtils.*;
+import static javax.xml.stream.XMLStreamConstants.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import javax.xml.namespace.*;
+import javax.xml.stream.*;
+import javax.xml.stream.events.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Parses text generated by the {@link HtmlSerializer} class back into a POJO model.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Content-Type</code> types: <code>text/html</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	See the {@link HtmlSerializer} class for a description of the HTML generated.
+ * <p>
+ * 	This class is used primarily for automated testing of the {@link HtmlSerializer} class.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Consumes({"text/html","text/html+stripped"})
+public final class HtmlParser extends ReaderParser {
+
+	/** Default parser, all default settings.*/
+	public static final HtmlParser DEFAULT = new HtmlParser().lock();
+
+	/** HTML specific properties currently defined on this class */
+	protected transient HtmlParserProperties hpp = new HtmlParserProperties();
+
+	/*
+	 * Reads anything starting at the current event.
+	 * <p>
+	 * 	Precondition:  Must be pointing at START_ELEMENT or CHARACTERS event.
+	 * 	Postcondition:  Pointing at next event to be processed.
+	 */
+	private <T> T parseAnything(HtmlParserContext ctx, ClassMeta<T> nt, XMLEventReader r, Object outer, Object name) throws ParseException, IOException {
+
+		try {
+			BeanContext bc = ctx.getBeanContext();
+			if (nt == null)
+				nt = (ClassMeta<T>)object();
+			PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+			ClassMeta<?> ft = nt.getFilteredClassMeta();
+
+			Object o = null;
+
+			XMLEvent event = r.nextEvent();
+			while (! (event.isStartElement() || (event.isCharacters() && ! event.asCharacters().isWhiteSpace()) || event.isEndDocument()))
+				event = r.nextEvent();
+
+			if (event.isEndDocument())
+				throw new XMLStreamException("Unexpected end of stream in parseAnything for type '"+nt+"'", event.getLocation());
+
+			if (event.isCharacters()) {
+				String text = parseCharacters(event, r);
+				if (ft.isObject())
+					o = text;
+				else if (ft.isCharSequence())
+					o = text;
+				else if (ft.isNumber())
+					o = parseNumber(text, (Class<? extends Number>)nt.getInnerClass());
+				else if (ft.isChar())
+					o = text.charAt(0);
+				else if (ft.isBoolean())
+					o = Boolean.parseBoolean(text);
+				else if (ft.canCreateNewInstanceFromString(outer))
+					o = ft.newInstanceFromString(outer, text);
+				else
+					throw new XMLStreamException("Unexpected characters '"+event.asCharacters().getData()+"' for type '"+nt+"'", event.getLocation());
+
+			} else {
+				Tag tag = Tag.forString(event.asStartElement().getName().getLocalPart(), false);
+				String tableType = "object";
+				String text = "";
+
+				if (tag.isOneOf(STRING, NUMBER, BOOLEAN, BR, FF, BS, TB))
+					text = parseCharacters(event, r);
+
+				if (tag == TABLE) {
+					Map<String,String> attrs = getAttributes(event);
+					tableType = attrs.get("type");
+					String c = attrs.get("_class");
+					if (c != null)
+						ft = nt = (ClassMeta<T>)bc.getClassMetaFromString(c);
+				}
+
+				boolean isValid = true;
+
+				if (tag == NULL)
+					nextTag(r, xNULL);
+				else if (tag == A)
+					o = parseAnchor(ctx, event, r, nt);
+				else if (ft.isObject()) {
+					if (tag == STRING)
+						o = text;
+					else if (tag == NUMBER)
+						o = parseNumber(text, null);
+					else if (tag == BOOLEAN)
+						o = Boolean.parseBoolean(text);
+					else if (tag == TABLE) {
+						if (tableType.equals("object")) {
+							o = parseIntoMap(ctx, r, (Map)new ObjectMap(bc), ft.getKeyType(), ft.getValueType());
+						} else if (tableType.equals("array")) {
+							o = parseTableIntoCollection(ctx, r, (Collection)new ObjectList(bc), ft.getElementType());
+						} else
+							isValid = false;
+					}
+					else if (tag == UL)
+						o = parseIntoCollection(ctx, r, new ObjectList(bc), null);
+				}
+				else if (tag == STRING && ft.isCharSequence())
+					o = text;
+				else if (tag == STRING && ft.isChar())
+					o = text.charAt(0);
+				else if (tag == STRING && ft.canCreateNewInstanceFromString(outer))
+					o = ft.newInstanceFromString(outer, text);
+				else if (tag == NUMBER && ft.isNumber())
+					o = parseNumber(text, (Class<? extends Number>)ft.getInnerClass());
+				else if (tag == BOOLEAN && ft.isBoolean())
+					o = Boolean.parseBoolean(text);
+				else if (tag == TABLE) {
+					if (tableType.equals("object")) {
+						if (ft.isMap()) {
+							o = parseIntoMap(ctx, r, (Map)(ft.canCreateNewInstance(outer) ? ft.newInstance(outer) : new ObjectMap(bc)), ft.getKeyType(), ft.getValueType());
+						} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+							ObjectMap m = new ObjectMap(bc);
+							parseIntoMap(ctx, r, m, string(), object());
+							o = ft.newInstanceFromObjectMap(outer, m);
+						} else if (ft.canCreateNewBean(outer)) {
+							BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+							o = parseIntoBean(ctx, r, m).getBean();
+						}
+						else
+							isValid = false;
+					} else if (tableType.equals("array")) {
+						if (ft.isCollection())
+							o = parseTableIntoCollection(ctx, r, (Collection)(ft.canCreateNewInstance(outer) ? ft.newInstance(outer) : new ObjectList(bc)), ft.getElementType());
+						else if (ft.isArray())
+							o = bc.toArray(ft, parseTableIntoCollection(ctx, r, new ArrayList(), ft.getElementType()));
+						else
+							isValid = false;
+					} else
+						isValid = false;
+				} else if (tag == UL) {
+					if (ft.isCollection())
+						o = parseIntoCollection(ctx, r, (Collection)(ft.canCreateNewInstance(outer) ? ft.newInstance(outer) : new ObjectList(bc)), ft.getElementType());
+					else if (ft.isArray())
+						o = bc.toArray(ft, parseIntoCollection(ctx, r, new ArrayList(), ft.getElementType()));
+					else
+						isValid = false;
+				} else
+					isValid = false;
+
+				if (! isValid)
+					throw new XMLStreamException("Unexpected tag '"+tag+"' for type '"+nt+"'", event.getLocation());
+			}
+
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (name != null)
+				setName(nt, o, name);
+
+			return (T)o;
+
+		} catch (ParseException e) {
+			throw e;
+		} catch (IOException e) {
+			throw e;
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/*
+	 * Reads an anchor tag and converts it into a bean.
+	 */
+	private <T> T parseAnchor(HtmlParserContext ctx, XMLEvent e, XMLEventReader r, ClassMeta<T> beanType) throws XMLStreamException {
+		BeanContext bc = ctx.getBeanContext();
+		String href = e.asStartElement().getAttributeByName(new QName("href")).getValue();
+		String name = parseCharacters(e, r);
+		Class<T> beanClass = beanType.getInnerClass();
+		if (beanClass.isAnnotationPresent(HtmlLink.class)) {
+			HtmlLink h = beanClass.getAnnotation(HtmlLink.class);
+			BeanMap<T> m = bc.newBeanMap(beanClass);
+			m.put(h.hrefProperty(), href);
+			m.put(h.nameProperty(), name);
+			return m.getBean();
+		}
+		return bc.convertToType(href, beanType);
+	}
+
+	private Map<String,String> getAttributes(XMLEvent e) {
+		Map<String,String> m = new TreeMap<String,String>() ;
+		for (Iterator i = e.asStartElement().getAttributes(); i.hasNext();) {
+			Attribute a = (Attribute)i.next();
+			m.put(a.getName().getLocalPart(), a.getValue());
+		}
+		return m;
+	}
+
+	/*
+	 * Reads contents of <table> element.
+	 * Precondition:  Must be pointing at <table> event.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private <K,V> Map<K,V> parseIntoMap(HtmlParserContext ctx, XMLEventReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws ParseException, IOException {
+		try {
+			Tag tag = nextTag(r, TR);
+
+			// Skip over the column headers.
+			nextTag(r, TH);
+			parseElementText(r, xTH);
+			nextTag(r, TH);
+			parseElementText(r, xTH);
+			nextTag(r, xTR);
+
+			while (true) {
+				tag = nextTag(r, TR, xTABLE);
+				if (tag == xTABLE)
+					break;
+				nextTag(r, TD);
+				K key = parseAnything(ctx, keyType, r, m, null);
+				nextTag(r, xTD);
+				nextTag(r, TD);
+				m.put(key, parseAnything(ctx, valueType, r, m, key));
+				nextTag(r, xTD);
+				nextTag(r, xTR);
+			}
+
+			return m;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/*
+	 * Reads contents of <ul> element.
+	 * Precondition:  Must be pointing at event following <ul> event.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private <E> Collection<E> parseIntoCollection(HtmlParserContext ctx, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws ParseException, IOException {
+		try {
+			while (true) {
+				Tag tag = nextTag(r, LI, xUL);
+				if (tag == xUL)
+					break;
+				l.add(parseAnything(ctx, elementType, r, l, null));
+				nextTag(r, xLI);
+			}
+			return l;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/*
+	 * Reads contents of <ul> element into an Object array.
+	 * Precondition:  Must be pointing at event following <ul> event.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private Object[] parseArgs(HtmlParserContext ctx, XMLEventReader r, ClassMeta<?>[] argTypes) throws ParseException, IOException {
+		try {
+			Object[] o = new Object[argTypes.length];
+			int i = 0;
+			while (true) {
+				Tag tag = nextTag(r, LI, xUL);
+				if (tag == xUL)
+					break;
+				o[i] = parseAnything(ctx, argTypes[i], r, ctx.getOuter(), null);
+				i++;
+				nextTag(r, xLI);
+			}
+			return o;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/*
+	 * Reads contents of <ul> element.
+	 * Precondition:  Must be pointing at event following <ul> event.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private <E> Collection<E> parseTableIntoCollection(HtmlParserContext ctx, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+
+		BeanContext bc = ctx.getBeanContext();
+		if (elementType == null)
+			elementType = (ClassMeta<E>)object();
+
+		Tag tag = nextTag(r, TR);
+		List<String> keys = new ArrayList<String>();
+		while (true) {
+			tag = nextTag(r, TH, xTR);
+			if (tag == xTR)
+				break;
+			keys.add(parseElementText(r, xTH));
+		}
+
+		while (true) {
+			XMLEvent event = r.nextTag();
+			tag = Tag.forEvent(event);
+			if (tag == xTABLE)
+				break;
+			if (elementType.canCreateNewBean(l)) {
+				BeanMap m = bc.newBeanMap(l, elementType.getInnerClass());
+				for (int i = 0; i < keys.size(); i++) {
+					tag = nextTag(r, TD, NULL);
+					if (tag == NULL) {
+						m = null;
+						nextTag(r, xNULL);
+						break;
+					}
+					String key = keys.get(i);
+					BeanMapEntry e = m.getProperty(key);
+					if (e == null) {
+						//onUnknownProperty(key, m, -1, -1);
+						parseAnything(ctx, object(), r, l, null);
+					} else {
+						e.getMeta().set(m, parseAnything(ctx, e.getMeta().getClassMeta(), r, m.getBean(false), key));
+					}
+					nextTag(r, xTD);
+				}
+				l.add(m == null ? null : (E)m.getBean());
+			} else {
+				String c = getAttributes(event).get("_class");
+				Map m = (Map)(elementType.isMap() && elementType.canCreateNewInstance(l) ? elementType.newInstance(l) : new ObjectMap(bc));
+				for (int i = 0; i < keys.size(); i++) {
+					tag = nextTag(r, TD, NULL);
+					if (tag == NULL) {
+						m = null;
+						nextTag(r, xNULL);
+						break;
+					}
+					String key = keys.get(i);
+					if (m != null)
+						m.put(key, parseAnything(ctx, elementType.getElementType(), r, l, key));
+					nextTag(r, xTD);
+				}
+				if (m != null && c != null) {
+					ObjectMap m2 = (m instanceof ObjectMap ? (ObjectMap)m : new ObjectMap(m).setBeanContext(ctx.getBeanContext()));
+					m2.put("_class", c);
+					l.add((E)m2.cast());
+				} else {
+					l.add((E)m);
+				}
+			}
+			nextTag(r, xTR);
+		}
+		return l;
+	}
+
+	/*
+	 * Reads contents of <table> element.
+	 * Precondition:  Must be pointing at event following <table> event.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private <T> BeanMap<T> parseIntoBean(HtmlParserContext ctx, XMLEventReader r, BeanMap<T> m) throws Exception {
+		Tag tag = nextTag(r, TR);
+
+		// Skip over the column headers.
+		nextTag(r, TH);
+		parseElementText(r, xTH);
+		nextTag(r, TH);
+		parseElementText(r, xTH);
+		nextTag(r, xTR);
+
+		while (true) {
+			tag = nextTag(r, TR, xTABLE);
+			if (tag == xTABLE)
+				break;
+			nextTag(r, TD);
+			String key = parseElementText(r, xTD);
+			nextTag(r, TD);
+			BeanPropertyMeta pMeta = m.getPropertyMeta(key);
+			if (pMeta == null) {
+				if (m.getMeta().isSubTyped()) {
+					m.put(key, parseAnything(ctx, object(), r, m.getBean(false), key));
+				} else {
+					onUnknownProperty(ctx, key, m, -1, -1);
+					parseAnything(ctx, object(), r, null, null);
+				}
+			} else {
+				pMeta.set(m, parseAnything(ctx, pMeta.getClassMeta(), r, m.getBean(false), key));
+			}
+			nextTag(r, xTD);
+			nextTag(r, xTR);
+		}
+		return m;
+	}
+
+	/*
+	 * Parse until the next event is an end tag.
+	 */
+	private String parseCharacters(XMLEvent e, XMLEventReader r) throws XMLStreamException {
+
+		List<String> strings = new LinkedList<String>();
+
+		while (true) {
+			int eventType = e.getEventType();
+			if (eventType == CHARACTERS) {
+				Characters c = e.asCharacters();
+				if (! c.isWhiteSpace())
+					strings.add(c.getData());
+			}
+			else if (eventType == START_ELEMENT) {
+				Tag tag = Tag.forEvent(e);
+				if (tag == BR)
+					strings.add("\n");
+				else if (tag == FF)
+					strings.add("\f");
+				else if (tag == BS)
+					strings.add("\b");
+				else if (tag == TB)
+					strings.add("\t");
+			}
+			// Ignore all other elements.
+
+			XMLEvent eNext = r.peek();
+
+			if (eNext.isStartElement() || eNext.isEndElement()) {
+				Tag tag = Tag.forEvent(eNext);
+				if (! (tag.isOneOf(A, xA, BR, xBR, FF, xFF, BS, xBS, TB, xTB, STRING, xSTRING, NUMBER, xNUMBER, BOOLEAN, xBOOLEAN)))
+					return trim(join(strings));
+			} else if (eNext.isEndDocument()) {
+				return trim(join(strings));
+			}
+
+			e = r.nextEvent();
+		}
+	}
+
+	private String trim(String s) {
+		int i2 = 0, i3;
+		for (i2 = 0; i2 < s.length(); i2++) {
+			char c = s.charAt(i2);
+			if (c != ' ')
+				break;
+		}
+		for (i3 = s.length(); i3 > i2; i3--) {
+			char c = s.charAt(i3-1);
+			if (c != ' ')
+				break;
+		}
+		return s.substring(i2, i3);
+	}
+
+	/*
+	 * Reads the element text of the current element, accounting for <a> and <br> tags. <br>
+	 * Precondition:  Must be pointing at first event AFTER the start tag.
+	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
+	 */
+	private String parseElementText(XMLEventReader r, Tag endTag) throws XMLStreamException {
+
+		List<String> strings = new LinkedList<String>();
+
+		XMLEvent e = r.nextEvent();
+		Tag nTag = (e.isEndElement() ? Tag.forEvent(e) : null);
+
+		while (nTag != endTag) {
+			if (e.isCharacters())
+				strings.add(parseCharacters(e, r));
+			e = r.nextEvent();
+
+			if (e.getEventType() == END_ELEMENT)
+				nTag = Tag.forEvent(e);
+
+			if (nTag == endTag)
+				return join(strings);
+		}
+
+		return "";
+	}
+
+	enum Tag {
+
+		TABLE(1,"<table>"),
+		TR(2,"<tr>"),
+		TH(3,"<th>"),
+		TD(4,"<td>"),
+		UL(5,"<ul>"),
+		LI(6,"<li>"),
+		STRING(7,"<string>"),
+		NUMBER(8,"<number>"),
+		BOOLEAN(9,"<boolean>"),
+		NULL(10,"<null>"),
+		A(11,"<a>"),
+		BR(12,"<br>"),		// newline
+		FF(13,"<ff>"),		// formfeed
+		BS(14,"<bs>"),		// backspace
+		TB(15,"<tb>"),		// tab
+		xTABLE(-1,"</table>"),
+		xTR(-2,"</tr>"),
+		xTH(-3,"</th>"),
+		xTD(-4,"</td>"),
+		xUL(-5,"</ul>"),
+		xLI(-6,"</li>"),
+		xSTRING(-7,"</string>"),
+		xNUMBER(-8,"</number>"),
+		xBOOLEAN(-9,"</boolean>"),
+		xNULL(-10,"</null>"),
+		xA(-11,"</a>"),
+		xBR(-12,"</br>"),
+		xFF(-13,"</ff>"),
+		xBS(-14,"</bs>"),
+		xTB(-15,"</tb>");
+
+		private Map<Integer,Tag> cache = new HashMap<Integer,Tag>();
+
+		int id;
+		String label;
+
+		Tag(int id, String label) {
+			this.id = id;
+			this.label = label;
+			cache.put(id, this);
+		}
+
+		static Tag forEvent(XMLEvent event) throws XMLStreamException {
+			if (event.isStartElement())
+				return forString(event.asStartElement().getName().getLocalPart(), false);
+			else if (event.isEndElement())
+				return forString(event.asEndElement().getName().getLocalPart(), true);
+			throw new XMLStreamException("Invalid call to Tag.forEvent on event of type ["+event.getEventType()+"]");
+		}
+
+		private static Tag forString(String tag, boolean end) throws XMLStreamException {
+			char c = tag.charAt(0);
+			Tag t = null;
+			if (c == 'u')
+				t = (end ? xUL : UL);
+			else if (c == 'l')
+				t = (end ? xLI : LI);
+			else if (c == 's')
+				t = (end ? xSTRING : STRING);
+			else if (c == 'b') {
+				c = tag.charAt(1);
+				if (c == 'o')
+					t = (end ? xBOOLEAN : BOOLEAN);
+				else if (c == 'r')
+					t = (end ? xBR : BR);
+				else if (c == 's')
+					t = (end ? xBS : BS);
+			}
+			else if (c == 'a')
+				t = (end ? xA : A);
+			else if (c == 'n') {
+				c = tag.charAt(2);
+				if (c == 'm')
+					t = (end ? xNUMBER : NUMBER);
+				else if (c == 'l')
+					t = (end ? xNULL : NULL);
+			}
+			else if (c == 't') {
+				c = tag.charAt(1);
+				if (c == 'a')
+					t = (end ? xTABLE : TABLE);
+				else if (c == 'r')
+					t = (end ? xTR : TR);
+				else if (c == 'h')
+					t = (end ? xTH : TH);
+				else if (c == 'd')
+					t = (end ? xTD : TD);
+				else if (c == 'b')
+					t = (end ? xTB : TB);
+			}
+			else if (c == 'f')
+				t = (end ? xFF : FF);
+			if (t == null)
+				throw new XMLStreamException("Unknown tag '"+tag+"' encountered");
+			return t;
+		}
+
+		@Override /* Object */
+		public String toString() {
+			return label;
+		}
+
+		public boolean isOneOf(Tag...tags) {
+			for (Tag tag : tags)
+				if (tag == this)
+					return true;
+			return false;
+		}
+	}
+
+	/*
+	 * Reads the current tag.  Advances past anything that's not a start or end tag.  Throws an exception if
+	 * 	it's not one of the expected tags.
+	 * Precondition:  Must be pointing before the event we want to parse.
+	 * Postcondition:  Pointing at the tag just parsed.
+	 */
+	private Tag nextTag(XMLEventReader r, Tag...expected) throws XMLStreamException {
+		XMLEvent event = r.nextTag();
+		Tag tag = Tag.forEvent(event);
+		if (expected.length == 0)
+			return tag;
+		for (Tag t : expected)
+			if (t == tag)
+				return tag;
+		throw new XMLStreamException("Unexpected tag: " + tag, event.getLocation());
+	}
+
+	private String join(List<String> s) {
+		if (s.size() == 0)
+			return "";
+		if (s.size() == 1)
+			return s.get(0);
+		StringBuilder sb = new StringBuilder();
+		for (String ss : s)
+			sb.append(ss);
+		return sb.toString();
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public HtmlParserContext createContext(ObjectMap properties, Method javaMethod, Object outer) {
+		return new HtmlParserContext(getBeanContext(), pp, hpp, properties, javaMethod, outer);
+	}
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+		HtmlParserContext ctx2 = (HtmlParserContext)ctx;
+		return parseAnything(ctx2, type, ctx2.getReader(in, estimatedSize), ctx.getOuter(), null);
+	}
+
+	@Override /* ReaderParser */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		HtmlParserContext hctx = (HtmlParserContext)ctx;
+		return parseIntoMap(hctx, hctx.getReader(in, estimatedSize), m, ctx.getBeanContext().getClassMeta(keyType), ctx.getBeanContext().getClassMeta(valueType));
+	}
+
+	@Override /* ReaderParser */
+	protected <E> Collection<E> doParseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType, ParserContext ctx) throws ParseException, IOException {
+		HtmlParserContext hctx = (HtmlParserContext)ctx;
+		return parseIntoCollection(hctx, hctx.getReader(in, estimatedSize), c, ctx.getBeanContext().getClassMeta(elementType));
+	}
+
+	@Override /* ReaderParser */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		HtmlParserContext hctx = (HtmlParserContext)ctx;
+		return parseArgs(hctx, hctx.getReader(in, estimatedSize), argTypes);
+	}
+
+	@Override /* CoreApi */
+	public HtmlParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! hpp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> HtmlParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public HtmlParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public HtmlParser clone() {
+		try {
+			return (HtmlParser)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.class
new file mode 100755
index 0000000..00ee7b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.java
new file mode 100755
index 0000000..b23546e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserContext.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import javax.xml.stream.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Context object that lives for the duration of a single parsing of {@link HtmlParser}.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class HtmlParserContext extends ParserContext {
+
+	private XMLEventReader xmlEventReader;
+
+	/**
+	 * Create a new parser context with the specified options.
+	 *
+	 * @param beanContext The bean context being used.
+	 * @param pp The default generic parser properties.
+	 * @param hpp The default HTML parser properties.
+	 * @param properties The override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	public HtmlParserContext(BeanContext beanContext, ParserProperties pp, HtmlParserProperties hpp, ObjectMap properties, Method javaMethod, Object outer) {
+		super(beanContext, pp, properties, javaMethod, outer);
+	}
+
+	/**
+	 * Wraps the specified reader in an {@link XMLEventReader}.
+	 * This event reader gets closed by the {@link #close()} method.
+	 *
+	 * @param in The reader to read from.
+	 * @param estimatedSize The estimated size of the input.  If <code>-1</code>, uses a default size of <code>8196</code>.
+	 * @return A new XML event reader using a new {@link XMLInputFactory}.
+	 * @throws ParseException
+	 */
+	protected XMLEventReader getReader(Reader in, int estimatedSize) throws ParseException {
+		try {
+			in = IOUtils.getBufferedReader(in, estimatedSize);
+			XMLInputFactory factory = XMLInputFactory.newInstance();
+			factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
+			this.xmlEventReader = factory.createXMLEventReader(in);
+		} catch (Error e) {
+			throw new ParseException(e.getLocalizedMessage());
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+		return xmlEventReader;
+	}
+
+	@Override /* ParserContext */
+	public void close() throws ParseException {
+		if (xmlEventReader != null) {
+			try {
+				xmlEventReader.close();
+			} catch (XMLStreamException e) {
+				throw new ParseException(e);
+			}
+		}
+		super.close();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.class
new file mode 100755
index 0000000..9fb0222
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.java
new file mode 100755
index 0000000..5d2ff60
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlParserProperties.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Configurable properties on the {@link HtmlParser} class.
+ * <p>
+ * 	Use the {@link HtmlParser#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link HtmlParser}.
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class HtmlParserProperties implements Cloneable {
+
+	/**
+	 * Sets the specified property value.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	protected boolean setProperty(String property, Object value) {
+		return false;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Lockable */
+	public HtmlParserProperties clone() {
+		try {
+			return (HtmlParserProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.class
new file mode 100755
index 0000000..b25c1fa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.java
new file mode 100755
index 0000000..2cf8d95
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSchemaDocSerializer.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJO metamodels to HTML.
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/html+schema</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/html</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Essentially the same as {@link HtmlSerializer}, except serializes the POJO metamodel
+ * 		instead of the model itself.
+ * <p>
+ * 	Produces output that describes the POJO metamodel similar to an XML schema document.
+ * <p>
+ * 	The easiest way to create instances of this class is through the {@link HtmlSerializer#getSchemaSerializer()},
+ * 		which will create a schema serializer with the same settings as the originating serializer.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces(value="text/html+schema", contentType="text/html")
+public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
+
+	/**
+	 * Constructor.
+	 */
+	public HtmlSchemaDocSerializer() {
+		setProperty(SERIALIZER_detectRecursions, true);
+		setProperty(SERIALIZER_ignoreRecursions, true);
+	}
+
+	@Override /* ISchemaSerializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		HtmlSerializerContext hctx = (HtmlSerializerContext)ctx;
+		ObjectMap schema = getSchema(ctx.getBeanContext().getClassMetaForObject(o), hctx, "root", null);
+		super.doSerialize(schema, out, ctx);
+	}
+
+	/*
+	 * Creates a schema representation of the specified class type.
+	 *
+	 * @param eType The class type to get the schema of.
+	 * @param ctx Serialize context used to prevent infinite loops.
+	 * @param attrName The name of the current attribute.
+	 * @return A schema representation of the specified class.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private ObjectMap getSchema(ClassMeta<?> eType, HtmlSerializerContext ctx, String attrName, String[] pNames) throws SerializeException {
+		try {
+
+			ObjectMap out = new ObjectMap();
+
+			ClassMeta<?> aType;			// The actual type (will be null if recursion occurs)
+			ClassMeta<?> gType;			// The generic type
+
+			aType = ctx.push(attrName, eType, null);
+
+			gType = eType.getFilteredClassMeta();
+			String type = null;
+
+			if (gType.isEnum() || gType.isCharSequence() || gType.isChar())
+				type = "string";
+			else if (gType.isNumber())
+				type = "number";
+			else if (gType.isBoolean())
+				type = "boolean";
+			else if (gType.isBean() || gType.isMap())
+				type = "object";
+			else if (gType.isCollection() || gType.isArray())
+				type = "array";
+			else
+				type = "any";
+
+			out.put("type", type);
+			out.put("class", eType.toString());
+			PojoFilter f = eType.getPojoFilter();
+			if (f != null)
+				out.put("filter", f);
+
+			if (aType != null) {
+				if (gType.isEnum())
+					out.put("enum", getEnumStrings((Class<Enum<?>>)gType.getInnerClass()));
+				else if (gType.isCollection() || gType.isArray()) {
+					ClassMeta componentType = gType.getElementType();
+					if (gType.isCollection() && isParentClass(Set.class, gType.getInnerClass()))
+						out.put("uniqueItems", true);
+					out.put("items", getSchema(componentType, ctx, "items", pNames));
+				} else if (gType.isBean()) {
+					ObjectMap properties = new ObjectMap();
+					BeanMeta bm = ctx.getBeanContext().getBeanMeta(gType.getInnerClass());
+					if (pNames != null)
+						bm = new BeanMetaFiltered(bm, pNames);
+					for (Iterator<BeanPropertyMeta<?>> i = bm.getPropertyMetas().iterator(); i.hasNext();) {
+						BeanPropertyMeta p = i.next();
+						properties.put(p.getName(), getSchema(p.getClassMeta(), ctx, p.getName(), p.getProperties()));
+					}
+					out.put("properties", properties);
+				}
+			}
+			ctx.pop();
+			return out;
+		} catch (StackOverflowError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new SerializeException("Exception occured trying to process object of type ''{0}''", eType).initCause(e);
+		}
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private List<String> getEnumStrings(Class<? extends Enum> c) {
+		List<String> l = new LinkedList<String>();
+		try {
+			for (Object e : EnumSet.allOf(c))
+				l.add(e.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$Sq.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$Sq.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$Sq.class
new file mode 100755
index 0000000..dc9c801
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$Sq.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$SqReadable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$SqReadable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$SqReadable.class
new file mode 100755
index 0000000..6e0df08
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer$SqReadable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.class
new file mode 100755
index 0000000..e182a2c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.java
new file mode 100755
index 0000000..022235d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializer.java
@@ -0,0 +1,668 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static com.ibm.juno.core.html.HtmlSerializerProperties.*;
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.xml.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Serializes POJO models to HTML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/html</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/html</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	The conversion is as follows...
+ * 	<ul>
+ * 		<li>{@link Map Maps} (e.g. {@link HashMap}, {@link TreeMap}) and beans are converted to HTML tables with 'key' and 'value' columns.
+ * 		<li>{@link Collection Collections} (e.g. {@link HashSet}, {@link LinkedList}) and Java arrays are converted to HTML ordered lists.
+ * 		<li>{@code Collections} of {@code Maps} and beans are converted to HTML tables with keys as headers.
+ * 		<li>Everything else is converted to text.
+ * 	</ul>
+ * <p>
+ * 	This serializer provides several serialization options.  Typically, one of the predefined <jsf>DEFAULT</jsf> serializers will be sufficient.
+ * 	However, custom serializers can be constructed to fine-tune behavior.
+ * <p>
+ * 	The {@link HtmlLink} annotation can be used on beans to add hyperlinks to the output.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link HtmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link Sq} - Default serializer, single quotes.
+ * 	<li>{@link SqReadable} - Default serializer, single quotes, whitespace added.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Use one of the default serializers to serialize a POJO</jc>
+ * 		String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);
+ *
+ * 		<jc>// Create a custom serializer that doesn't use whitespace and newlines</jc>
+ * 		HtmlSerializer serializer = <jk>new</jk> HtmlSerializer()
+ * 			.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>false</jk>);
+ *
+ * 		<jc>// Same as above, except uses cloning</jc>
+ * 		HtmlSerializer serializer = HtmlSerializer.<jsf>DEFAULT</jsf>.clone()
+ * 			.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>false</jk>);
+ *
+ * 		<jc>// Serialize POJOs to HTML</jc>
+ *
+ * 		<jc>// Produces: </jc>
+ * 		<jc>// &lt;ul&gt;&lt;li&gt;1&lt;li&gt;2&lt;li&gt;3&lt;/ul&gt;</jc>
+ * 		List l = new ObjectList(1, 2, 3);
+ * 		String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(l);
+ *
+ * 		<jc>// Produces: </jc>
+ * 		<jc>//    &lt;table&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;th&gt;firstName&lt;/th&gt;&lt;th&gt;lastName&lt;/th&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;td&gt;Bob&lt;/td&gt;&lt;td&gt;Costas&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;td&gt;Billy&lt;/td&gt;&lt;td&gt;TheKid&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;td&gt;Barney&lt;/td&gt;&lt;td&gt;Miller&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//    &lt;/table&gt; </jc>
+ * 		l = <jk>new</jk> ObjectList();
+ * 		l.add(<jk>new</jk> ObjectMap(<js>"{firstName:'Bob',lastName:'Costas'}"</js>));
+ * 		l.add(<jk>new</jk> ObjectMap(<js>"{firstName:'Billy',lastName:'TheKid'}"</js>));
+ * 		l.add(<jk>new</jk> ObjectMap(<js>"{firstName:'Barney',lastName:'Miller'}"</js>));
+ * 		String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(l);
+ *
+ * 		<jc>// Produces: </jc>
+ * 		<jc>//    &lt;table&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;td&gt;foo&lt;/td&gt;&lt;td&gt;bar&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//       &lt;tr&gt;&lt;td&gt;baz&lt;/td&gt;&lt;td&gt;123&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//    &lt;/table&gt; </jc>
+ * 		Map m = <jk>new</jk> ObjectMap(<js>"{foo:'bar',baz:123}"</js>);
+ * 		String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(m);
+ *
+ * 		<jc>// HTML elements can be nested arbitrarily deep</jc>
+ * 		<jc>// Produces: </jc>
+ * 		<jc>//	&lt;table&gt; </jc>
+ * 		<jc>//		&lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//		&lt;tr&gt;&lt;td&gt;foo&lt;/td&gt;&lt;td&gt;bar&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//		&lt;tr&gt;&lt;td&gt;baz&lt;/td&gt;&lt;td&gt;123&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//		&lt;tr&gt;&lt;td&gt;someNumbers&lt;/td&gt;&lt;td&gt;&lt;ul&gt;&lt;li&gt;1&lt;li&gt;2&lt;li&gt;3&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//		&lt;tr&gt;&lt;td&gt;someSubMap&lt;/td&gt;&lt;td&gt; </jc>
+ * 		<jc>//			&lt;table&gt; </jc>
+ * 		<jc>//				&lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//				&lt;tr&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//			&lt;/table&gt; </jc>
+ * 		<jc>//		&lt;/td&gt;&lt;/tr&gt; </jc>
+ * 		<jc>//	&lt;/table&gt; </jc>
+ * 		Map m = <jk>new</jk> ObjectMap(<js>"{foo:'bar',baz:123}"</js>);
+ * 		m.put("someNumbers", new ObjectList(1, 2, 3));
+ * 		m.put(<js>"someSubMap"</js>, new ObjectMap(<js>"{a:'b'}"</js>));
+ * 		String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(m);
+ * </p>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("text/html")
+@SuppressWarnings("hiding")
+public class HtmlSerializer extends XmlSerializer {
+
+	/** Default serializer, all default settings. */
+	public static final HtmlSerializer DEFAULT = new HtmlSerializer().lock();
+
+	/** Default serializer, single quotes. */
+	public static final HtmlSerializer DEFAULT_SQ = new HtmlSerializer.Sq().lock();
+
+	/** Default serializer, single quotes, whitespace added. */
+	public static final HtmlSerializer DEFAULT_SQ_READABLE = new HtmlSerializer.SqReadable().lock();
+
+	/** Default serializer, single quotes. */
+	public static class Sq extends HtmlSerializer {
+		/** Constructor */
+		public Sq() {
+			setProperty(SERIALIZER_quoteChar, '\'');
+		}
+	}
+
+	/** Default serializer, single quotes, whitespace added. */
+	public static class SqReadable extends Sq {
+		/** Constructor */
+		public SqReadable() {
+			setProperty(SERIALIZER_useIndentation, true);
+		}
+	}
+
+
+	/** HTML serializer properties currently set on this serializer. */
+	protected transient HtmlSerializerProperties hsp = new HtmlSerializerProperties();
+
+	/**
+	 * Main serialization routine.
+	 *
+	 * @param o The object being serialized.
+	 * @param w The writer to serialize to.
+	 * @param ctx The serialization context object.
+	 *
+	 * @return The same writer passed in.
+	 * @throws IOException If a problem occurred trying to send output to the writer.
+	 */
+	private HtmlSerializerWriter doSerialize(Object o, HtmlSerializerWriter w, HtmlSerializerContext ctx) throws SerializeException, IOException {
+		serializeAnything(w, o, null, ctx, null, ctx.getInitialDepth()-1, null);
+		return w;
+	}
+
+	/**
+	 * Serialize the specified object to the specified writer.
+	 *
+	 * @param out The writer.
+	 * @param o The object to serialize.
+	 * @param eType The expected type of the object if this is a bean property.
+	 * @param ctx The context object that lives for the duration of this serialization.
+	 * @param name The attribute name of this object if this object was a field in a JSON object (i.e. key of a {@link java.util.Map.Entry} or property name of a bean).
+	 * @param indent The current indentation value.
+	 * @param pMeta The bean property being serialized, or <jk>null</jk> if we're not serializing a bean property.
+	 * @throws IOException
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	protected void serializeAnything(HtmlSerializerWriter out, Object o, ClassMeta<?> eType, HtmlSerializerContext ctx, String name, int indent, BeanPropertyMeta pMeta) throws IOException, SerializeException {
+
+		BeanContext bc = ctx.getBeanContext();
+		ClassMeta<?> aType = null;       // The actual type
+		ClassMeta<?> gType = object();   // The generic type
+
+		if (eType == null)
+			eType = object();
+
+		aType = ctx.push(name, o, eType);
+
+		// Handle recursion
+		if (aType == null) {
+			o = null;
+			aType = object();
+		}
+
+		ctx.indent += indent;
+		int i = ctx.indent;
+
+		// Determine the type.
+		if (o == null || (aType.isChar() && ((Character)o).charValue() == 0))
+			out.tag(i, "null").nl();
+		else {
+
+			gType = aType.getFilteredClassMeta();
+			String classAttr = null;
+			if (ctx.isAddClassAttrs() && ! eType.equals(aType))
+				classAttr = aType.toString();
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+
+			HtmlClassMeta html = gType.getHtmlMeta();
+
+			if (html.isAsXml() || (pMeta != null && pMeta.getHtmlMeta().isAsXml()))
+				super.serializeAnything(out, o, null, ctx, null, null, false, XmlFormat.NORMAL, null);
+			else if (html.isAsPlainText() || (pMeta != null && pMeta.getHtmlMeta().isAsPlainText()))
+				out.write(o == null ? "null" : o.toString());
+			else if (o == null || (gType.isChar() && ((Character)o).charValue() == 0))
+				out.tag(i, "null").nl();
+			else if (gType.hasToObjectMapMethod())
+				serializeMap(out, gType.toObjectMap(o), eType, ctx, classAttr, pMeta);
+			else if (gType.isBean())
+				serializeBeanMap(out, bc.forBean(o), ctx, classAttr, pMeta);
+			else if (gType.isNumber())
+				out.sTag(i, "number").append(o).eTag("number").nl();
+			else if (gType.isBoolean())
+				out.sTag(i, "boolean").append(o).eTag("boolean").nl();
+			else if (gType.isMap()) {
+				if (o instanceof BeanMap)
+					serializeBeanMap(out, (BeanMap)o, ctx, classAttr, pMeta);
+				else
+					serializeMap(out, (Map)o, eType, ctx, classAttr, pMeta);
+			}
+			else if (gType.isCollection()) {
+				if (classAttr != null)
+					serializeCollection(out, (Collection)o, gType, ctx, name, classAttr, pMeta);
+				else
+					serializeCollection(out, (Collection)o, eType, ctx, name, null, pMeta);
+			}
+			else if (gType.isArray()) {
+				if (classAttr != null)
+					serializeCollection(out, toList(gType.getInnerClass(), o), gType, ctx, name, classAttr, pMeta);
+				else
+					serializeCollection(out, toList(gType.getInnerClass(), o), eType, ctx, name, null, pMeta);
+			}
+			else if (gType.isUri() || (pMeta != null && (pMeta.isUri() || pMeta.isBeanUri()))) {
+				String label = null;
+				String at = ctx.getUriAnchorText();
+				if (at != null) {
+					if (at.equals(LAST_TOKEN)) {
+						label = o.toString();
+						if (label.indexOf('/') != -1)
+							label = label.substring(label.lastIndexOf('/')+1);
+					} else if (at.equals(PROPERTY_NAME)) {
+						label = (pMeta != null ? pMeta.getName() : null);
+					} else {
+						label = o.toString();
+					}
+				}
+				if (label == null)
+					label = o.toString();
+				out.oTag(i, "a").attrUri("href", o).append('>');
+				if (at != null && at.equals(URI))
+					out.appendUri(label);
+				else
+					out.append(label);
+				out.eTag("a").nl();
+			}
+			else
+				out.sTag(i, "string").encodeText(o).eTag("string").nl();
+		}
+		ctx.pop();
+		ctx.indent -= indent;
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private void serializeMap(HtmlSerializerWriter out, Map m, ClassMeta<?> type, HtmlSerializerContext ctx, String classAttr, BeanPropertyMeta<?> ppMeta) throws IOException, SerializeException {
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		int i = ctx.getIndent();
+		out.oTag(i, "table").attr("type", "object");
+		if (classAttr != null)
+			out.attr("class", classAttr);
+		out.appendln(">");
+		if (! (ppMeta != null && ppMeta.getHtmlMeta().isNoTableHeaders())) {
+		out.sTag(i+1, "tr").nl();
+		out.sTag(i+2, "th").nl().appendln(i+3, "<string>key</string>").eTag(i+2, "th").nl();
+		out.sTag(i+2, "th").nl().appendln(i+3, "<string>value</string>").eTag(i+2, "th").nl();
+		out.eTag(i+1, "tr").nl();
+		}
+		for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) {
+
+			Object key = generalize(ctx, e.getKey(), keyType);
+			Object value = null;
+			try {
+				value = e.getValue();
+			} catch (StackOverflowError t) {
+				throw t;
+			} catch (Throwable t) {
+				ctx.addWarning("Could not call getValue() on property ''{0}'', {1}", e.getKey(), t.getLocalizedMessage());
+			}
+
+			out.sTag(i+1, "tr").nl();
+			out.sTag(i+2, "td").nl();
+			serializeAnything(out, key, keyType, ctx, null, 2, null);
+			out.eTag(i+2, "td").nl();
+			out.sTag(i+2, "td").nl();
+			serializeAnything(out, value, valueType, ctx, (key == null ? "_x0000_" : key.toString()), 2, null);
+			out.eTag(i+2, "td").nl();
+			out.eTag(i+1, "tr").nl();
+		}
+		out.eTag(i, "table").nl();
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private void serializeBeanMap(HtmlSerializerWriter out, BeanMap m, HtmlSerializerContext ctx, String classAttr, BeanPropertyMeta<?> ppMeta) throws IOException, SerializeException {
+		int i = ctx.getIndent();
+
+		Object o = m.getBean();
+
+		Class<?> c = o.getClass();
+		if (c.isAnnotationPresent(HtmlLink.class)) {
+			HtmlLink h = o.getClass().getAnnotation(HtmlLink.class);
+			Object urlProp = m.get(h.hrefProperty());
+			Object nameProp = m.get(h.nameProperty());
+			out.oTag(i, "a").attrUri("href", urlProp).append('>').encodeText(nameProp).eTag("a").nl();
+			return;
+		}
+
+		out.oTag(i, "table").attr("type", "object");
+		if (classAttr != null)
+			out.attr("_class", classAttr);
+		out.append('>').nl();
+		if (! (m.getClassMeta().getHtmlMeta().isNoTableHeaders() || (ppMeta != null && ppMeta.getHtmlMeta().isNoTableHeaders()))) {
+		out.sTag(i+1, "tr").nl();
+		out.sTag(i+2, "th").nl().appendln(i+3, "<string>key</string>").eTag(i+2, "th").nl();
+		out.sTag(i+2, "th").nl().appendln(i+3, "<string>value</string>").eTag(i+2, "th").nl();
+		out.eTag(i+1, "tr").nl();
+		}
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		while (mapEntries.hasNext()) {
+			BeanMapEntry p = (BeanMapEntry)mapEntries.next();
+			BeanPropertyMeta pMeta = p.getMeta();
+
+			String key = p.getKey();
+			Object value = null;
+			try {
+				value = p.getValue();
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+
+			if (canIgnoreValue(ctx, pMeta.getClassMeta(), key, value))
+				continue;
+
+			out.sTag(i+1, "tr").nl();
+			out.sTag(i+2, "td").nl();
+			out.sTag(i+3, "string").encodeText(key).eTag("string").nl();
+			out.eTag(i+2, "td").nl();
+			out.sTag(i+2, "td").nl();
+			try {
+				serializeAnything(out, value, p.getMeta().getClassMeta(), ctx, key, 2, pMeta);
+			} catch (SerializeException t) {
+				throw t;
+			} catch (StackOverflowError t) {
+				throw t;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+			out.eTag(i+2, "td").nl();
+			out.eTag(i+1, "tr").nl();
+		}
+		out.eTag(i, "table").nl();
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private void serializeCollection(HtmlSerializerWriter out, Collection c, ClassMeta<?> type, HtmlSerializerContext ctx, String name, String classAttr, BeanPropertyMeta<?> ppMeta) throws IOException, SerializeException {
+
+		BeanContext bc = ctx.getBeanContext();
+		ClassMeta<?> elementType = type.getElementType();
+
+		int i = ctx.getIndent();
+		if (c.isEmpty()) {
+			out.appendln(i, "<ul></ul>");
+			return;
+		}
+
+		c = sort(ctx, c);
+
+		// Look at the objects to see how we're going to handle them.  Check the first object to see how we're going to handle this.
+		// If it's a map or bean, then we'll create a table.
+		// Otherwise, we'll create a list.
+		String[] th = getTableHeaders(ctx, c, ppMeta);
+
+		if (th != null) {
+
+			out.oTag(i, "table").attr("type", "array");
+			if (classAttr != null)
+				out.attr("_class", classAttr);
+			out.append('>').nl();
+			out.sTag(i+1, "tr").nl();
+			for (String key : th)
+				out.sTag(i+2, "th").append(key).eTag("th").nl();
+			out.eTag(i+1, "tr").nl();
+
+			for (Object o : c) {
+				ClassMeta<?> cm = bc.getClassMetaForObject(o);
+
+				if (cm != null && cm.getPojoFilter() != null) {
+					PojoFilter f = cm.getPojoFilter();
+					o = f.filter(o);
+					cm = cm.getFilteredClassMeta();
+				}
+
+				if (cm != null && ctx.isAddClassAttrs() && elementType.getInnerClass() != o.getClass())
+					out.oTag(i+1, "tr").attr("_class", o.getClass().getName()).append('>').nl();
+				else
+					out.sTag(i+1, "tr").nl();
+
+				if (cm == null) {
+					serializeAnything(out, o, null, ctx, null, 1, null);
+
+				} else if (cm.isMap() && ! (cm.isBeanMap())) {
+					Map m2 = sort(ctx, (Map)o);
+
+					Iterator mapEntries = m2.entrySet().iterator();
+					while (mapEntries.hasNext()) {
+						Map.Entry e = (Map.Entry)mapEntries.next();
+						out.sTag(i+2, "td").nl();
+						serializeAnything(out, e.getValue(), elementType, ctx, e.getKey().toString(), 2, null);
+						out.eTag(i+2, "td").nl();
+					}
+				} else {
+					BeanMap m2 = null;
+					if (o instanceof BeanMap)
+						m2 = (BeanMap)o;
+					else
+						m2 = bc.forBean(o);
+
+					Iterator mapEntries = m2.entrySet().iterator();
+					while (mapEntries.hasNext()) {
+						BeanMapEntry p = (BeanMapEntry)mapEntries.next();
+						BeanPropertyMeta pMeta = p.getMeta();
+						out.sTag(i+2, "td").nl();
+						serializeAnything(out, p.getValue(), pMeta.getClassMeta(), ctx, p.getKey().toString(), 2, pMeta);
+						out.eTag(i+2, "td").nl();
+					}
+				}
+				out.eTag(i+1, "tr").nl();
+			}
+			out.eTag(i, "table").nl();
+
+		} else {
+			out.sTag(i, "ul").nl();
+			for (Object o : c) {
+				out.sTag(i+1, "li").nl();
+				serializeAnything(out, o, elementType, ctx, name, 1, null);
+				out.eTag(i+1, "li").nl();
+			}
+			out.eTag(i, "ul").nl();
+		}
+	}
+
+	/*
+	 * Returns the table column headers for the specified collection of objects.
+	 * Returns null if collection should not be serialized as a 2-dimensional table.
+	 * 2-dimensional tables are used for collections of objects that all have the same set of property names.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private String[] getTableHeaders(SerializerContext ctx, Collection c, BeanPropertyMeta<?> pMeta) throws SerializeException {
+		BeanContext bc = ctx.getBeanContext();
+		if (c.size() == 0)
+			return null;
+		c = sort(ctx, c);
+		String[] th;
+		Set<String> s = new TreeSet<String>();
+		Set<ClassMeta> prevC = new HashSet<ClassMeta>();
+		Object o1 = null;
+		for (Object o : c)
+			if (o != null) {
+				o1 = o;
+				break;
+			}
+		if (o1 == null)
+			return null;
+		ClassMeta cm = bc.getClassMetaForObject(o1);
+		if (cm.getPojoFilter() != null) {
+			PojoFilter f = cm.getPojoFilter();
+			o1 = f.filter(o1);
+			cm = cm.getFilteredClassMeta();
+		}
+		if (cm == null || ! (cm.isMap() || cm.isBean()))
+			return null;
+		if (cm.getInnerClass().isAnnotationPresent(HtmlLink.class))
+			return null;
+		HtmlClassMeta h = cm.getHtmlMeta();
+		if (h.isNoTables() || (pMeta != null && pMeta.getHtmlMeta().isNoTables()))
+				return null;
+		if (h.isNoTableHeaders() || (pMeta != null && pMeta.getHtmlMeta().isNoTableHeaders()))
+				return new String[0];
+		if (canIgnoreValue(ctx, cm, null, o1))
+			return null;
+		if (cm.isMap() && ! cm.isBeanMap()) {
+			Map m = (Map)o1;
+			th = new String[m.size()];
+			int i = 0;
+			for (Object k : m.keySet())
+				th[i++] = (k == null ? null : k.toString());
+		} else {
+			BeanMap<?> bm = (o1 instanceof BeanMap ? (BeanMap)o1 : bc.forBean(o1));
+			List<String> l = new LinkedList<String>();
+			for (String k : bm.keySet())
+				l.add(k);
+			th = l.toArray(new String[l.size()]);
+		}
+		prevC.add(cm);
+		s.addAll(Arrays.asList(th));
+
+		for (Object o : c) {
+			if (o == null)
+				continue;
+			cm = bc.getClassMetaForObject(o);
+			if (cm != null && cm.getPojoFilter() != null) {
+				PojoFilter f = cm.getPojoFilter();
+				o = f.filter(o);
+				cm = cm.getFilteredClassMeta();
+			}
+			if (prevC.contains(cm))
+				continue;
+			if (cm == null || ! (cm.isMap() || cm.isBean()))
+				return null;
+			if (cm.getInnerClass().isAnnotationPresent(HtmlLink.class))
+				return null;
+			if (canIgnoreValue(ctx, cm, null, o))
+				return null;
+			if (cm.isMap() && ! cm.isBeanMap()) {
+				Map m = (Map)o;
+				if (th.length != m.keySet().size())
+					return null;
+				for (Object k : m.keySet())
+					if (! s.contains(k.toString()))
+						return null;
+			} else {
+				BeanMap<?> bm = (o instanceof BeanMap ? (BeanMap)o : bc.forBean(o));
+				int l = 0;
+				for (String k : bm.keySet()) {
+					if (! s.contains(k))
+						return null;
+					l++;
+				}
+				if (s.size() != l)
+					return null;
+			}
+		}
+		return th;
+	}
+
+	/**
+	 * Returns the schema serializer based on the settings of this serializer.
+	 * @return The schema serializer.
+	 */
+	@Override /* XmlSerializer */
+	public HtmlSerializer getSchemaSerializer() {
+		HtmlSchemaDocSerializer s = new HtmlSchemaDocSerializer();
+		s.beanContextFactory = this.beanContextFactory;
+		s.sp = this.sp;
+		s.xsp = this.xsp;
+		s.hsp = this.hsp;
+		return s;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	public HtmlSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new HtmlSerializerContext(getBeanContext(), sp, xsp, hsp, properties, javaMethod);
+	}
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		HtmlSerializerContext hctx = (HtmlSerializerContext)ctx;
+		doSerialize(o, hctx.getWriter(out), hctx);
+	}
+
+	@Override /* CoreApi */
+	public HtmlSerializer setProperty(String property, Object value) throws LockedException {
+		if (! hsp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> HtmlSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public HtmlSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public HtmlSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public HtmlSerializer clone() {
+		HtmlSerializer c = (HtmlSerializer)super.clone();
+		c.hsp = hsp.clone();
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.class
new file mode 100755
index 0000000..d765a69
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.java
new file mode 100755
index 0000000..16c8774
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerContext.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+import static com.ibm.juno.core.html.HtmlSerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of {@link HtmlSerializer} and its subclasses.
+ * <p>
+ * 	See {@link SerializerContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class HtmlSerializerContext extends XmlSerializerContext {
+
+	private final String uriAnchorText, title, description, cssUrl;
+	private final String[] cssImports;
+	private final ObjectMap links;
+	private final boolean nowrap;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp Default general serializer properties.
+	 * @param xsp Default XML serializer properties.
+	 * @param hsp Default HTML serializer properties.
+	 * @param op Override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	protected HtmlSerializerContext(BeanContext beanContext, SerializerProperties sp, XmlSerializerProperties xsp, HtmlSerializerProperties hsp, ObjectMap op, Method javaMethod) {
+		super(beanContext, sp, xsp, op, javaMethod);
+		if (op == null || op.isEmpty()) {
+			uriAnchorText = hsp.uriAnchorText;
+			title = hsp.title;
+			description = hsp.description;
+			links = hsp.links;
+			cssUrl = hsp.cssUrl;
+			cssImports = hsp.cssImports;
+			nowrap = hsp.nowrap;
+		} else {
+			uriAnchorText = op.getString(HTML_uriAnchorText, hsp.uriAnchorText);
+			title = op.getString(HTMLDOC_title, hsp.title);
+			description = op.getString(HTMLDOC_description, hsp.description);
+			ObjectMap m = op.getObjectMap(HTMLDOC_links, hsp.links);
+			if (op.containsKey(HTMLDOC_addLinks))
+				if (m == null)
+					m = op.getObjectMap(HTMLDOC_addLinks, null);
+				else
+					m.putAll(op.getObjectMap(HTMLDOC_addLinks, null));
+			links = m;
+			cssUrl = op.getString(HTMLDOC_cssUrl, hsp.cssUrl);
+			cssImports = StringUtils.split(op.getString(HTMLDOC_cssImports, null), ',');
+			nowrap = op.getBoolean(HTMLDOC_cssUrl, hsp.nowrap);
+		}
+	}
+
+	/**
+	 * Returns the {@link HtmlSerializerProperties#HTML_uriAnchorText} setting value in this context.
+	 *
+	 * @return The {@link HtmlSerializerProperties#HTML_uriAnchorText} setting value in this context.
+	 */
+	public final String getUriAnchorText() {
+		return uriAnchorText;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_title} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_title} setting value in this context.
+	 */
+	public final String getTitle() {
+		return title;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_description} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_description} setting value in this context.
+	 */
+	public final String getDescription() {
+		return description;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_links} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_links} setting value in this context.
+	 */
+	public final ObjectMap getLinks() {
+		return links;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_cssUrl} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_cssUrl} setting value in this context.
+	 */
+	public final String getCssUrl() {
+		return cssUrl;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_cssImports} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_cssImports} setting value in this context.
+	 */
+	public final String[] getCssImports() {
+		return cssImports;
+	}
+
+	/**
+	 * Returns the {@link HtmlDocSerializerProperties#HTMLDOC_nowrap} setting value in this context.
+	 *
+	 * @return The {@link HtmlDocSerializerProperties#HTMLDOC_nowrap} setting value in this context.
+	 */
+	public final boolean isNoWrap() {
+		return nowrap;
+	}
+
+	/**
+	 * Wraps the specified writer in a {@link HtmlSerializerWriter}.
+	 */
+	@Override /* XmlSerializerContext */
+	public HtmlSerializerWriter getWriter(Writer w) {
+		if (w instanceof HtmlSerializerWriter)
+			return (HtmlSerializerWriter)w;
+		return new HtmlSerializerWriter(w, isUseIndentation(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.class
new file mode 100755
index 0000000..6857e05
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.java
new file mode 100755
index 0000000..8b6068d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerProperties.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Configurable properties on the {@link HtmlSerializer} class.
+ * <p>
+ * 	Use the {@link HtmlSerializer#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link HtmlSerializer}.
+ * <ul>
+ * 	<li>{@link XmlSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class HtmlSerializerProperties implements Cloneable {
+
+	/**
+	 * Anchor text source ({@link String}, default={@link #TO_STRING}).
+	 * <p>
+	 * When creating anchor tags (e.g. <code><xt>&lt;a</xt> <xa>href</xa>=<xs>'...'</xs><xt>&gt;</xt>text<xt>&lt;/a&gt;</xt></code>)
+	 * 	in HTML, this setting defines what to set the inner text to.
+	 * <p>
+	 * Possible values:
+	 * <ul>
+	 * 	<li>{@link #TO_STRING} / <js>"toString"</js> - Set to whatever is returned by {@link #toString()} on the object.
+	 * 	<li>{@link #URI} / <js>"uri"</js> - Set to the URI value.
+	 * 	<li>{@link #LAST_TOKEN} / <js>"lastToken"</js> - Set to the last token of the URI value.
+	 * 	<li>{@link #PROPERTY_NAME} / <js>"propertyName"</js> - Set to the bean property name.
+	 * </ul>
+	 */
+	public static final String HTML_uriAnchorText = "HtmlSerializer.uriAnchorText";
+
+	/** Constant for {@link HtmlSerializerProperties#HTML_uriAnchorText} property. */
+	public static final String PROPERTY_NAME = "propertyName";
+	/** Constant for {@link HtmlSerializerProperties#HTML_uriAnchorText} property. */
+	public static final String TO_STRING = "toString";
+	/** Constant for {@link HtmlSerializerProperties#HTML_uriAnchorText} property. */
+	public static final String URI = "uri";
+	/** Constant for {@link HtmlSerializerProperties#HTML_uriAnchorText} property. */
+	public static final String LAST_TOKEN = "lastToken";
+
+	String uriAnchorText = TO_STRING, title, description, cssUrl;
+	String[] cssImports;
+	ObjectMap links;
+	boolean nowrap;
+
+	/**
+	 * Sets the specified property value.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		if (property.equals(HTML_uriAnchorText))
+			uriAnchorText = (value == null ? null : value.toString());
+		else if (property.equals(HTMLDOC_title))
+			title = (value == null ? null : value.toString());
+		else if (property.equals(HTMLDOC_description))
+			description = (value == null ? null : value.toString());
+		else if (property.equals(HTMLDOC_nowrap))
+			nowrap = Boolean.valueOf(value.toString());
+		else if (property.equals(HTMLDOC_links))
+			try {
+				links = new ObjectMap(value.toString());
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		else if (property.equals(HTMLDOC_addLinks))
+			try {
+				if (links == null)
+					links = new ObjectMap(value.toString());
+				else
+					links.putAll(new ObjectMap(value.toString()));
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+		else if (property.equals(HTMLDOC_cssUrl))
+			cssUrl = (value == null ? null : value.toString());
+		else if (property.equals(HTMLDOC_cssImports))
+			cssImports = StringUtils.split(value == null ? null : value.toString(), ',');
+		else
+			return false;
+		return true;
+	}
+
+	@Override /* Cloneable */
+	public HtmlSerializerProperties clone() {
+		try {
+			return (HtmlSerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.class
new file mode 100755
index 0000000..52d07fe
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.java
new file mode 100755
index 0000000..28e2eb4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlSerializerWriter.java
@@ -0,0 +1,328 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.html;
+
+import java.io.*;
+
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Specialized writer for serializing HTML.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class HtmlSerializerWriter extends XmlSerializerWriter {
+
+	/**
+	 * Constructor.
+	 *
+	 * @param out The writer being wrapped.
+	 * @param useIndentation If <jk>true</jk>, tabs will be used in output.
+	 * @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 HtmlSerializerWriter(Writer out, boolean useIndentation, char quoteChar, String uriContext, String uriAuthority) {
+		super(out, useIndentation, quoteChar, uriContext, uriAuthority, false, null);
+	}
+
+	/**
+	 * Append an attribute with a URI value.
+	 *
+	 * @param name The attribute name.
+	 * @param value The attribute value.  Can be any object whose <code>toString()</code> method returns a URI.
+	 * @return This object (for method chaining);
+	 * @throws IOException If a problem occurred.
+	 */
+	public HtmlSerializerWriter attrUri(String name, Object value) throws IOException {
+		super.attrUri((String)null, name, value);
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter encodeText(Object o) throws IOException {
+
+		String s = o.toString();
+		for (int i = 0; i < s.length(); i++) {
+			char test = s.charAt(i);
+			if (test == '&')
+				append("&amp;");
+			else if (test == '<')
+				append("&lt;");
+			else if (test == '>')
+				append("&gt;");
+			else if (test == '\n')
+				append("<br/>");
+			else if (test == '\f')
+				append("<ff/>");
+			else if (test == '\b')
+				append("<bs/>");
+			else if (test == '\t')
+				append("<tb/>");
+			else if (Character.isISOControl(test))
+				append("&#" + (int) test + ";");
+			else
+				append(test);
+		}
+
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(String ns, String name, boolean needsEncoding) throws IOException {
+		super.oTag(ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(String ns, String name) throws IOException {
+		super.oTag(ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(String name) throws IOException {
+		super.oTag(name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		super.oTag(indent, ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(int indent, String ns, String name) throws IOException {
+		super.oTag(indent, ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oTag(int indent, String name) throws IOException {
+		super.oTag(indent, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(String ns, String name, boolean needsEncoding) throws IOException {
+		super.tag(ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(String ns, String name) throws IOException {
+		super.tag(ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(String name) throws IOException {
+		super.tag(name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(int indent, String name) throws IOException {
+		super.tag(indent, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		super.tag(indent, ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter tag(int indent, String ns, String name) throws IOException {
+		super.tag(indent, ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(String ns, String name) throws IOException {
+		super.sTag(ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(String ns, String name, boolean needsEncoding) throws IOException {
+		super.sTag(ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(int indent, String ns, String name) throws IOException {
+		super.sTag(indent, ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(int indent, String name) throws IOException {
+		super.sTag(indent, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(String name) throws IOException {
+		super.sTag(name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter sTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		super.sTag(indent, ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(String ns, String name) throws IOException {
+		super.eTag(ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(String ns, String name, boolean needsEncoding) throws IOException {
+		super.eTag(ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(int indent, String ns, String name) throws IOException {
+		super.eTag(indent, ns, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(int indent, String name) throws IOException {
+		super.eTag(indent, name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(String name) throws IOException {
+		super.eTag(name);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter eTag(int indent, String ns, String name, boolean needsEncoding) throws IOException {
+		super.eTag(indent, ns, name, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter attr(String name, Object value) throws IOException {
+		super.attr(name, value);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter attr(String ns, String name, Object value) throws IOException {
+		super.attr(ns, name, value);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter attr(String ns, String name, Object value, boolean needsEncoding) throws IOException {
+		super.attr(ns, name, value, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter attr(String name, Object value, boolean needsEncoding) throws IOException {
+		super.attr(null, name, value, needsEncoding);
+		return this;
+	}
+
+	@Override /* XmlSerializerWriter */
+	public HtmlSerializerWriter oAttr(String ns, String name) throws IOException {
+		super.oAttr(ns, name);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter cr(int depth) throws IOException {
+		super.cr(depth);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter appendln(int indent, String text) throws IOException {
+		super.appendln(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter appendln(String text) throws IOException {
+		super.appendln(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter append(int indent, String text) throws IOException {
+		super.append(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter append(int indent, char c) throws IOException {
+		super.append(indent, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter s() throws IOException {
+		super.s();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter q() throws IOException {
+		super.q();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter i(int indent) throws IOException {
+		super.i(indent);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter nl() throws IOException {
+		super.nl();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter append(Object text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter append(String text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public HtmlSerializerWriter append(char c) throws IOException {
+		super.append(c);
+		return this;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.class
new file mode 100755
index 0000000..5e453b7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/html/HtmlStrippedDocSerializer.class differ


[07/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.java
new file mode 100755
index 0000000..0a35276
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+/**
+ * Stores a set of ASCII characters for quick lookup.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class AsciiSet {
+	final boolean[] store = new boolean[128];
+
+	/**
+	 * Constructor.
+	 *
+	 * @param chars The characters to keep in this store.
+	 */
+	public AsciiSet(String chars) {
+		for (int i = 0; i < chars.length(); i++) {
+			char c = chars.charAt(i);
+			if (c < 128)
+				store[c] = true;
+		}
+	}
+
+	/**
+	 * Returns <jk>true<jk> if the specified character is in this store.
+	 *
+	 * @param c The character to check.
+	 * @return <jk>true<jk> if the specified character is in this store.
+	 */
+	public boolean contains(char c) {
+		if (c > 127)
+			return false;
+		return store[c];
+	}
+
+	/**
+	 * Returns <jk>true<jk> if the specified character is in this store.
+	 *
+	 * @param c The character to check.
+	 * @return <jk>true<jk> if the specified character is in this store.
+	 */
+	public boolean contains(int c) {
+		if (c < 0 || c > 127)
+			return false;
+		return store[c];
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$1.class
new file mode 100755
index 0000000..898da0a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$ByteArray.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$ByteArray.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$ByteArray.class
new file mode 100755
index 0000000..9040d6c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache$ByteArray.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.class
new file mode 100755
index 0000000..da300c1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.java
new file mode 100755
index 0000000..1baee13
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayCache.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * A utility class for caching byte arrays in memory so that duplicate arrays can be reused.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ByteArrayCache {
+
+	/**
+	 * Default global byte array cache.
+	 * Note that this can't ever get garbage collected so don't add really large arrays!
+	 */
+	public static final ByteArrayCache DEFAULT = new ByteArrayCache();
+
+	private final ConcurrentHashMap<ByteArray,byte[]> cache = new ConcurrentHashMap<ByteArray,byte[]>();
+
+	/**
+	 * Add the specified byte array to this cache.
+	 *
+	 * @param contents The byte array to add to this cache.
+	 * @return Either the same byte array or a previously cached byte array depending on whether the byte array
+	 * 	already exists in the cache.
+	 */
+	public byte[] cache(byte[] contents) {
+		if (contents == null)
+			return null;
+		ByteArray ba = new ByteArray(contents);
+		cache.putIfAbsent(ba, ba.contents);
+		return cache.get(ba);
+	}
+
+	/**
+	 * Add the specified input stream to this cache.
+	 *
+	 * @param contents The input stream whose contents are to be added to this cache.
+	 * @return Either the same byte array or a previously cached byte array depending on whether the byte array
+	 * 	already exists in the cache.
+	 * @throws IOException
+	 */
+	public byte[] cache(InputStream contents) throws IOException {
+		if (contents == null)
+			return null;
+		ByteArray ba = new ByteArray(IOUtils.readBytes(contents, 1024));
+		cache.putIfAbsent(ba, ba.contents);
+		return cache.get(ba);
+	}
+
+	/**
+	 * Returns the number of byte arrays in this cache.
+	 *
+	 * @return The number of byte arrays in this cache.
+	 */
+	public int size() {
+		return cache.size();
+	}
+
+	private static class ByteArray {
+		private int hashCode;
+		private byte[] contents;
+
+		private ByteArray(byte[] contents) {
+			this.contents = contents;
+			int multiplier = 1;
+			for (int i = 0; i < contents.length; i++) {
+				hashCode += contents[i] * multiplier;
+				int shifted = multiplier << 5;
+				multiplier = shifted - multiplier;
+			}
+		}
+
+		@Override /* Object */
+		public int hashCode() {
+			if (hashCode == 0) {
+			}
+			return hashCode;
+		}
+
+		@Override /* Object */
+		public boolean equals(Object o) {
+			if (o instanceof ByteArray) {
+				ByteArray ba = (ByteArray)o;
+				if (ba.hashCode == hashCode)
+					return Arrays.equals(ba.contents, contents);
+			}
+			return false;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.class
new file mode 100755
index 0000000..588bee0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.java
new file mode 100755
index 0000000..0e94821
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ByteArrayInOutStream.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+
+/**
+ * Subclass of a ByteArrayOutputStream that avoids a byte array copy when reading from an input stream.
+ * <p>
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ByteArrayInOutStream extends ByteArrayOutputStream {
+
+	/**
+	 * Creates a new input stream from this object.
+	 *
+	 * @return A new input stream from this object.
+	 */
+	public ByteArrayInputStream getInputStream() {
+		return new ByteArrayInputStream(this.buf, 0, this.count);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.class
new file mode 100755
index 0000000..4b56124
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.java
new file mode 100755
index 0000000..9cdd838
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CharSequenceReader.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+
+/**
+ * Similar to {@link StringReader} except reads from a generic {@link CharSequenceReader}.
+ *
+ * @author jbognar
+ */
+public final class CharSequenceReader extends BufferedReader {
+
+	private final CharSequence cs;
+	private String s;
+	private StringBuffer sb;
+	private StringBuilder sb2;
+	private int length;
+	private int next = 0;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cs The char sequence to read from.  Can be <jk>null</jk>.
+	 */
+	public CharSequenceReader(CharSequence cs) {
+		super(new StringReader(""), 1);   // Does not actually use a reader.
+		if (cs == null)
+			cs = "";
+		this.cs = cs;
+		if (cs instanceof String)
+			s = (String)cs;
+		else if (cs instanceof StringBuffer)
+			sb = (StringBuffer)cs;
+		else if (cs instanceof StringBuilder)
+			sb2 = (StringBuilder)cs;
+		this.length = cs.length();
+	}
+
+	@Override /* Reader */
+	public int read() {
+		if (next >= length)
+			return -1;
+		return cs.charAt(next++);
+	}
+
+	@Override /* Reader */
+	public boolean markSupported() {
+		return false;
+	}
+
+	@Override /* Reader */
+	public int read(final char[] cbuf, final int off, final int len) {
+		if (next >= length)
+			return -1;
+		int n = Math.min(length - next, len);
+		if (s != null)
+			s.getChars(next, next + n, cbuf, off);
+		else if (sb != null)
+			sb.getChars(next, next + n, cbuf, off);
+		else if (sb2 != null)
+			sb2.getChars(next, next + n, cbuf, off);
+		else {
+			for (int i = 0; i < n; i++)
+				cbuf[off+i] = cs.charAt(next+i);
+		}
+		next += n;
+		return n;
+	}
+
+	@Override /* Reader */
+	public long skip(long ns) {
+		if (next >= length)
+			return 0;
+		long n = Math.min(length - next, ns);
+		n = Math.max(-next, n);
+		next += n;
+		return n;
+	}
+
+	@Override /* Reader */
+	public void close() {
+		// no-op
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return cs.toString();
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils$ClassComparator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils$ClassComparator.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils$ClassComparator.class
new file mode 100755
index 0000000..f894333
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils$ClassComparator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.class
new file mode 100755
index 0000000..95747e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.java
new file mode 100755
index 0000000..cf79b9d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ClassUtils.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Class-related utility methods.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ClassUtils {
+
+	/**
+	 * Given the specified list of objects, return readable names for the class types of the objects.
+	 *
+	 * @param o The objects.
+	 * @return An array of readable class type strings.
+	 */
+	public static ObjectList getReadableClassNames(Object[] o) {
+		ObjectList l = new ObjectList();
+		for (int i = 0; i < o.length; i++)
+			l.add(o[i] == null ? "null" : getReadableClassName(o[i].getClass()));
+		return l;
+	}
+
+	/**
+	 * Shortcut for calling <code><jsm>getReadableClassName</jsm>(c.getName())</code>
+	 *
+	 * @param c The class.
+	 * @return A readable class type name, or <jk>null</jk> if parameter is <jk>null</jk>.
+	 */
+	public static String getReadableClassName(Class<?> c) {
+		if (c == null)
+			return null;
+		return getReadableClassName(c.getName());
+	}
+
+	/**
+	 * Converts the specified class name to a readable form when class name is a special construct like <js>"[[Z"</js>.
+	 * <p>
+	 * Examples:
+	 * <p class='bcode'>
+	 * 	<jsm>getReadableClassName</jsm>(<js>"java.lang.Object"</js>);  <jc>// Returns "java.lang.Object"</jc>
+	 * 	<jsm>getReadableClassName</jsm>(<js>"boolean"</js>);  <jc>// Returns "boolean"</jc>
+	 * 	<jsm>getReadableClassName</jsm>(<js>"[Z"</js>);  <jc>// Returns "boolean[]"</jc>
+	 * 	<jsm>getReadableClassName</jsm>(<js>"[[Z"</js>);  <jc>// Returns "boolean[][]"</jc>
+	 * 	<jsm>getReadableClassName</jsm>(<js>"[Ljava.lang.Object;"</js>);  <jc>// Returns "java.lang.Object[]"</jc>
+	 * 	<jsm>getReadableClassName</jsm>(<jk>null</jk>);  <jc>// Returns null</jc>
+	 * </p>
+	 *
+	 * @param className The class name.
+	 * @return A readable class type name, or <jk>null</jk> if parameter is <jk>null</jk>.
+	 */
+	public static String getReadableClassName(String className) {
+		if (className == null)
+			return null;
+		if (! StringUtils.startsWith(className, '['))
+			return className;
+		int depth = 0;
+		for (int i = 0; i < className.length(); i++) {
+			if (className.charAt(i) == '[')
+				depth++;
+			else
+				break;
+		}
+		char type = className.charAt(depth);
+		String c;
+		switch (type) {
+			case 'Z': c = "boolean"; break;
+			case 'B': c = "byte"; break;
+			case 'C': c = "char"; break;
+			case 'D': c = "double"; break;
+			case 'F': c = "float"; break;
+			case 'I': c = "int"; break;
+			case 'J': c = "long"; break;
+			case 'S': c = "short"; break;
+			default: c = className.substring(depth+1, className.length()-1);
+		}
+		StringBuilder sb = new StringBuilder(c.length() + 2*depth).append(c);
+		for (int i = 0; i < depth; i++)
+			sb.append("[]");
+		return sb.toString();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if <code>parent</code> is a parent class of <code>child</code>.
+	 *
+	 * @param parent The parent class.
+	 * @param child The child class.
+	 * @param strict If <jk>true</jk> returns <jk>false</jk> if the classes are the same.
+	 * @return <jk>true</jk> if <code>parent</code> is a parent class of <code>child</code>.
+	 */
+	public static boolean isParentClass(Class<?> parent, Class<?> child, boolean strict) {
+		return parent.isAssignableFrom(child) && ((!strict) || ! parent.equals(child));
+	}
+
+	/**
+	 * Returns <jk>true</jk> if <code>parent</code> is a parent class or the same as <code>child</code>.
+	 *
+	 * @param parent The parent class.
+	 * @param child The child class.
+	 * @return <jk>true</jk> if <code>parent</code> is a parent class or the same as <code>child</code>.
+	 */
+	public static boolean isParentClass(Class<?> parent, Class<?> child) {
+		return isParentClass(parent, child, false);
+	}
+
+	/**
+	 * Comparator for use with {@link TreeMap TreeMaps} with {@link Class} keys.
+	 *
+	 * @author James Bognar (jbognar@us.ibm.com)
+	 */
+	public final static class ClassComparator implements Comparator<Class<?>>, Serializable {
+
+		private static final long serialVersionUID = 1L;
+
+		@Override /* Comparator */
+		public int compare(Class<?> object1, Class<?> object2) {
+			return object1.getName().compareTo(object2.getName());
+		}
+	}
+
+	/**
+	 * Returns the signature of the specified method.
+	 * For no-arg methods, the signature will be a simple string such as <js>"toString"</js>.
+	 * For methods with one or more args, the arguments will be fully-qualified class names (e.g. <js>"append(java.util.StringBuilder,boolean)"</js>)
+	 *
+	 * @param m The methods to get the signature on.
+	 * @return The methods signature.
+	 */
+	public static String getMethodSignature(Method m) {
+		StringBuilder sb = new StringBuilder(m.getName());
+		Class<?>[] pt = m.getParameterTypes();
+		if (pt.length > 0) {
+			sb.append("(");
+			for (int i = 0; i < pt.length; i++) {
+				if (i > 0)
+					sb.append(",");
+				sb.append(getReadableClassName(pt[i]));
+			}
+			sb.append(")");
+		}
+		return sb.toString();
+	}
+
+	private final static Map<Class<?>, Class<?>> pmap1 = new HashMap<Class<?>, Class<?>>(), pmap2 = new HashMap<Class<?>, Class<?>>();
+	static {
+		pmap1.put(boolean.class, Boolean.class);
+		pmap1.put(byte.class, Byte.class);
+		pmap1.put(short.class, Short.class);
+		pmap1.put(char.class, Character.class);
+		pmap1.put(int.class, Integer.class);
+		pmap1.put(long.class, Long.class);
+		pmap1.put(float.class, Float.class);
+		pmap1.put(double.class, Double.class);
+		pmap2.put(Boolean.class, boolean.class);
+		pmap2.put(Byte.class, byte.class);
+		pmap2.put(Short.class, short.class);
+		pmap2.put(Character.class, char.class);
+		pmap2.put(Integer.class, int.class);
+		pmap2.put(Long.class, long.class);
+		pmap2.put(Float.class, float.class);
+		pmap2.put(Double.class, double.class);
+	}
+
+	/**
+	 * If the specified class is a primitive (e.g. <code><jk>int</jk>.<jk>class</jk></code>)
+	 * 	returns it's wrapper class (e.g. <code>Integer.<jk>class</jk></code>).
+	 *
+	 * @param c The class.
+	 * @return The wrapper class, or <jk>null</jk> if class is not a primitive.
+	 */
+	public static Class<?> getPrimitiveWrapper(Class<?> c) {
+		return pmap1.get(c);
+	}
+
+	/**
+	 * If the specified class is a primitive wrapper (e.g. <code><jk>Integer</jk>.<jk>class</jk></code>)
+	 * 	returns it's primitive class (e.g. <code>int.<jk>class</jk></code>).
+	 *
+	 * @param c The class.
+	 * @return The primitive class, or <jk>null</jk> if class is not a primitive wrapper.
+	 */
+	public static Class<?> getPrimitiveForWrapper(Class<?> c) {
+		return pmap2.get(c);
+	}
+
+	/**
+	 * If the specified class is a primitive (e.g. <code><jk>int</jk>.<jk>class</jk></code>)
+	 * 	returns it's wrapper class (e.g. <code>Integer.<jk>class</jk></code>).
+	 *
+	 * @param c The class.
+	 * @return The wrapper class if it's primitive, or the same class if class is not a primitive.
+	 */
+	public static Class<?> getWrapperIfPrimitive(Class<?> c) {
+		if (! c.isPrimitive())
+			return c;
+		return pmap1.get(c);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.class
new file mode 100755
index 0000000..25ba941
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.java
new file mode 100755
index 0000000..bec00b6
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/CollectionUtils.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+/**
+ * Utility methods for collections.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class CollectionUtils {
+
+	/**
+	 * Reverses the order of a {@link LinkedHashMap}.
+	 *
+	 * @param in The map to reverse the order on.
+	 * @return A new {@link LinkedHashMap} with keys in reverse order.
+	 */
+	public static <K,V> LinkedHashMap<K,V> reverse(LinkedHashMap<K,V> in) {
+		if (in == null)
+			return null;
+		LinkedHashMap<K,V> m = new LinkedHashMap<K,V>();
+
+		// Note:  Entry objects are reusable in an entry set, so we simply can't
+		// create a reversed iteration of that set.
+		List<K> keys = new ArrayList<K>(in.keySet());
+		List<V> values = new ArrayList<V>(in.values());
+		for (int i = in.size()-1; i >= 0; i--)
+			m.put(keys.get(i), values.get(i));
+
+		return m;
+	}
+
+	/**
+	 * Add a value to a list if the value is not null.
+	 *
+	 * @param l The list to add to.
+	 * @param o The element to add.
+	 * @return The same list.
+	 */
+	public static <T> List<T> addIfNotNull(List<T> l, T o) {
+		if (o != null)
+			l.add(o);
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$1.class
new file mode 100755
index 0000000..4452c8c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$BeanMapEntryOverride.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$BeanMapEntryOverride.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$BeanMapEntryOverride.class
new file mode 100755
index 0000000..edd7903
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap$BeanMapEntryOverride.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.class
new file mode 100755
index 0000000..bd90f1f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.java
new file mode 100755
index 0000000..c8e85d4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateBeanMap.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents a wrapped {@link BeanMap} where property values can be overridden, removed, or reordered
+ * 	without affecting the underlying bean.
+ * <p>
+ * 	Provides the {@link #filterKeys(List)} method for specifying the keys to keep in the bean map
+ * 		and in what order they should appear.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the wrapped bean.
+ */
+@SuppressWarnings("hiding")
+public class DelegateBeanMap<T> extends BeanMap<T> {
+
+	private Set<String> keys = Collections.newSetFromMap(new LinkedHashMap<String,Boolean>());
+	private ObjectMap overrideValues = new ObjectMap();
+
+	@SuppressWarnings("unchecked")
+	DelegateBeanMap(T bean, BeanContext bc) {
+		super(bean, bc.getBeanMeta((Class<T>)bean.getClass()));
+	}
+
+	void addKey(String key) {
+		this.keys.add(key);
+	}
+
+	@Override /* Map */
+	public Object put(String key, Object val) {
+		this.overrideValues.put(key, val);
+		this.keys.add(key);
+		return null;
+	}
+
+	@Override /* Map */
+	public Object get(Object key) {
+		if (overrideValues.containsKey(key))
+			return overrideValues.get(key);
+		return super.get(key);
+	}
+
+	@Override /* Map */
+	public Set<String> keySet() {
+		return keys;
+	}
+
+	/**
+	 * Remove all but the specified properties from this bean map.
+	 * <p>
+	 * This does not affect the underlying bean.
+	 *
+	 * @param keys The remaining keys in the bean map (in the specified order).
+	 */
+	public void filterKeys(List<String> keys) {
+		this.keys.clear();
+		this.keys.addAll(keys);
+	}
+
+	@Override /* Map */
+	public Object remove(Object key) {
+		keys.remove(key);
+		return null;
+	}
+
+	@Override /* BeanMap */
+	public BeanMeta<T> getMeta() {
+		return new BeanMetaFiltered<T>(super.getMeta(), keys);
+	}
+
+	@Override /* Map */
+	public Set<Entry<String,Object>> entrySet() {
+		Set<Entry<String,Object>> s = Collections.newSetFromMap(new LinkedHashMap<Map.Entry<String,Object>,Boolean>());
+		for (final String key : keys) {
+			BeanMapEntry<T> bme;
+			if (overrideValues.containsKey(key))
+				bme = new BeanMapEntryOverride<T>(this, this.getPropertyMeta(key), overrideValues.get(key));
+			else
+				bme = this.getProperty(key);
+			if (bme == null)
+				throw new BeanRuntimeException(super.getClassMeta().getInnerClass(), "Property ''{0}'' not found on class.", key);
+			s.add(bme);
+		}
+		return s;
+	}
+
+	private class BeanMapEntryOverride<T2> extends BeanMapEntry<T2> {
+		Object value;
+
+		private BeanMapEntryOverride(BeanMap<T2> bm, BeanPropertyMeta<T2> bpm, Object value) {
+			super(bm, bpm);
+			this.value = value;
+		}
+
+		@Override /* Map.Entry */
+		public Object getValue() {
+			return value;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.class
new file mode 100755
index 0000000..c7ab98a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.java
new file mode 100755
index 0000000..379bfe2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateList.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents a wrapped {@link Collection} where entries in the list can be removed or reordered without
+ * 	affecting the underlying list.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the wrapped bean.
+ */
+public class DelegateList<T extends Collection<?>> extends ObjectList implements Delegate<T> {
+	private static final long serialVersionUID = 1L;
+
+	private transient ClassMeta<T> classMeta;
+
+	DelegateList(ClassMeta<T> classMeta) {
+		this.classMeta = classMeta;
+	}
+
+	@Override /* Delegate */
+	public ClassMeta<T> getClassMeta() {
+		return classMeta;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.class
new file mode 100755
index 0000000..3ed7bb7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.java
new file mode 100755
index 0000000..756546e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/DelegateMap.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents a wrapped {@link Map} where entries in the map can be removed without
+ * 	affecting the underlying map.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the wrapped bean.
+ */
+public class DelegateMap<T> extends ObjectMap implements Delegate<T> {
+	private static final long serialVersionUID = 1L;
+
+	private transient ClassMeta<T> classMeta;
+
+	DelegateMap(ClassMeta<T> classMeta) {
+		this.classMeta = classMeta;
+	}
+
+	@Override /* Delegate */
+	public ClassMeta<T> getClassMeta() {
+		return classMeta;
+	}
+
+	/**
+	 * Remove all but the specified keys from this map.
+	 * <p>
+	 * This does not affect the underlying map.
+	 *
+	 * @param keys The remaining keys in the map (in the specified order).
+	 */
+	public void filterKeys(List<String> keys) {
+		ObjectMap m2 = new ObjectMap();
+		for (String k : keys)
+			m2.put(k, get(k));
+		this.clear();
+		this.putAll(m2);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.class
new file mode 100755
index 0000000..7967b8f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.java
new file mode 100755
index 0000000..3639cbf
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FileUtils.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+
+/**
+ * File utilities.
+ */
+public class FileUtils {
+
+	/**
+	 * Same as {@link File#mkdirs()} except throws a RuntimeExeption if directory could not be created.
+	 *
+	 * @param f The directory to create.  Must not be <jk>null</jk>.
+	 * @param clean If <jk>true</jk>, deletes the contents of the directory if it already exists.
+	 * @return The same file.
+	 * @throws RuntimeException if directory could not be created.
+	 */
+	public static File mkdirs(File f, boolean clean) {
+		assertFieldNotNull(f, "f");
+		if (f.exists()) {
+			if (clean) {
+				if (! delete(f))
+					throw new RuntimeException("Could not clean directory '"+f.getAbsolutePath()+"'");
+			} else {
+				return f;
+			}
+		}
+		if (! f.mkdirs())
+			throw new RuntimeException("Could not create directory '" + f.getAbsolutePath() + "'");
+		return f;
+	}
+
+	/**
+	 * Same as {@link #mkdirs(String, boolean)} but uses String path.
+	 *
+	 * @param path The path of the directory to create.  Must not be <jk>null</jk>
+	 * @param clean If <jk>true</jk>, deletes the contents of the directory if it already exists.
+	 * @return The directory.
+	 */
+	public static File mkdirs(String path, boolean clean) {
+		assertFieldNotNull(path, "path");
+		return mkdirs(new File(path), clean);
+	}
+
+	/**
+	 * Recursively deletes a file or directory.
+	 *
+	 * @param f The file or directory to delete.
+	 * @return <jk>true</jk> if file or directory was successfully deleted.
+	 */
+	public static boolean delete(File f) {
+		if (f == null)
+			return true;
+		if (f.isDirectory()) {
+			File[] cf = f.listFiles();
+			if (cf != null)
+				for (File c : cf)
+					delete(c);
+		}
+		return f.delete();
+	}
+
+	/**
+	 * Creates a file if it doesn't already exist using {@link File#createNewFile()}.
+	 * Throws a {@link RuntimeException} if the file could not be created.
+	 *
+	 * @param f The file to create.
+	 */
+	public static void create(File f) {
+		if (f.exists())
+			return;
+		try {
+			if (! f.createNewFile())
+				throw new RuntimeException("Could not create file '"+f.getAbsolutePath()+"'");
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Updates the modified timestamp on the specified file.
+	 * Method ensures that the timestamp changes even if it's been modified within the past millisecond.
+	 *
+	 * @param f The file to modify the modified timestamp on.
+	 */
+	public static void modifyTimestamp(File f) {
+		long lm = f.lastModified();
+		long l = System.currentTimeMillis();
+		if (lm == l)
+			l++;
+		if (! f.setLastModified(l))
+			throw new RuntimeException("Could not modify timestamp on file '"+f.getAbsolutePath()+"'");
+
+		// Linux only gives 1s precision, so set the date 1s into the future.
+		if (lm == f.lastModified()) {
+			l += 1000;
+			if (! f.setLastModified(l))
+				throw new RuntimeException("Could not modify timestamp on file '"+f.getAbsolutePath()+"'");
+		}
+	}
+
+	/**
+	 * Create a temporary file with the specified name.
+	 * <p>
+	 * The name is broken into file name and suffix, and the parts
+	 * are passed to {@link File#createTempFile(String, String)}.
+	 * <p>
+	 * {@link File#deleteOnExit()} is called on the resulting file before being returned by this method.
+	 *
+	 * @param name The file name
+	 * @return A newly-created temporary file.
+	 * @throws IOException
+	 */
+	public static File createTempFile(String name) throws IOException {
+		String[] parts = name.split("\\.");
+		File f = File.createTempFile(parts[0], "." + parts[1]);
+		f.deleteOnExit();
+		return f;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$1.class
new file mode 100755
index 0000000..69fd5cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$ListSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$ListSet.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$ListSet.class
new file mode 100755
index 0000000..cda0c50
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap$ListSet.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.class
new file mode 100755
index 0000000..8f0774d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.java
new file mode 100755
index 0000000..9579fe3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/FilteredMap.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.util.*;
+
+/**
+ * Wrapper around a map where the key names are overridden.
+ *
+ * @param <K> The key class type.
+ * @param <V> The value class type.
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class FilteredMap<K,V> extends AbstractMap<K,V> {
+
+	private Map<K,V> innerMap;
+	private Set<Map.Entry<K,V>> entries;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param innerMap The map being wrapped.  Must not be <jk>null</jk>.
+	 * @param keys The keys in the new map.  Must not be <jk>null</jk>.
+	 */
+	public FilteredMap(Map<K,V> innerMap, K[] keys) {
+		assertFieldNotNull(innerMap, "innerMap");
+		assertFieldNotNull(keys, "keys");
+
+		this.innerMap = innerMap;
+			List<Map.Entry<K,V>> l = new ArrayList<Map.Entry<K,V>>(keys.length);
+			for (K k : keys)
+				if (innerMap.containsKey(k))
+					l.add(createEntry(k));
+			entries = new ListSet<Map.Entry<K,V>>(l);
+		}
+
+	private Map.Entry<K,V> createEntry(final K key) {
+		return new Map.Entry<K,V>() {
+
+			@Override /* Map.Entry */
+			public K getKey() {
+				return key;
+			}
+
+			@Override /* Map.Entry */
+			public V getValue() {
+				return innerMap.get(key);
+			}
+
+			@Override /* Map.Entry */
+			public V setValue(V v) {
+				return innerMap.put(key, v);
+			}
+		};
+	}
+
+
+	@Override /* Map */
+	public Set<Map.Entry<K,V>> entrySet() {
+		return entries;
+	}
+
+	/**
+	 * A set with ordered entries (i.e. a List with a Set API).
+	 */
+	private static class ListSet<E> extends AbstractSet<E> {
+
+		private List<E> entries;
+
+		public ListSet(List<E> entries) {
+			this.entries = entries;
+		}
+
+		@Override /* Set */
+		public Iterator<E> iterator() {
+			return entries.iterator();
+		}
+
+		@Override /* Set */
+		public int size() {
+			return entries.size();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe$LineProcessor.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe$LineProcessor.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe$LineProcessor.class
new file mode 100755
index 0000000..5a68a01
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe$LineProcessor.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.class
new file mode 100755
index 0000000..1f79c1c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.java
new file mode 100755
index 0000000..51d02a8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOPipe.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * A utility class for piping input streams and readers to output streams and writers.
+ * <p>
+ * 	A typical usage is as follows...
+ * <p class='bcode'>
+ * 	InputStream in = getInputStream();
+ * 	Writer out = getWriter();
+ * 	IOPipe.create(in, out).closeOut().run();
+ * </p>
+ * <p>
+ * 	By default, the input stream is closed and the output stream is not.
+ * 	This can be changed by calling {@link #closeOut()} and {@link #close(boolean, boolean)}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("hiding")
+public class IOPipe {
+
+	private Object input, output;
+	private boolean byLines;
+	private boolean closeIn = true, closeOut;
+	private int buffSize = 1024;
+	private LineProcessor lineProcessor;
+
+	private IOPipe(Object input, Object output) {
+		assertFieldNotNull(input, "input");
+		assertFieldNotNull(output, "output");
+
+		if (input instanceof CharSequence)
+			this.input = new StringReader(input.toString());
+		else if (input instanceof InputStream || input instanceof Reader)
+			this.input = input;
+		else
+			illegalArg("Invalid input class type.  Must be one of the following:  InputStream, Reader, CharSequence");
+
+		if (output instanceof OutputStream || output instanceof Writer)
+			this.output = output;
+		else
+			illegalArg("Invalid output class type.  Must be one of the following:  OutputStream, Writer");
+	}
+
+	/**
+	 * Creates a new pipe with the specified input and output.
+	 *
+	 * @param input The input.  Must be one of the following types:  Reader, InputStream, CharSequence.
+	 * @param output The output.  Must be one of the following types:  Writer, OutputStream.
+	 * @return This object (for method chaining).
+	 */
+	public static IOPipe create(Object input, Object output) {
+		return new IOPipe(input, output);
+	}
+
+	/**
+	 * Close output after piping.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe closeOut() {
+		this.closeOut = true;
+		return this;
+	}
+
+	/**
+	 * Specifies whether to close the input and output after piping.
+	 *
+	 * @param in Close input stream.  Default is <jk>true</jk>.
+	 * @param out Close output stream.  Default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe close(boolean in, boolean out) {
+		this.closeIn = in;
+		this.closeOut = out;
+		return this;
+	}
+
+	/**
+	 * Specifies the temporary buffer size.
+	 *
+	 * @param buffSize The buffer size.  Default is <code>1024</code>.
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe buffSize(int buffSize) {
+		assertFieldPositive(buffSize, "buffSize");
+		this.buffSize = buffSize;
+		return this;
+	}
+
+	/**
+	 * Specifies whether the content should be piped line-by-line.
+	 * This can be useful if you're trying to pipe console-based input.
+	 *
+	 * @param byLines Pipe content line-by-line.  Default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe byLines(boolean byLines) {
+		this.byLines = byLines;
+		return this;
+	}
+
+	/**
+	 * Sames as calling {@link #byLines()} with <jk>true</jk>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe byLines() {
+		this.byLines = true;
+		return this;
+	}
+
+	/**
+	 * Specifies a line processor that can be used to process lines before they're piped to the output.
+	 *
+	 * @param lineProcessor The line processor.
+	 * @return This object (for method chaining).
+	 */
+	public IOPipe lineProcessor(LineProcessor lineProcessor) {
+		this.lineProcessor = lineProcessor;
+		return this;
+	}
+
+	/**
+	 * Interface to implement for the {@link #lineProcessor(LineProcessor)} method.
+	 */
+	public interface LineProcessor {
+		/**
+		 * Process the specified line.
+		 *
+		 * @param line The line to process.
+		 * @return The processed line.
+		 */
+		public String process(String line);
+	}
+
+	/**
+	 * Performs the piping of the input to the output.
+	 *
+	 * @return The number of bytes (if streams) or characters (if readers/writers) piped.
+	 * @throws IOException
+	 */
+	public int run() throws IOException {
+
+		int c = 0;
+
+		try {
+		if (input instanceof InputStream && output instanceof OutputStream && lineProcessor == null) {
+			InputStream in = (InputStream)input;
+			OutputStream out = (OutputStream)output;
+			byte[] b = new byte[buffSize];
+			int i;
+				while ((i = in.read(b)) > 0) {
+					c += i;
+					out.write(b, 0, i);
+				}
+		} else {
+				Reader in = (input instanceof Reader ? (Reader)input : new InputStreamReader((InputStream)input, IOUtils.UTF8));
+				Writer out = (output instanceof Writer ? (Writer)output : new OutputStreamWriter((OutputStream)output, IOUtils.UTF8));
+				output = out;
+				input = in;
+				if (byLines || lineProcessor != null) {
+					Scanner s = new Scanner(in);
+					while (s.hasNextLine()) {
+						String l = s.nextLine();
+						if (lineProcessor != null)
+							l = lineProcessor.process(l);
+							if (l != null) {
+						out.write(l);
+						out.write("\n");
+						out.flush();
+						c += l.length() + 1;
+					}
+						}
+				} else {
+					int i;
+					char[] b = new char[buffSize];
+					while ((i = in.read(b)) > 0) {
+						c += i;
+						out.write(b, 0, i);
+					}
+				}
+			}
+			} finally {
+			closeQuietly(input, output);
+		}
+		return c;
+	}
+
+	private void closeQuietly(Object input, Object output) {
+					if (closeIn)
+			IOUtils.closeQuietly(input);
+					if (closeOut)
+			IOUtils.closeQuietly(output);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.class
new file mode 100755
index 0000000..af415ce
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.java
new file mode 100755
index 0000000..16065af
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IOUtils.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.nio.charset.*;
+
+/**
+ * Various I/O related utility methods.
+ *
+ * @author jbognar
+ */
+public final class IOUtils {
+
+	/** UTF-8 charset */
+	public static final Charset UTF8 = Charset.forName("UTF-8");
+
+	/**
+	 * Reads the contents of a file into a string.
+	 *
+	 * @param path The path of the file to read using default character encoding.
+	 * @return The contents of the reader as a string, or <jk>null</jk> if file does not exist.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public static String readFile(String path) throws IOException {
+		return read(new File(path));
+	}
+
+	/**
+	 * Reads the contents of a file into a string.
+	 *
+	 * @param in The file to read using default character encoding.
+	 * @return The contents of the reader as a string, or <jk>null</jk> if file does not exist.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public static String read(File in) throws IOException {
+		if (in == null || ! in.exists())
+			return null;
+		Reader r = new InputStreamReader(new FileInputStream(in), Charset.defaultCharset());
+		return read(r, 0, 1024);
+	}
+
+	/**
+	 * Writes the contents of the specified <code>Reader</code> to the specified file.
+	 *
+	 * @param out The file to write the output to.
+	 * @param in The reader to pipe from.
+	 * @return The number of characters written to the file.
+	 * @throws IOException
+	 */
+	public static int write(File out, Reader in) throws IOException {
+		assertFieldNotNull(out, "out");
+		assertFieldNotNull(in, "in");
+		Writer w = new OutputStreamWriter(new FileOutputStream(out), Charset.defaultCharset());
+		try {
+			return IOPipe.create(in, w).closeOut().run();
+		} finally {
+			w.close();
+		}
+	}
+
+	/**
+	 * Reads the contents of a reader into a string.
+	 *
+	 * @param in The input reader.
+	 * @return The contents of the reader as a string.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public static String read(Reader in) throws IOException {
+		return read(in, 0, 1024);
+	}
+
+	/**
+	 * Reads the contents of an input stream into a string using the specified charset.
+	 *
+	 * @param in The input stream.
+	 * @param cs The charset of the contents of the input stream.
+	 * @return The contents of the reader as a string.  <jk>null</jk> if input stream was null.
+	 * @throws IOException If a problem occurred trying to read from the input stream.
+	 */
+	public static String read(InputStream in, Charset cs) throws IOException {
+		if (in == null)
+			return null;
+		return read(new InputStreamReader(in, cs));
+	}
+
+	/**
+	 * Reads the contents of an input stream into a string using the system default charset.
+	 *
+	 * @param in The input stream.
+	 * @return The contents of the reader as a string, or <jk>null</jk> if the input stream is null.
+	 * @throws IOException If a problem occurred trying to read from the input stream.
+	 */
+	public static String read(InputStream in) throws IOException {
+		if (in == null)
+			return null;
+		return read(new InputStreamReader(in, Charset.defaultCharset()));
+	}
+
+	/**
+	 * Read the specified input stream into a byte array and closes the stream.
+	 *
+	 * @param in The input stream.
+	 * @param bufferSize The expected size of the buffer.
+	 * @return The contents of the stream as a byte array.
+	 * @throws IOException Thrown by underlying stream.
+	 */
+	public static byte[] readBytes(InputStream in, int bufferSize) throws IOException {
+		if (in == null)
+			return null;
+		ByteArrayOutputStream buff = new ByteArrayOutputStream(bufferSize);
+		int nRead;
+		byte[] b = new byte[Math.min(bufferSize, 8192)];
+
+		try {
+			while ((nRead = in.read(b, 0, b.length)) != -1)
+				  buff.write(b, 0, nRead);
+
+				buff.flush();
+
+				return buff.toByteArray();
+		} finally {
+			in.close();
+		}
+	}
+
+
+	/**
+	 * Reads the specified input into a {@link String} until the end of the input is reached.
+	 * <p>
+	 * 	The {@code Reader} is automatically closed.
+	 * <p>
+	 * 	If the {@code Reader} is not an instance of a {@code BufferedReader}, then it gets wrapped in a {@code BufferedReader}.
+	 *
+	 * @param in The input reader.
+	 * @param length Specify a positive number if the length of the input is known.
+	 * @param bufferSize Specify the buffer size to use.
+	 * @return The contents of the reader as a string.  <jk>null</jk> if reader was null.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public static String read(Reader in, int length, int bufferSize) throws IOException {
+		if (in == null)
+			return null;
+		length = (length <= 0 ? bufferSize : length);
+		StringBuilder sb = new StringBuilder(length); // Assume they're ASCII characters.
+		try {
+			char[] buf = new char[Math.min(bufferSize, length)];
+			int i = 0;
+			while ((i = in.read(buf)) != -1)
+				sb.append(buf, 0, i);
+			return sb.toString();
+		} finally {
+			in.close();
+		}
+	}
+
+	/**
+	 * Pipes the contents of the specified reader into the writer.
+	 * The reader is closed, the writer is not.
+	 *
+	 * @param in The reader to pipe from.
+	 * @param out The writer to pipe to.
+	 * @throws IOException
+	 */
+   public static void pipe(Reader in, Writer out) throws IOException {
+		assertFieldNotNull(out, "out");
+		assertFieldNotNull(in, "in");
+      IOPipe.create(in, out).run();
+   }
+
+   /**
+	 * Wraps the specified reader in a buffered reader.
+	 * <p>
+	 * Returns the original reader if it's already one of the following:
+	 * <ul>
+	 * 	<li>{@link BufferedReader}
+	 * 	<li>{@link StringReader}
+	 * 	<li>{@link CharSequenceReader}
+	 * </ul>
+	 *
+	 * @param r The reader being wrapped.
+	 * @param buffSize The expected size of the input.
+	 * @param minBuffSize The minimum buffer size to use if buffSize is too small.
+	 * @param maxBuffSize The maximum buffer size to use if buffSize is too large.
+	 * @return The wrapped reader.
+	 */
+	public static Reader getBufferedReader(Reader r, int buffSize, int minBuffSize, int maxBuffSize) {
+		assertFieldNotNull(r, "r");
+		if (r instanceof BufferedReader || r instanceof StringReader)
+			return r;
+		if (buffSize <= 0)
+			buffSize = 1024;
+		if (buffSize < minBuffSize)
+			buffSize = minBuffSize;
+		else if (buffSize > maxBuffSize)
+			buffSize = maxBuffSize;
+		return new BufferedReader(r, buffSize);
+	}
+
+	/**
+	 * Shortcut for {@code getBufferedReader(r, buffSize, 128, 8096)}
+	 *
+	 * @param r The reader being wrapped.
+	 * @param buffSize The expected size of the input.
+	 * @return The reader wrapped in a {@link BufferedReader}, or the original {@link Reader} if it's already
+	 * 	a buffered reader.
+	 */
+	public static Reader getBufferedReader(Reader r, int buffSize) {
+		return getBufferedReader(r, buffSize, 128, 8096);
+	}
+
+	/**
+	 * Counts the number of bytes in the input stream and then closes the stream.
+	 *
+	 * @param is The input stream to read from.
+	 * @return The number of bytes read.
+	 * @throws IOException
+	 */
+	public static long count(InputStream is) throws IOException {
+		assertFieldNotNull(is, "is");
+		long c = 0;
+		long i;
+		try {
+			while ((i = is.skip(1024)) != 0)
+				c += i;
+		} finally {
+			is.close();
+		}
+		return c;
+	}
+
+	/**
+	 * Counts the number of characters in the reader and then closes the reader.
+	 *
+	 * @param r The reader to read from.
+	 * @return The number of characters read.
+	 * @throws IOException
+	 */
+	public static long count(Reader r) throws IOException {
+		assertFieldNotNull(r, "r");
+		long c = 0;
+		long i;
+		try {
+			while ((i = r.skip(1024)) != 0)
+				c += i;
+		} finally {
+			r.close();
+		}
+		return c;
+	}
+
+	/**
+	 * Given the specified <js>"Content-Length"</js> header value, return an appropriate buffer size.
+	 * The maximum buffer size is 1MB.
+	 *
+	 * @param contentLength The value of the <js>"Content-Length"</js> header.
+	 * @return The appropriate buffer size.
+	 */
+	public static int getBufferSize(String contentLength) {
+		try {
+			if (! StringUtils.isEmpty(contentLength)) {
+				long l = Long.decode(contentLength);
+				if (l > 1048576)
+					return 1048576;
+				if (l <= 0)
+					return 8192;
+				return (int)l;
+			}
+		} catch (Exception e) {
+			return 8192;
+		}
+		return 8192;
+	}
+
+	/** 
+	 * Close input stream and ignore any exceptions.
+	 * No-op if input stream is <jk>null</jk>.
+	 *
+	 * @param is The input stream to close.
+	 */
+	public static void closeQuietly(InputStream is) {
+		try {
+			if (is != null)
+				is.close();
+		} catch (IOException e) {}
+	}
+
+	/** 
+	 * Close output stream and ignore any exceptions.
+	 * No-op if output stream is <jk>null</jk>.
+	 *
+	 * @param os The output stream to close.
+	 */
+	public static void closeQuietly(OutputStream os) {
+		try {
+			if (os != null)
+				os.close();
+		} catch (IOException e) {}
+	}
+
+	/** 
+	 * Close reader and ignore any exceptions.
+	 * No-op if reader is <jk>null</jk>.
+	 *
+	 * @param r The reader to close.
+	 */
+	public static void closeQuietly(Reader r) {
+		try {
+			if (r != null)
+				r.close();
+		} catch (IOException e) {}
+	}
+
+	/** 
+	 * Close writer and ignore any exceptions.
+	 * No-op if writer is <jk>null</jk>.
+	 *
+	 * @param w The writer to close.
+	 */
+	public static void closeQuietly(Writer w) {
+		try {
+			if (w != null)
+				w.close();
+		} catch (IOException e) {}
+	}
+
+	/**
+	 * Quietly close all specified input streams, output streams, readers, and writers.
+	 *
+	 * @param o The list of all objects to quietly close.
+	 */
+	public static void closeQuietly(Object...o) {
+		for (Object o2 : o) {
+			if (o2 instanceof InputStream)
+				closeQuietly((InputStream)o2);
+			if (o2 instanceof OutputStream)
+				closeQuietly((OutputStream)o2);
+			if (o2 instanceof Reader)
+				closeQuietly((Reader)o2);
+			if (o2 instanceof Writer)
+				closeQuietly((Writer)o2);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.class
new file mode 100755
index 0000000..9f262fc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.java
new file mode 100755
index 0000000..ac14dbd
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/IdentityList.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+/**
+ * Combination of a {@link LinkedList} and <code>IdentitySet</code>.
+ * <ul>
+ * 	<li>Duplicate objects (by identity) will be skipped during insertion.
+ * 	<li>Order of insertion maintained.
+ * </ul>
+ * <p>
+ * 	Note:  This class is NOT thread safe, and is intended for use on small lists.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> Entry type.
+ */
+public class IdentityList<T> extends LinkedList<T> {
+
+	private static final long serialVersionUID = 1L;
+
+	@Override /* List */
+	public boolean add(T t) {
+		for (T t2 : this)
+			if (t2 == t)
+				return false;
+		super.add(t);
+		return true;
+	}
+
+	@Override /* List */
+	public boolean contains(Object t) {
+		for (T t2 : this)
+			if (t2 == t)
+				return true;
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.class
new file mode 100755
index 0000000..f080e7f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.java
new file mode 100755
index 0000000..e3f995b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/KeywordSet.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+/**
+ * Stores a set of language keywords for quick lookup.
+ * <p>
+ * Keywords must be:
+ * <ul>
+ * 	<li>2 or more characters in length.
+ * 	<li>Lowercase ASCII.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class KeywordSet {
+	final char[][][][] store;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param keywords The list of keywords.
+	 */
+	public KeywordSet(String... keywords) {
+		this.store = new char[26][][][];
+
+		for (String keyword : keywords) {
+			if (keyword.length() < 2)
+				illegalArg("Invalid keyword '{0}' passed to KeywordStore.", keyword);
+			int c0 = keyword.charAt(0) - 'a';
+			int c1 = keyword.charAt(1) - 'a';
+			if (c0 < 0 || c0 > 25 || c1 < 0 || c1 > 25)
+				illegalArg("Invalid keyword '{0}' passed to KeywordStore.", keyword);
+			if (this.store[c0] == null)
+				this.store[c0] = new char[26][][];
+			char[][][] x1 = this.store[c0];
+			char[][] x2;
+			if (x1[c1] == null)
+				x2 = new char[1][];
+			else {
+				x2 = new char[x1[c1].length+1][];
+				System.arraycopy(x1[c1], 0, x2, 0, x1[c1].length);
+			}
+			x2[x2.length-1] = keyword.toCharArray();
+			x1[c1] = x2;
+		}
+	}
+
+	/**
+	 * Returns <jk>true<jk> if the specified string exists in this store.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true<jk> if the specified string exists in this store.
+	 */
+	public boolean contains(String s) {
+		if (s == null || s.length() < 2)
+			return false;
+		int c0 = s.charAt(0) - 'a', c1 = s.charAt(1) - 'a';
+		if (c0 < 0 || c0 > 25 || c1 < 0 || c1 > 25)
+			return false;
+		char[][][] x1 = store[c0];
+		if (x1 == null)
+			return false;
+		char[][] x2 = x1[c1];
+		if (x2 == null)
+			return false;
+		for (int i = 0; i < x2.length; i++) {
+			char[] keyword = x2[i];
+			if (keyword.length == s.length()) {
+				for (int j = 0; j < keyword.length; j++)
+					if (keyword[j] != s.charAt(j))
+						return false;
+				return true;
+			}
+		}
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable$1.class
new file mode 100755
index 0000000..4e47109
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.class
new file mode 100755
index 0000000..aaec7a1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.java
new file mode 100755
index 0000000..089a4e8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiIterable.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.util.*;
+
+/**
+ * Utility class for defining an iterator over one or more iterables.
+ * @param <E> The element class type.
+ */
+public class MultiIterable<E> implements Iterable<E> {
+
+	final List<Iterator<E>> iterators = new LinkedList<Iterator<E>>();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param iterators The list of iterators to iterate over.
+	 */
+	public MultiIterable(Iterator<E>...iterators) {
+		for (Iterator<E> i : iterators)
+			append(i);
+	}
+
+	/**
+	 * Appends the specified iterator to this list of iterators.
+	 *
+	 * @param iterator The iterator to append.
+	 * @return This object (for method chaining).
+	 */
+	public MultiIterable<E> append(Iterator<E> iterator) {
+		assertFieldNotNull(iterator, "iterator");
+		this.iterators.add(iterator);
+		return this;
+	}
+
+	@Override /* Iterable */
+	public Iterator<E> iterator() {
+		return new Iterator<E>() {
+			Iterator<Iterator<E>> i1 = iterators.iterator();
+			Iterator<E> i2 = i1.hasNext() ? i1.next() : null;
+
+			@Override /* Iterator */
+			public boolean hasNext() {
+				while (i2 != null && ! i2.hasNext())
+					i2 = (i1.hasNext() ? i1.next() : null);
+				return (i2 != null);
+			}
+
+			@Override /* Iterator */
+			public E next() {
+				hasNext();
+				if (i2 == null)
+					throw new NoSuchElementException();
+				return i2.next();
+			}
+
+			@Override /* Iterator */
+			public void remove() {
+				if (i2 == null)
+					throw new NoSuchElementException();
+				i2.remove();
+			}
+		};
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet$1.class
new file mode 100755
index 0000000..f8ca93b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.class
new file mode 100755
index 0000000..5bd3b5e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.java
new file mode 100755
index 0000000..44da937
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/MultiSet.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.util.*;
+
+/**
+ * Encapsulates multiple collections so they can be iterated over as if they
+ * were all part of the same collection.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <E> The object type of this set.
+ */
+public class MultiSet<E> extends AbstractSet<E> {
+
+	/** Inner collections. */
+	private List<Collection<E>> l = new ArrayList<Collection<E>>();
+
+	/**
+	 * Create a new Set that consists as a coalesced set of the specified collections.
+	 *
+	 * @param c Zero or more collections to add to this set.
+	 */
+	public MultiSet(Collection<E>...c) {
+		for (Collection<E> cc : c)
+			append(cc);
+	}
+
+	/**
+	 * Appends the specified collection to this set of collections.
+	 *
+	 * @param c The collection to append to this set of collections.
+	 * @return This object (for method chaining).
+	 */
+	public MultiSet<E> append(Collection<E> c) {
+		assertFieldNotNull(c, "c");
+		l.add(c);
+		return this;
+	}
+
+	/**
+	 * Iterates over all entries in all collections.
+	 */
+	@Override /* Set */
+	public Iterator<E> iterator() {
+		return new Iterator<E>() {
+			int i = 0;
+			Iterator<E> i2 = (l.size() > 0 ? l.get(i++).iterator() : null);
+
+			@Override /* Iterator */
+			public boolean hasNext() {
+				if (i2 == null)
+					return false;
+				if (i2.hasNext())
+					return true;
+				for (int j = i; j < l.size(); j++)
+					if (l.get(j).size() > 0)
+						return true;
+				return false;
+			}
+
+			@Override /* Iterator */
+			public E next() {
+				if (i2 == null)
+					throw new NoSuchElementException();
+				while (! i2.hasNext()) {
+					if (i >= l.size())
+						throw new NoSuchElementException();
+					i2 = l.get(i++).iterator();
+				}
+				return i2.next();
+			}
+
+			@Override /* Iterator */
+			public void remove() {
+				if (i2 == null)
+					throw new NoSuchElementException();
+				i2.remove();
+			}
+		};
+	}
+
+	/**
+	 * Enumerates over all entries in all collections.
+	 *
+	 * @return An enumeration wrapper around this set.
+	 */
+	public Enumeration<E> enumerator() {
+		return Collections.enumeration(this);
+	}
+
+	@Override /* Set */
+	public int size() {
+		int i = 0;
+		for (Collection<E> c : l)
+			i += c.size();
+		return i;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.class
new file mode 100755
index 0000000..d21fa8e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.java
new file mode 100755
index 0000000..c051b90
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoIntrospector.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Used to invoke methods on {@code Objects} using arguments in serialized form.
+ *	<p>
+ *	Example:
+ *	<p class='bcode'>
+ *		String s = <js>"foobar"</js>;
+ *		String s2 = (String)<jk>new</jk> PojoIntrospector(s).invoke(<js>"substring(int,int)"</js>, <js>"[3,6]"</js>);  <jc>// "bar"</jc>
+ *	</p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class PojoIntrospector {
+
+	private final Object o;
+	private final ReaderParser p;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param o The object on which Java methods will be invoked.
+	 * @param p The parser to use to parse the method arguments.  If <jk>null</jk>, {@link JsonParser#DEFAULT} is used.
+	 */
+	public PojoIntrospector(Object o, ReaderParser p) {
+		if (p == null)
+			p = JsonParser.DEFAULT;
+		this.o = o;
+		this.p = p;
+	}
+
+	/**
+	 * Shortcut for calling <code><jk>new</jk> PojoIntrospector(o, <jk>null</jk>);</code>
+	 *
+	 * @param o The object on which Java methods will be invoked.
+	 */
+	public PojoIntrospector(Object o) {
+		this(o, null);
+	}
+
+	/**
+	 * Primary method.  Invokes the specified method on this bean.
+	 *
+	 * @param method The method being invoked.
+	 * @param args The arguments to pass as parameters to the method.<br>
+	 * 	These will automatically be converted to the appropriate object type if possible.<br>
+	 * 	Can be <jk>null</jk> if method has no arguments.
+	 * @return The object returned by the call to the method, or <jk>null</jk> if target object is <jk>null</jk>.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If one of the following occurs:
+	 * 	<ul>
+	 * 		<li>The number of actual and formal parameters differ.
+	 * 		<li>An unwrapping conversion for primitive arguments fails.
+	 * 		<li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.
+	 * 		<li>The constructor pertains to an enum type.
+	 * 	</ul>
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException
+	 */
+	public Object invokeMethod(Method method, Reader args) throws InvocationTargetException, IllegalArgumentException, IllegalAccessException, ParseException, IOException {
+		if (o == null)
+			return null;
+		ClassMeta<?>[] argTypes = p.getBeanContext().getClassMetas(method.getParameterTypes());
+		Object[] params = args == null ? null : p.parseArgs(args, -1, argTypes);
+		return method.invoke(o, params);
+	}
+
+	/**
+	 * Convenience method for invoking argument from method signature (@see {@link ClassUtils#getMethodSignature(Method)}.
+	 *
+	 * @param method The method being invoked.
+	 * @param args The arguments to pass as parameters to the method.<br>
+	 * 	These will automatically be converted to the appropriate object type if possible.<br>
+	 * 	Can be <jk>null</jk> if method has no arguments.
+	 * @return The object returned by the call to the method, or <jk>null</jk> if target object is <jk>null</jk>.
+	 * @throws NoSuchMethodException If method does not exist.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If one of the following occurs:
+	 * 	<ul>
+	 * 		<li>The number of actual and formal parameters differ.
+	 * 		<li>An unwrapping conversion for primitive arguments fails.
+	 * 		<li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.
+	 * 		<li>The constructor pertains to an enum type.
+	 * 	</ul>
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException
+	 */
+	public Object invokeMethod(String method, String args) throws NoSuchMethodException, IllegalArgumentException, InvocationTargetException, IllegalAccessException, ParseException, IOException {
+		if (o == null)
+			return null;
+		Method m = p.getBeanContext().getClassMeta(o.getClass()).getPublicMethods().get(method);
+		if (m == null)
+			throw new NoSuchMethodException(method);
+		return invokeMethod(m, args == null ? null : new StringReader(args));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$1.class
new file mode 100755
index 0000000..fb9bbd1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CalendarP.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CalendarP.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CalendarP.class
new file mode 100755
index 0000000..8bf4fcc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CalendarP.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CollectionFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CollectionFilter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CollectionFilter.class
new file mode 100755
index 0000000..c263a15
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$CollectionFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$DateMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$DateMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$DateMatcher.class
new file mode 100755
index 0000000..709ef8d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$DateMatcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$IMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$IMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$IMatcher.class
new file mode 100755
index 0000000..2c8fc09
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$IMatcher.class differ


[49/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/package.html b/com.ibm.team.juno.client/bin/com/ibm/juno/client/package.html
new file mode 100755
index 0000000..407ef7c
--- /dev/null
+++ b/com.ibm.team.juno.client/bin/com/ibm/juno/client/package.html
@@ -0,0 +1,850 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>REST Client API</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#SSL'>SSL Support</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#SSLOpts'>SSLOpts Bean</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Authentication'>Authentication</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#BASIC'>BASIC Authentication</a></p>
+			<li><p><a class='doclink' href='#FORM'>FORM-based Authentication</a></p>
+			<li><p><a class='doclink' href='#OIDC'>OIDC Authentication</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#ResponsePatterns'>Using Response Patterns</a></p>
+		<li><p><a class='doclink' href='#PipingOutput'>Piping Response Output</a></p>
+		<li><p><a class='doclink' href='#Logging'>Logging</a></p>
+		<li><p><a class='doclink' href='#Interceptors'>Interceptors</a></p>
+		<li><p><a class='doclink' href='#Remoteable'>Remoteable Proxies</a></p>
+		<li><p><a class='doclink' href='#Other'>Other Useful Methods</a></p>
+	</ol>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - REST Client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides an HTTP client API that makes it extremely simple to connect to remote REST interfaces and 
+		seemlessly send and receive serialized POJOs in requests and responses.  
+	</p>
+	<h6 class='notes'>Features:</h6>
+	<ul class='notes'>
+		<li>Converts POJOs directly to HTTP request message bodies using {@link com.ibm.juno.core.serializer.Serializer} classes.
+	 	<li>Converts HTTP response message bodies directly to POJOs using {@link com.ibm.juno.core.parser.Parser} classes.
+		<li>Exposes the full functionality of the Apache HttpClient API by exposing all methods defined on the 
+			{@link org.apache.http.impl.client.HttpClientBuilder} class.
+		<li>Provides various convenience methods for setting up common SSL and authentication methods.
+		<li>Provides a fluent interface that allows you to make complex REST calls in a single line of code.
+	</ul>	
+	<p>
+		The client API is designed to work as a thin layer on top of the proven Apache HttpClient API.  
+		By leveraging the HttpClient library, details such as SSL certificate negotiation, proxies, encoding, etc...
+			are all handled in Apache code. 
+	</p>
+	<p>
+		The Juno client API prereq's Apache HttpClient 4.1.2+. 
+		At a mimimum, the following jars are required:
+	</p>
+	<ul>
+		<li><code>httpclient-4.5.jar</code>
+		<li><code>httpcore-4.4.1.jar</code>
+		<li><code>httpmime-4.5.jar</code>
+	</ul>
+	<h6 class='topic'>Examples</h6>
+	<p class='bcode'>
+	<jc>// Examples below use the Juno Address Book resource example</jc>
+
+	<jc>// Create a reusable client with JSON support</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+	
+	<jc>// GET request, ignoring output</jc>
+	<jk>try</jk> {
+		<jk>int</jk> rc = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>).execute();
+		<jc>// Succeeded!</jc>
+	} <jk>catch</jk> (RestCallException e) {
+		<jc>// Failed!</jc>
+		System.<jsf>err</jsf>.println(
+			String.<jsm>format</jsm>(<js>"status=%s, message=%s"</js>, e.getResponseStatus(), e.getResponseMessage())
+		);
+	}
+			
+	<jc>// Remaining examples ignore thrown exceptions.</jc>		
+			
+	<jc>// GET request, secure, ignoring output</jc>
+	client.doGet(<js>"https://localhost:9443/sample/addressBook"</js>).execute();
+			
+	<jc>// GET request, getting output as a String.  No POJO parsing is performed.
+	// Note that when calling one of the getX() methods, you don't need to call connect() or disconnect(), since
+	//	it's automatically called for you.</jc>
+	String output = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponseAsString();
+			
+	<jc>// GET request, getting output as a Reader</jc>
+	Reader r = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getReader();
+			
+	<jc>// GET request, getting output as an ObjectMap</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	ObjectMap m = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(ObjectMap.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a ObjectList</jc>
+	<jc>// Input must be an array (e.g. "[...]")</jc>
+	ObjectList l = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(ObjectList.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	<jc>// Note that you don't have to do any casting!</jc>
+	Person p = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(Person.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an array of objects (e.g. "[{...},{...}]")</jc>
+	Person[] pa = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(Person[].<jk>class</jk>);
+			
+	<jc>// Same as above, except as a List&lt;Person&gt;</jc>
+	ClassMeta cm = BeanContext.<jsf>DEFAULT</jsf>.getCollectionClassMeta(LinkedList.<jk>class</jk>, Person.<jk>class</jk>);
+	List&lt;Person&gt; pl = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(cm);
+			
+	<jc>// GET request, getting output as a parsed string</jc>
+	<jc>// Input must be a string (e.g. "&lt;string&gt;foo&lt;/string&gt;" or "'foo'")</jc>
+	String name = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/name"</js>)
+		.getResponse(String.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed number</jc>
+	<jc>// Input must be a number (e.g. "&lt;number&gt;123&lt;/number&gt;" or "123")</jc>
+	<jk>int</jk> age = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/age"</js>)
+		.getResponse(Integer.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed boolean</jc>
+	<jc>// Input must be a boolean (e.g. "&lt;boolean&gt;true&lt;/boolean&gt;" or "true")</jc>
+	<jk>boolean</jk> isCurrent = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/addresses/0/isCurrent"</js>)
+		.getResponse(Boolean.<jk>class</jk>);
+			
+	<jc>// GET request, getting a filtered object</jc>
+	client.getParser().addFilters(CalendarFilter.<jsf>ISO8601</jsf>.<jk>class</jk>);
+	Calendar birthDate = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>)
+		.getResponse(GregorianCalendar.<jk>class</jk>);
+
+	<jc>// PUT request on regular field</jc>
+	String newName = <js>"John Smith"</js>;
+	<jk>int</jk> rc = client.doPut(<js>"http://localhost:9080/addressBook/0/name"</js>, newName).execute();
+	
+	<jc>// PUT request on filtered field</jc>
+	Calendar newBirthDate = <jk>new</jk> GregorianCalendar(1, 2, 3, 4, 5, 6);
+	rc = client.doPut(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>, newBirthDate).execute();
+	
+	<jc>// POST of a new entry to a list</jc>
+	Address newAddress = <jk>new</jk> Address(<js>"101 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12121, <jk>false</jk>);
+	rc = client.doPost(<js>"http://localhost:9080/addressBook/0/addresses"</js>, newAddress).execute();	
+	</p>
+	
+	<h6 class='notes'>Notes:</h6>
+	<ul class='notes'>
+		<li><p>The {@link com.ibm.juno.client.RestClient} class exposes all the builder methods on the Apache HttpClient {@link org.apache.http.impl.client.HttpClientBuilder} class.
+			Use these methods to provide any customized HTTP client behavior..</p>
+	</ul>
+	
+	<!-- ======================================================================================================== -->
+	<a id="SSL"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - SSL Support</h3>
+	<div class='topic'>
+		<p>
+			The simplest way to enable SSL support in the client is to use the {@link com.ibm.juno.client.RestClient#enableSSL(SSLOpts)} method
+			and one of the predefined {@link com.ibm.juno.client.SSLOpts} instances:
+			<ul>
+				<li>{@link com.ibm.juno.client.SSLOpts#DEFAULT} - Normal certificate and hostname validation.
+				<li>{@link com.ibm.juno.client.SSLOpts#LAX} - Allows for self-signed certificates.
+			</ul>
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableSSL(SSLOpts.<jsf>LAX</jsf>);
+		
+	<jc>// ...or...</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableLaxSSL();
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	
+	HostnameVerifier hv = <jk>new</jk> NoopHostnameVerifier();
+	TrustManager tm = <jk>new</jk> SimpleX509TrustManager(<jk>true</jk>);
+
+	<jk>for</jk> (String p : <jk>new</jk> String[]{<js>"SSL"</js>,<js>"TLS"</js>,<js>"SSL_TLS"</js>}) {
+		SSLContext ctx = SSLContext.<jsm>getInstance</jsm>(p);
+		ctx.init(<jk>null</jk>, <jk>new</jk> TrustManager[] { tm }, <jk>null</jk>);
+		SSLConnectionSocketFactory sf = <jk>new</jk> SSLConnectionSocketFactory(ctx, hv);
+		restClient.setSSLSocketFactory(sf);
+		Registry&lt;ConnectionSocketFactory&gt; r = RegistryBuilder.&lt;ConnectionSocketFactory&gt;<jsm>.create</jsm>().register(<js>"https"</js>, sf).build();
+		restClient.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r));
+	}
+		</p>
+		<p>
+			More complex SSL support can be enabled through the various {@link org.apache.http.impl.client.HttpClientBuilder} methods defined on the class.
+		</p>
+		
+		<!-- ======================================================================================================== -->
+		<a id="SSLOpts"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.1 - SSLOpts Bean</h4>
+		<div class='topic'>
+	<p>
+				The {@link com.ibm.juno.client.SSLOpts} class itself is a bean that can be created by the parsers.
+				For example, SSL options can be specified in a config file and retrieved as a bean using the {@link com.ibm.juno.core.ini.ConfigFile} class.
+	</p>
+			<h6 class='figure'>Contents of <code>MyConfig.cfg</code></h6>
+			<p class='bcode'>
+		<jc>#================================================================================
+		# My Connection Settings
+		#================================================================================</jc>
+		[Connection]
+		url = https://myremotehost:9443
+		ssl = {certValidate:'LAX',hostVerify:'LAX'}
+			</p>
+			<h6 class='figure'>Code that reads an <code>SSLOpts</code> bean from the config file</h6>
+			<p class='bcode'>
+		<jc>// Read config file and set SSL options based on what's in that file.</jc>
+		ConfigFile cf = ConfigMgr.<jsf>DEFAULT</jsf>.get(<js>"MyConfig.cfg"</js>);
+		SSLOpts ssl = cf.getObject(SSLOpts.<jk>class</jk>, <js>"Connection/ssl"</js>);
+		RestClient rc = <jk>new</jk> RestClient().enableSSL(ssl);
+			</p>
+		</div>
+	</div>	
+
+	<!-- ======================================================================================================== -->
+	<a id="Authentication"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - Authentication</h3>
+	<div class='topic'>
+
+		<!-- ======================================================================================================== -->
+		<a id="BASIC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.1 - BASIC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient#setBasicAuth(String,int,String,String)} method can be used to quickly enable
+				BASIC authentication support.
+			</p>
+			<h6 class='topic'>Example:</h6>
+			<p class='bcode'>
+	<jc>// Create a client that performs BASIC authentication using the specified user/pw.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.setBasicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>);
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	AuthScope scope = <jk>new</jk> AuthScope(<jsf>HOST</jsf>, <jsf>PORT</jsf>);
+	Credentials up = <jk>new</jk> UsernamePasswordCredentials(<jsf>USER</jsf>, <jsf>PW</jsf>);
+	CredentialsProvider p = <jk>new</jk> BasicCredentialsProvider();
+	p.setCredentials(scope, up);
+	restClient.setDefaultCredentialsProvider(p);
+			</p>
+		</div>
+	
+		<!-- ======================================================================================================== -->
+		<a id="FORM"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.2 - FORM-based Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient} class does not itself provide FORM-based authentication since there
+				is no standard way of providing such support. 
+				Typically, to perform FORM-based or other types of authentication, you'll want to create your own
+				subclass of {@link com.ibm.juno.client.RestClient} and override the {@link com.ibm.juno.client.RestClient#createHttpClient()}
+				method to provide an authenticated client.
+			</p>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				FORM-based authentication support.
+			</p>
+			<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		formBasedAuthenticate(client);
+		visitAuthenticatedURL(client);
+		<jk>return</jk> client;
+	}
+
+	<jc>/*
+	 * Performs form-based authentication against the Jazz server.
+	 */</jc>
+	<jk>private void</jk> formBasedAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		URI uri2 = <jf>jazzUri</jf>.resolve(<js>"j_security_check"</js>);
+		HttpPost request = <jk>new</jk> HttpPost(uri2);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		NameValuePairs params = <jk>new</jk> NameValuePairs()
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_username""</js>, <jf>user</jf>))
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, <jf>pw</jf>));
+		request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> rc = response.getStatusLine().getStatusCode();
+
+			Header authMsg = response.getFirstHeader(<js>"X-com-ibm-team-repository-web-auth-msg"</js>);
+			<jk>if</jk> (authMsg != <jk>null</jk>)
+				<jk>throw new</jk> IOException(authMsg.getValue());
+
+			<jc>// The form auth request should always respond with a 200 ok or 302 redirect code</jc>
+			<jk>if</jk> (rc == <jsf>SC_MOVED_TEMPORARILY</jsf>) {
+				<jk>if</jk> (response.getFirstHeader(<js>"Location"</js>).getValue().matches(<js>"^.*/auth/authfailed.*$"</js>))
+					<jk>throw new</jk> IOException(<js>"Invalid credentials."</js>);
+			} <jk>else if</jk> (rc != <jsf>SC_OK</jsf>) {
+				<jk>throw new</jk> IOException(<js>"Unexpected HTTP status: "</js> + rc);
+			}
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jc>/*
+	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
+	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
+	 * otherwise tomcat will not consider the session authenticated
+	 */</jc>
+	<jk>private int</jk> visitAuthenticatedURL(HttpClient httpClient) <jk>throws</jk> IOException {
+		HttpGet authenticatedURL = <jk>new</jk> HttpGet(<jf>jazzUri</jf>.resolve(<js>"authenticated/identity"</js>));
+		HttpResponse response = httpClient.execute(authenticatedURL);
+		<jk>try</jk> {
+			<jk>return</jk> response.getStatusLine().getStatusCode();
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+			</p>
+		</div>
+		
+		<!-- ======================================================================================================== -->
+		<a id="OIDC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.3 - OIDC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				OIDC authentication support.
+			</p>
+	<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		oidcAuthenticate(client);
+			<jk>return</jk> client;
+		}
+
+	<jk>private void</jk> oidcAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		HttpGet request = <jk>new</jk> HttpGet(<jf>jazzUri</jf>);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> code = response.getStatusLine().getStatusCode();
+
+			<jc>// Already authenticated</jc>
+			<jk>if</jk> (code == <jsf>SC_OK</jsf>)
+				<jk>return</jk>;
+
+			<jk>if</jk> (code != <jsf>SC_UNAUTHORIZED</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// x-jsa-authorization-redirect</jc>
+			String redirectUri = getHeader(response, <js>"X-JSA-AUTHORIZATION-REDIRECT"</js>);
+
+			<jk>if</jk> (redirectUri == <jk>null</jk>)
+				<jk>throw new</jk> RestCallException(<js>"Expected a redirect URI during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// Handle Bearer Challenge</jc>
+			HttpGet method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			String loginRequired = getHeader(response, <js>"X-JSA-LOGIN-REQUIRED"</js>);
+
+			<jk>if</jk> (! <js>"true"</js>.equals(loginRequired))
+				<jk>throw new</jk> RestCallException(<js>"X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+
+			addDefaultOidcHeaders(method);
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 3: "</js> + response.getStatusLine());
+
+			<jc>// Handle JAS Challenge</jc>
+			method = <jk>new</jk> HttpGet(redirectUri);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 4: "</js> + response.getStatusLine());
+
+			<jf>cookie</jf> = getHeader(response, <js>"Set-Cookie"</js>);
+
+			Header[] defaultHeaders = <jk>new</jk> Header[] {
+				<jk>new</jk> BasicHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>),
+				<jk>new</jk> BasicHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>),
+				<jk>new</jk> BasicHeader(<js>"Accept"</js>, <js>"text/json"</js>),
+				<jk>new</jk> BasicHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>)),
+				<jk>new</jk> BasicHeader(<js>"Cookie"</js>, cookie)
+	};
+
+			setDefaultHeaders(Arrays.<jsm>asList</jsm>(defaultHeaders));
+
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jk>private void</jk> addDefaultOidcHeaders(HttpRequestBase method) {
+		method.addHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>);
+		method.addHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>);
+		method.addHeader(<js>"Accept"</js>, <js>"text/json"</js>);
+
+		<jk>if</jk> (<jf>cookie</jf> != <jk>null</jk>) {
+			method.addHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>));
+			method.addHeader(<js>"Cookie"</js>, cookie);
+		}
+	}
+			</p>	
+		</div>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="ResponsePatterns"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - Using Response Patterns</h3>
+	<div class='topic'>
+		<p>
+			One issue with REST (and HTTP in general) is that the HTTP response code must be set as a header before the 
+			body of the request is sent.  This can be problematic when REST calls invoke long-running processes, pipes
+			the results through the connection, and then fails after an HTTP 200 has already been sent.
+		</p>
+		<p>
+			One common solution is to serialize some text at the end to indicate whether the long-running process succeeded (e.g. <js>"FAILED"</js> or <js>"SUCCEEDED"</js>).
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class has convenience methods for scanning the response without
+			interfering with the other methods used for retrieving output.  
+		</p>
+		<p>
+			The following example shows how the {@link com.ibm.juno.client.RestCall#successPattern(String)} method can be used
+			to look for a SUCCESS message in the output:
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.successPattern(<js>"SUCCESS"</js>)
+		.run();
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#failurePattern(String)} method does the opposite.  
+			It throws an exception if a failure message is detected.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.failurePattern(<js>"FAILURE|ERROR"</js>)
+		.run();
+		</p>
+		<p>
+			These convenience methods are specialized methods that use the {@link com.ibm.juno.client.RestCall#addResponsePattern(ResponsePattern)}
+				method which uses regular expression matching against the response body.
+			This method can be used to search for arbitrary patterns in the response body.
+		</p>
+		<p>
+			The following example shows how to use a response pattern finder to find and capture patterns for <js>"x=number"</js> and <js>"y=string"</js>
+				from a response body.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
+	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
+	
+	String responseText = restClient.doGet(<jsf>URL</jsf>)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
+				}
+			}
+		)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					yList.add(m.group(1));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
+				}
+			}
+		)
+		.getResponseAsString();
+		</p>
+		<p>
+			Using response patterns does not affect the functionality of any of the other methods
+			used to retrieve the response such as {@link com.ibm.juno.client.RestCall#getResponseAsString()} or {@link com.ibm.juno.client.RestCall#getResponse(Class)}.<br>
+			HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
+			use {@link com.ibm.juno.client.RestCall#getCapturedResponse()} since this method will not absorb the response for those other methods.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="#PipingOutput"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.4 - Piping Response Output</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestCall} class provides various convenience <code>pipeTo()</code> methods 
+			to pipe output to output streams and writers.
+		</p>
+		<p>
+			If you want to pipe output without any intermediate buffering, you can use the {@link com.ibm.juno.client.RestCall#byLines()} method.  
+			This will cause the output to be piped and flushed after every line.  
+			This can be useful if you want to display the results in real-time from a long running process producing
+				output on a REST call.
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Pipe output from REST call to System.out in real-time.</jc>
+	restClient.doPost(<jsf>URL</jsf>).byLines().pipeTo(<jk>new</jk> PrintWriter(System.<jk>out</jk>)).run();
+		</p>
+	</div>	
+	
+	<!-- ======================================================================================================== -->
+	<a id="Logging"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.5 - Logging</h3>
+	<div class='topic'>
+		<p>
+			Use the {@link com.ibm.juno.client.RestClient#logTo(Level,Logger)} and {@link com.ibm.juno.client.RestCall#logTo(Level,Logger)} methods
+			to log HTTP calls.
+			These methods will cause the HTTP request and response headers and body to be logged to the specified logger.  
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Log the HTTP request/response to the specified logger.</jc>
+	<jk>int</jk> rc = restClient.doGet(<jsf>URL</jsf>).logTo(<jsf>INFO</jsf>, getLogger()).run();
+		</p>
+		<p>
+			The method call is ignored if the logger level is below the specified level.
+		</p>
+		<p>
+			Customized logging can be handled by subclassing the {@link com.ibm.juno.client.RestCallLogger} class and using the 
+			{@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} method.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Interceptors"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.6 - Interceptors</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#addInterceptor(RestCallInterceptor)} and {@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} methods
+			can be used to intercept responses during specific connection lifecycle events.
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCallLogger} class is an example of an interceptor that uses the various lifecycle methods
+				to log HTTP requests.
+		</p>
+		<p class='bcode'>
+	<jd>/**
+	 * Specialized interceptor for logging calls to a log file.
+	 */</jd>
+	<jk>public class</jk> RestCallLogger <jk>extends</jk> RestCallInterceptor {
+	
+		<jk>private</jk> Level <jf>level</jf>;
+		<jk>private</jk> Logger <jf>log</jf>;
+	
+		<jd>/**
+		 * Constructor.
+		 *
+		 * <ja>@param</ja> level The log level to log messages at.
+		 * <ja>@param</ja> log The logger to log to.
+		 */</jd>
+		<jk>protected</jk> RestCallLogger(Level level, Logger log) {
+			<jk>this</jk>.<jf>level</jf> = level;
+			<jk>this</jk>.<jf>log</jf> = log;
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onInit(RestCall restCall) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				restCall.captureResponse();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onConnect(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jc>// Do nothing.</jc>
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onRetry(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				<jf>log</jf>.log(level, MessageFormat.<jsm>format</jsm>(<js>"Call to {0} returned {1}.  Will retry."</js>, req.getRequestLine().getUri(), statusCode)); 
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onClose(RestCall restCall) <jk>throws</jk> RestCallException {
+			<jk>try</jk> {
+				<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>)) {
+					String output = restCall.getCapturedResponse();
+					StringBuilder sb = <jk>new</jk> StringBuilder();
+					HttpUriRequest req = restCall.getRequest();
+					HttpResponse res = restCall.getResponse();
+					<jk>if</jk> (req != <jk>null</jk>) {
+						sb.append(<js>"\n=== HTTP Call =================================================================="</js>);
+	
+						sb.append(<js>"\n=== REQUEST ===\n"</js>).append(req);
+						sb.append(<js>"\n---request headers---"</js>);
+						<jk>for</jk> (Header h : req.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						<jk>if</jk> (req <jk>instanceof</jk> HttpEntityEnclosingRequestBase) {
+							sb.append(<js>"\n---request entity---"</js>);
+							HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
+							HttpEntity e = req2.getEntity();
+							<jk>if</jk> (e == <jk>null</jk>)
+								sb.append(<js>"\nEntity is null"</js>);
+							<jk>else</jk> {
+								<jk>if</jk> (e.getContentType() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentType());
+								<jk>if</jk> (e.getContentEncoding() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentEncoding());
+								<jk>if</jk> (e.isRepeatable()) {
+									<jk>try</jk> {
+										sb.append(<js>"\n---request content---\n"</js>).append(EntityUtils.<jsm>toString</jsm>(e));
+									} <jk>catch</jk> (Exception ex) {
+										<jk>throw new</jk> RuntimeException(ex);
+									}
+								}
+							}
+						}
+					}
+					<jk>if</jk> (res != <jk>null</jk>) {
+						sb.append(<js>"\n=== RESPONSE ===\n"</js>).append(res.getStatusLine());
+						sb.append(<js>"\n---response headers---"</js>);
+						<jk>for</jk> (Header h : res.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						sb.append(<js>"\n---response content---\n"</js>).append(output);
+						sb.append(<js>"\n=== END ========================================================================"</js>);
+					}
+					<jf>log</jf>.log(<jf>level</jf>, sb.toString());
+				}
+			} <jk>catch</jk> (IOException e) {
+				<jf>log</jf>.log(Level.<jsf>SEVERE</jsf>, e.getLocalizedMessage(), e);
+			}
+		}
+	}
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Remoteable"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.7 - Remotable Proxies</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the capability of calling methods on POJOs on a server through client-side proxy interfaces.
+			It offers a number of advantages over other similar remote proxy interfaces, such as being much simpler to 
+				use and allowing much more flexibility.
+		</p>
+		<p>
+			Proxy interfaces are retrieved using the {@link com.ibm.juno.client.RestClient#getRemoteableProxy(Class)} method.
+			The {@link com.ibm.juno.client.RestClient#setRemoteableServletUri(String)} method is used to specify the location
+				of the remoteable services servlet running on the server.
+			The remoteable servlet is a specialized subclass of {@link com.ibm.juno.server.RestServlet} that provides a full-blown
+				REST interface for calling interfaces remotely. 
+		</p>
+		<p>
+			In this example, we have the following interface defined that we want to call from the client side against
+				a POJO on the server side (i.e. a Remoteable Service)...
+		<p class='bcode'>
+	<jk>public interface</jk> IAddressBook {
+		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
+	}
+		</p>			
+		<p>
+			The client side code for invoking this method is shown below...
+		</p>
+		<p class='bcode'>
+	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setRemoteableServletUri(<js>"https://localhost:9080/juno/sample/remoteable"</js>);
+	
+	<jc>// Create a proxy interface.</jc>
+	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
+	
+	<jc>// Invoke a method on the server side and get the returned result.</jc>
+	Person p = ab.createPerson(
+		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
+			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
+			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
+	);
+		</p>
+		<p>
+			The requirements for a method to be callable through a remoteable service are:
+			<ul>
+				<li>The method must be public.
+				<li>The parameter and return types must be <a href='../../../../com/ibm/juno/core/package-summary.html#PojoCategories'><u>serializable and parsable</u></a>.
+			</ul>
+		</p>
+		<p>
+			One significant feature is that the remoteable services servlet is a full-blown REST interface.  
+			Therefore, in cases where the interface classes are not available on the client side,
+				the same method calls can be made through pure REST calls.  
+			This can also aid significantly in debugging since calls to the remoteable service
+				can be called directly from a browser with no code involved.
+		</p>
+		<p>
+			See {@link com.ibm.juno.server.remoteable} for more information.
+		</p> 
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Other"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.8 - Other Useful Methods</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setRootUrl(String)} method can be used to specify a root URL on 
+				all requests so that you don't have to use absolute paths on individual calls.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client with a root URL</jc>
+	RestClient rc = <jk>new</jk> RestClient().setRootUrl(<js>"http://localhost:9080/foobar"</js>);
+	String r = rc.doGet(<js>"/baz"</js>).getResponseAsString();  <jc>// Gets "http://localhost:9080/foobar/baz"</jc>
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setProperty(String,Object)} method can be used to set serializer
+			and parser properties.
+			For example, if you're parsing a response into POJOs and you want to ignore fields that aren't on the
+			POJOs, you can use the {@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties} property.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client that ignores unknown fields in the response</jc>
+	RestClient rc = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setProperty(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>);
+	MyPojo myPojo = rc.doGet(<jsf>URL</jsf>).getResponse(MyPojo.<jk>class</jk>);
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#setRetryable(int,long,RetryOn)} method can be used to automatically
+				retry requests on failures.
+			This can be particularly useful if you're attempting to connect to a REST resource that may be in
+				the process of still initializing.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest call that retries every 10 seconds for up to 30 minutes as long as a connection fails
+	// or a 400+ is received.</jc>
+	restClient.doGet(<jsf>URL</jsf>)
+		.setRetryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>)
+		.run();
+	</p>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/build.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/build.properties b/com.ibm.team.juno.client/build.properties
new file mode 100755
index 0000000..e6fbc0e
--- /dev/null
+++ b/com.ibm.team.juno.client/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# 
+# Licensed Materials - Property of IBM
+# (c) Copyright IBM Corporation 2014. All Rights Reserved.
+# 
+# Note to U.S. Government Users Restricted Rights:  
+# Use, duplication or disclosure restricted by GSA ADP Schedule 
+# Contract with IBM Corp. 
+#  
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+bin.excludes = **/doc-files/**
+nls_exclude=**/*.html

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/AllowAllRedirects.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/AllowAllRedirects.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/AllowAllRedirects.java
new file mode 100755
index 0000000..7f68ef0
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/AllowAllRedirects.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import org.apache.http.impl.client.*;
+
+/**
+ * Redirect strategy that allows for redirects on any request type, not just <code>GET</code> or <code>HEAD</code>.
+ * <p>
+ * Note:  This class is similar to <code>org.apache.http.impl.client.LaxRedirectStrategy</code>
+ * 	in Apache HttpClient 4.2, but also allows for redirects on <code>PUTs</code> and <code>DELETEs</code>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class AllowAllRedirects extends DefaultRedirectStrategy {
+
+   @Override /* DefaultRedirectStrategy */
+   protected boolean isRedirectable(final String method) {
+   	return true;
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/DateHeader.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/DateHeader.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/DateHeader.java
new file mode 100755
index 0000000..47247d5
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/DateHeader.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.util.*;
+
+import org.apache.http.client.utils.*;
+import org.apache.http.message.*;
+
+/**
+ * Convenience class for setting date headers in RFC2616 format.
+ * <p>
+ * Equivalent to the following code:
+ * <p class='bcode'>
+ * 	Header h = <jk>new</jk> Header(name, DateUtils.<jsm>formatDate</jsm>(value));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class DateHeader extends BasicHeader {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Creates a date request property in RFC2616 format.
+	 *
+	 * @param name The header name.
+	 * @param value The header value.
+	 */
+	public DateHeader(String name, Date value) {
+		super(name, DateUtils.formatDate(value));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/HttpMethod.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/HttpMethod.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/HttpMethod.java
new file mode 100755
index 0000000..773ada1
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/HttpMethod.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+/**
+ * Enumeration of HTTP methods.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum HttpMethod {
+
+	/** HTTP GET */
+	GET(false),
+
+	/** HTTP PUT */
+	PUT(true),
+
+	/** HTTP POST */
+	POST(true),
+
+	/** HTTP DELETE */
+	DELETE(false),
+
+	/** HTTP OPTIONS */
+	OPTIONS(false),
+
+	/** HTTP HEAD */
+	HEAD(false),
+
+	/** HTTP TRACE */
+	TRACE(false),
+
+	/** HTTP CONNECT */
+	CONNECT(false),
+
+	/** HTTP MOVE */
+	MOVE(false);
+
+	private boolean hasContent;
+
+	HttpMethod(boolean hasContent) {
+		this.hasContent = hasContent;
+	}
+
+	/**
+	 * Returns whether this HTTP method normally has content.
+	 *
+	 * @return <jk>true</jk> if this HTTP method normally has content.
+	 */
+	public boolean hasContent() {
+		return hasContent;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/NameValuePairs.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/NameValuePairs.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/NameValuePairs.java
new file mode 100755
index 0000000..9e6e65b
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/NameValuePairs.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+
+/**
+ * Convenience class for constructing instances of <code>List&lt;NameValuePair&gt;</code>
+ * 	for the {@link UrlEncodedFormEntity} class.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	NameValuePairs params = <jk>new</jk> NameValuePairs()
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"j_username"</js>, user))
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, pw));
+ * 	request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class NameValuePairs extends LinkedList<NameValuePair> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Appends the specified pair to the end of this list.
+	 *
+	 * @param pair The pair to append to this list.
+	 * @return This object (for method chaining).
+	 */
+	public NameValuePairs append(NameValuePair pair) {
+		super.add(pair);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/ResponsePattern.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/ResponsePattern.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/ResponsePattern.java
new file mode 100755
index 0000000..a10e939
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/ResponsePattern.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.util.regex.*;
+
+/**
+ * Used to find regular expression matches in REST responses made through {@link RestCall}.
+ * <p>
+ * Response patterns are applied to REST calls through the {@link RestCall#addResponsePattern(ResponsePattern)} method.
+ * <p>
+ * <h6 class='topic'>Example</h6>
+ * This example shows how to use a response pattern finder to find and capture patterns for <js>"x=number"</js> and <js>"y=string"</js>
+ * 	from a response body.
+ * <p>
+ * <p class='bcode'>
+ * 	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
+ * 	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
+ *
+ * 	restClient.doGet(<jsf>URL</jsf>)
+ * 		.addResponsePattern(
+ * 			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+ * 					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
+ * 				}
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+ * 					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
+ * 				}
+ * 			}
+ * 		)
+ * 		.addResponsePattern(
+ * 			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+ * 					yList.add(m.group(1));
+ * 				}
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+ * 					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
+ * 				}
+ * 			}
+ * 		)
+ * 		.run();
+ * </p>
+ * <p>
+ * <h5 class='notes'>Important Notes:</h5>
+ * <ol class='notes'>
+ * 	<li><p>
+ * 		Using response patterns does not affect the functionality of any of the other methods
+ * 		used to retrieve the response such as {@link RestCall#getResponseAsString()} or {@link RestCall#getResponse(Class)}.<br>
+ * 		HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
+ * 		use {@link RestCall#getCapturedResponse()} since this method will not absorb the response for those other methods.
+ * 	</p>
+ * 	<li><p>
+ * 		Response pattern methods are NOT executed if a REST exception occurs during the request.
+ * 	</p>
+ * 	<li><p>
+ * 		The {@link RestCall#successPattern(String)} and {@link RestCall#failurePattern(String)} methods use instances of
+ * 		this class to throw {@link RestCallException RestCallExceptions} when success patterns are not found or failure patterns
+ * 		are found.
+ * 	</p>
+ * 	<li><p>
+ * 		{@link ResponsePattern} objects are reusable and thread-safe.
+ * 	</p>
+ * </ol>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class ResponsePattern {
+
+	private Pattern pattern;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param pattern Regular expression pattern.
+	 */
+	public ResponsePattern(String pattern) {
+		this.pattern = Pattern.compile(pattern);
+	}
+
+	void match(RestCall rc) throws RestCallException {
+		try {
+			Matcher m = pattern.matcher(rc.getCapturedResponse());
+			boolean found = false;
+			while (m.find()) {
+				onMatch(rc, m);
+				found = true;
+			}
+			if (! found)
+				onNoMatch(rc);
+		} catch (IOException e) {
+			throw new RestCallException(e);
+		}
+	}
+
+	/**
+	 * Returns the pattern passed in through the constructor.
+	 *
+	 * @return The pattern passed in through the constructor.
+	 */
+	protected String getPattern() {
+		return pattern.pattern();
+	}
+
+	/**
+	 * Instances can override this method to handle when a regular expression pattern matches
+	 * 	on the output.
+	 * <p>
+	 * This method is called once for every pattern match that occurs in the response text.
+	 *
+	 * @param rc The {@link RestCall} that this pattern finder is being used on.
+	 * @param m The regular expression {@link Matcher}.  Can be used to retrieve group matches in the pattern.
+	 * @throws RestCallException Instances can throw an exception if a failure condition is detected.
+	 */
+	public void onMatch(RestCall rc, Matcher m) throws RestCallException {}
+
+	/**
+	 * Instances can override this method to handle when a regular expression pattern doesn't match on the output.
+	 *
+	 * @param rc The {@link RestCall} that this pattern finder is being used on.
+	 * @throws RestCallException Instances can throw an exception if a failure condition is detected.
+	 */
+	public void onNoMatch(RestCall rc) throws RestCallException {}
+}


[46/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/JazzRestClient.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/JazzRestClient.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/JazzRestClient.java
new file mode 100755
index 0000000..e578b0d
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/JazzRestClient.java
@@ -0,0 +1,392 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.jazz;
+
+import static org.apache.http.HttpStatus.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.auth.*;
+import org.apache.http.client.*;
+import org.apache.http.client.config.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.message.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.client.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Specialized {@link RestClient} for working with Jazz servers.
+ * <p>
+ * Provides support for BASIC, FORM, and OIDC authentication against Jazz servers and simple SSL certificate validation.
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client.jazz &gt; Jazz REST client API</a> for more information and code examples.
+ * </ul>
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class JazzRestClient extends RestClient {
+
+	private String user, pw;
+	private URI jazzUri;
+	private SSLOpts sslOpts;
+	private String cookie = null;
+
+	/**
+	 * Create a new client with no serializer or parser.
+	 *
+	 * @param jazzUrl The URL of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUrl, SSLOpts sslOpts, String user, String pw) throws IOException {
+		super();
+		this.user = user;
+		this.pw = pw;
+		if (! jazzUrl.endsWith("/"))
+			jazzUrl = jazzUrl + "/";
+		this.sslOpts = sslOpts;
+		jazzUri = URI.create(jazzUrl);
+	}
+
+	/**
+	 * Create a new client with no serializer or parser, and LAX SSL support.
+	 *
+	 * @param jazzUrl The URL of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @throws IOException
+	 */
+	public JazzRestClient(String jazzUrl, String user, String pw) throws IOException {
+		this(jazzUrl, SSLOpts.LAX, user, pw);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUri, SSLOpts sslOpts, String user, String pw, Serializer<?> s, Parser<?> p) throws IOException {
+		this(jazzUri, sslOpts, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances and LAX SSL support.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 */
+	public JazzRestClient(String jazzUri, String user, String pw, Serializer<?> s, Parser<?> p) throws IOException {
+		this(jazzUri, SSLOpts.LAX, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param sslOpts SSL options.
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public JazzRestClient(String jazzUri, SSLOpts sslOpts, String user, String pw, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException, IOException {
+		this(jazzUri, sslOpts, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes and LAX SSL support.
+	 *
+	 * @param jazzUri The URI of the Jazz server being connected to (e.g. <js>"https://localhost:9443/jazz"</js>)
+	 * @param user The Jazz username.
+	 * @param pw The Jazz password.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws IOException If a problem occurred trying to authenticate against the Jazz server.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public JazzRestClient(String jazzUri, String user, String pw, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException, IOException {
+		this(jazzUri, SSLOpts.LAX, user, pw);
+		setParser(p);
+		setSerializer(s);
+	}
+
+	@Override /* RestClient */
+	protected CloseableHttpClient createHttpClient() throws Exception {
+		try {
+			if (jazzUri.getScheme().equals("https"))
+				enableSSL(sslOpts);
+
+			httpClientBuilder.setConnectionManager(createConnectionManager());
+
+			setRedirectStrategy(new AllowAllRedirects());
+
+			// See wi 368181. The PublicSuffixDomainFilter uses a default PublicSuffixMatcher
+			// that rejects hostnames lacking a dot, such as "ccmserver", so needed
+			// cookies don't get put on outgoing requests.
+			// Here, we create a cookie spec registry with handlers that don't have a PublicSuffixMatcher.
+			if (! Boolean.getBoolean("com.ibm.team.repository.transport.client.useDefaultPublicSuffixMatcher")) { //$NON-NLS-1$
+				// use a lenient PublicSuffixDomainFilter
+				setDefaultCookieSpecRegistry(CookieSpecRegistries.createDefault(null));
+			}
+
+			// We want to use a fresh HttpClientBuilder since the default implementation
+			// uses an unshared PoolingConnectionManager, and if you close the client
+			// and create a new one, can cause a "java.lang.IllegalStateException: Connection pool shut down"
+			CloseableHttpClient client = httpClientBuilder.build();
+
+			// Tomcat will respond with SC_BAD_REQUEST (or SC_REQUEST_TIMEOUT?) when the
+			// j_security_check URL is visited before an authenticated URL has been visited.
+			visitAuthenticatedURL(client);
+
+			// Authenticate against the server.
+			String authMethod = determineAuthMethod(client);
+			if (authMethod.equals("FORM")) {
+				formBasedAuthenticate(client);
+				visitAuthenticatedURL(client);
+			} else if (authMethod.equals("BASIC")) {
+				AuthScope scope = new AuthScope(jazzUri.getHost(), jazzUri.getPort());
+				Credentials up = new UsernamePasswordCredentials(user, pw);
+				CredentialsProvider p = new BasicCredentialsProvider();
+				p.setCredentials(scope, up);
+				setDefaultCredentialsProvider(p);
+				client.close();
+				client = httpClientBuilder.build();
+			} else if (authMethod.equals("OIDC")) {
+				oidcAuthenticate(client);
+				client.close();
+				client = httpClientBuilder.build();
+			}
+
+			return client;
+		} catch (Exception e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@Override /* RestClient */
+	protected HttpClientBuilder createHttpClientBuilder() {
+		HttpClientBuilder b = super.createHttpClientBuilder();
+
+		// See wi 368181. The PublicSuffixDomainFilter uses a default PublicSuffixMatcher
+		// that rejects hostnames lacking a dot, such as "ccmserver", so needed
+		// cookies don't get put on outgoing requests.
+		// Here, we create a cookie spec registry with handlers that don't have a PublicSuffixMatcher.
+		if (! Boolean.getBoolean("com.ibm.team.repository.transport.client.useDefaultPublicSuffixMatcher"))
+			b.setDefaultCookieSpecRegistry(CookieSpecRegistries.createDefault(null));
+
+		return b;
+	}
+
+
+	/**
+	 * Performs form-based authentication against the Jazz server.
+	 */
+	private void formBasedAuthenticate(HttpClient client) throws IOException {
+
+		URI uri2 = jazzUri.resolve("j_security_check");
+		HttpPost request = new HttpPost(uri2);
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+		 // Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.
+		request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
+
+		NameValuePairs params = new NameValuePairs()
+			.append(new BasicNameValuePair("j_username", user))
+			.append(new BasicNameValuePair("j_password", pw));
+		request.setEntity(new UrlEncodedFormEntity(params));
+
+		HttpResponse response = client.execute(request);
+		try {
+			int rc = response.getStatusLine().getStatusCode();
+
+			Header authMsg = response.getFirstHeader("X-com-ibm-team-repository-web-auth-msg");
+			if (authMsg != null)
+				throw new IOException(authMsg.getValue());
+
+			// The form auth request should always respond with a 200 ok or 302 redirect code
+			if (rc == SC_MOVED_TEMPORARILY) {
+				if (response.getFirstHeader("Location").getValue().matches("^.*/auth/authfailed.*$"))
+					throw new IOException("Invalid credentials.");
+			} else if (rc != SC_OK) {
+				throw new IOException("Unexpected HTTP status: " + rc);
+			}
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	private void oidcAuthenticate(HttpClient client) throws IOException {
+
+		HttpGet request = new HttpGet(jazzUri);
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+
+		 // Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.
+		request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
+
+		HttpResponse response = client.execute(request);
+		try {
+			int code = response.getStatusLine().getStatusCode();
+
+			// Already authenticated
+			if (code == SC_OK)
+				return;
+
+			if (code != SC_UNAUTHORIZED)
+				throw new RestCallException("Unexpected response during OIDC authentication: " + response.getStatusLine());
+
+			//'x-jsa-authorization-redirect'
+			String redirectUri = getHeader(response, "X-JSA-AUTHORIZATION-REDIRECT");
+
+			if (redirectUri == null)
+				throw new RestCallException("Excpected a redirect URI during OIDC authentication: " + response.getStatusLine());
+
+			// Handle Bearer Challenge
+			HttpGet method = new HttpGet(redirectUri + "&prompt=none");
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 2: " + response.getStatusLine());
+
+			String loginRequired = getHeader(response, "X-JSA-LOGIN-REQUIRED");
+
+			if (! "true".equals(loginRequired))
+				throw new RestCallException("X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: " + response.getStatusLine());
+
+			method = new HttpGet(redirectUri + "&prompt=none");
+
+			addDefaultOidcHeaders(method);
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 3: " + response.getStatusLine());
+
+			// Handle JAS Challenge
+			method = new HttpGet(redirectUri);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			if (code != SC_OK)
+				throw new RestCallException("Unexpected response during OIDC authentication phase 4: " + response.getStatusLine());
+
+			cookie = getHeader(response, "Set-Cookie");
+
+			Header[] defaultHeaders = new Header[] {
+				new BasicHeader("User-Agent", "Jazz Native Client"),
+				new BasicHeader("X-com-ibm-team-configuration-versions", "com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"),
+				new BasicHeader("Accept", "text/json"),
+				new BasicHeader("Authorization", "Basic " + StringUtils.base64EncodeToString(this.user + ":" + this.pw)),
+				new BasicHeader("Cookie", cookie)
+			};
+
+			setDefaultHeaders(Arrays.asList(defaultHeaders));
+
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	/*
+	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
+	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
+	 * otherwise tomcat will not consider the session authenticated
+	 */
+	private int visitAuthenticatedURL(HttpClient httpClient) throws IOException {
+		HttpGet authenticatedURL = new HttpGet(jazzUri.resolve("authenticated/identity"));
+		HttpResponse response = httpClient.execute(authenticatedURL);
+		try {
+			return response.getStatusLine().getStatusCode();
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	/*
+	 * @return Returns "FORM" for form-based authenication, "BASIC" for basic auth, "OIDC" for OIDC.  Never <code>null</code>.
+	 */
+	private String determineAuthMethod(HttpClient client) throws IOException {
+
+		HttpGet request = new HttpGet(jazzUri.resolve("authenticated/identity"));
+		request.setConfig(RequestConfig.custom().setRedirectsEnabled(false).build());
+
+		// if the FORM_AUTH_URI path exists, then we know we are using FORM auth
+		HttpResponse response = client.execute(request);
+		try {				//'x-jsa-authorization-redirect'
+			Header redirectUri = response.getFirstHeader("X-JSA-AUTHORIZATION-REDIRECT");
+			if (redirectUri != null)
+				return "OIDC";
+
+			int rc = response.getStatusLine().getStatusCode();
+			// Tomcat and Jetty return a status code 200 if the server is using FORM auth
+			if (rc == SC_OK)
+				return "FORM";
+			else if (rc == SC_MOVED_TEMPORARILY && response.getFirstHeader("Location").getValue().matches("^.*(/auth/authrequired|/authenticated/identity).*$"))
+				return "FORM";
+			return "BASIC";
+
+		} finally {
+			EntityUtils.consume(response.getEntity());
+		}
+	}
+
+	private String getHeader(HttpResponse response, String key) {
+		Header h = response.getFirstHeader(key);
+		return (h == null ? null : h.getValue());
+	}
+
+	private void addDefaultOidcHeaders(HttpRequestBase method) {
+		method.addHeader("User-Agent", "Jazz Native Client");
+		method.addHeader("X-com-ibm-team-configuration-versions", "com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0");
+		method.addHeader("Accept", "text/json");
+
+		if (cookie != null) {
+			method.addHeader("Authorization", "Basic " + StringUtils.base64EncodeToString(user + ":" + pw));
+			method.addHeader("Cookie", cookie);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/package.html b/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/package.html
new file mode 100755
index 0000000..fce9248
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/jazz/package.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Jazz REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>Jazz REST client API</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Jazz REST client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides a default REST client implementation for working with Jazz servers. 
+		The client automatically detects and handles BASIC and FORM authentication and basic certificate authentication.
+	</p>
+	<p>
+		The following code shows the Jazz REST client being used for querying and creating server messages on 
+			a Jazz server.  The <code>ServerMessage</code> and <code>CreateServerMessage</code> classes
+			are nothing more than simple beans that get serialized over the connection and reconstituted on 
+			the server.
+	</p>
+	<p class='bcode'>
+	System.<jsf>out</jsf>.println(<js>"Adding sample messages"</js>);
+
+	DateFormat df = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
+	String url = <js>"https://localhost:9443/jazz"</js>;
+	String sms = url + <js>"/serverMessages"</js>;
+	CreateServerMessage m;
+	ServerMessage m2;
+	String s1;
+	ServerMessage[] messages;
+	
+	<jc>// Serializer for debug messages.</jc>
+	WriterSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Create clients to handle JSON and XML requests and responses.</jc>
+	RestClient jsonClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>)
+		.setSerializer(JsonSerializer.<jk>class</jk>)
+		.setParser(<jk>new</jk> JsonParser().addFilters(DateFilter.<jsf>ISO8601DTZ</jsf>.<jk>class</jk>));
+	
+	RestClient xmlClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>, XmlSerializer.<jk>class</jk>, XmlParser.<jk>class</jk>);
+	
+	<jc>// Delete any existing messages.</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	
+	<jk>for</jk> (ServerMessage message : messages) {
+		<jk>int</jk> rc = jsonClient
+			.doDelete(message.getUri())
+			.execute();
+		System.<jsf>out</jsf>.println(rc);	<jc>// Prints 200.</jc>
+	}
+	
+	<jc>// Create an active server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #1"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+	
+	<jc>// POST the message, get response as string.</jc>
+	s1 = jsonClient
+		.doPost(sms, m)
+		.getResponseAsString(); 
+	System.<jsf>out</jsf>.println(<js>"TEST1: response="</js> + s1);
+
+	<jc>// POST another message, get response as ServerMessage</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #2"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST2: response="</js> + serializer.serialize(m2));
+	
+	<jc>// Create a future server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST3: response="</js> + serializer.serialize(m2));
+	System.<jsf>out</jsf>.println(<js>"TEST3: id="</js> + m2.getItemId().getUuidValue());
+
+	<jc>// Create a future server message using XML on both request and response.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #4"</js>,
+		<js>"subTypeFoo"</js>,                                  
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	s1 = xmlClient
+		.doPost(sms, m)
+		.getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST4: response="</js> + s1);
+
+	<jc>// Get all the messages</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	System.<jsf>out</jsf>.println(<js>"TEST5: response="</js> + serializer.serialize(messages)); 
+
+	<jc>// Get the first ID</jc>
+	URI firstMessageUrl = messages[0].getUri();
+	
+	System.<jsf>out</jsf>.println(<js>"firstMessageUrl=["</js>+firstMessageUrl+<js>"]"</js>);
+	
+	<jc>// Get the Date of the first ID.</jc>
+	Date startDate = jsonClient
+		.doGet(firstMessageUrl + <js>"/startDate"</js>)
+		.getResponse(Date.<jk>class</jk>);  
+	System.<jsf>out</jsf>.println(<js>"TEST5: response.startDate="</js>+startDate);
+	
+	<jc>// Change the start and end dates on first message</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3 overwritten"</js>,
+		<js>"subTypeFooBar"</js>,
+		df.parse(<js>"2023-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2024-01-01T12:34:56EST"</js>));
+	s1 = jsonClient.doPut(firstMessageUrl, m).getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST6: response="</js>+s1);
+	</p>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/package.html b/com.ibm.team.juno.client/src/com/ibm/juno/client/package.html
new file mode 100755
index 0000000..407ef7c
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/package.html
@@ -0,0 +1,850 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>REST Client API</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#SSL'>SSL Support</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#SSLOpts'>SSLOpts Bean</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Authentication'>Authentication</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#BASIC'>BASIC Authentication</a></p>
+			<li><p><a class='doclink' href='#FORM'>FORM-based Authentication</a></p>
+			<li><p><a class='doclink' href='#OIDC'>OIDC Authentication</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#ResponsePatterns'>Using Response Patterns</a></p>
+		<li><p><a class='doclink' href='#PipingOutput'>Piping Response Output</a></p>
+		<li><p><a class='doclink' href='#Logging'>Logging</a></p>
+		<li><p><a class='doclink' href='#Interceptors'>Interceptors</a></p>
+		<li><p><a class='doclink' href='#Remoteable'>Remoteable Proxies</a></p>
+		<li><p><a class='doclink' href='#Other'>Other Useful Methods</a></p>
+	</ol>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - REST Client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides an HTTP client API that makes it extremely simple to connect to remote REST interfaces and 
+		seemlessly send and receive serialized POJOs in requests and responses.  
+	</p>
+	<h6 class='notes'>Features:</h6>
+	<ul class='notes'>
+		<li>Converts POJOs directly to HTTP request message bodies using {@link com.ibm.juno.core.serializer.Serializer} classes.
+	 	<li>Converts HTTP response message bodies directly to POJOs using {@link com.ibm.juno.core.parser.Parser} classes.
+		<li>Exposes the full functionality of the Apache HttpClient API by exposing all methods defined on the 
+			{@link org.apache.http.impl.client.HttpClientBuilder} class.
+		<li>Provides various convenience methods for setting up common SSL and authentication methods.
+		<li>Provides a fluent interface that allows you to make complex REST calls in a single line of code.
+	</ul>	
+	<p>
+		The client API is designed to work as a thin layer on top of the proven Apache HttpClient API.  
+		By leveraging the HttpClient library, details such as SSL certificate negotiation, proxies, encoding, etc...
+			are all handled in Apache code. 
+	</p>
+	<p>
+		The Juno client API prereq's Apache HttpClient 4.1.2+. 
+		At a mimimum, the following jars are required:
+	</p>
+	<ul>
+		<li><code>httpclient-4.5.jar</code>
+		<li><code>httpcore-4.4.1.jar</code>
+		<li><code>httpmime-4.5.jar</code>
+	</ul>
+	<h6 class='topic'>Examples</h6>
+	<p class='bcode'>
+	<jc>// Examples below use the Juno Address Book resource example</jc>
+
+	<jc>// Create a reusable client with JSON support</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+	
+	<jc>// GET request, ignoring output</jc>
+	<jk>try</jk> {
+		<jk>int</jk> rc = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>).execute();
+		<jc>// Succeeded!</jc>
+	} <jk>catch</jk> (RestCallException e) {
+		<jc>// Failed!</jc>
+		System.<jsf>err</jsf>.println(
+			String.<jsm>format</jsm>(<js>"status=%s, message=%s"</js>, e.getResponseStatus(), e.getResponseMessage())
+		);
+	}
+			
+	<jc>// Remaining examples ignore thrown exceptions.</jc>		
+			
+	<jc>// GET request, secure, ignoring output</jc>
+	client.doGet(<js>"https://localhost:9443/sample/addressBook"</js>).execute();
+			
+	<jc>// GET request, getting output as a String.  No POJO parsing is performed.
+	// Note that when calling one of the getX() methods, you don't need to call connect() or disconnect(), since
+	//	it's automatically called for you.</jc>
+	String output = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponseAsString();
+			
+	<jc>// GET request, getting output as a Reader</jc>
+	Reader r = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getReader();
+			
+	<jc>// GET request, getting output as an ObjectMap</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	ObjectMap m = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(ObjectMap.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a ObjectList</jc>
+	<jc>// Input must be an array (e.g. "[...]")</jc>
+	ObjectList l = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(ObjectList.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	<jc>// Note that you don't have to do any casting!</jc>
+	Person p = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(Person.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an array of objects (e.g. "[{...},{...}]")</jc>
+	Person[] pa = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(Person[].<jk>class</jk>);
+			
+	<jc>// Same as above, except as a List&lt;Person&gt;</jc>
+	ClassMeta cm = BeanContext.<jsf>DEFAULT</jsf>.getCollectionClassMeta(LinkedList.<jk>class</jk>, Person.<jk>class</jk>);
+	List&lt;Person&gt; pl = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(cm);
+			
+	<jc>// GET request, getting output as a parsed string</jc>
+	<jc>// Input must be a string (e.g. "&lt;string&gt;foo&lt;/string&gt;" or "'foo'")</jc>
+	String name = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/name"</js>)
+		.getResponse(String.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed number</jc>
+	<jc>// Input must be a number (e.g. "&lt;number&gt;123&lt;/number&gt;" or "123")</jc>
+	<jk>int</jk> age = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/age"</js>)
+		.getResponse(Integer.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed boolean</jc>
+	<jc>// Input must be a boolean (e.g. "&lt;boolean&gt;true&lt;/boolean&gt;" or "true")</jc>
+	<jk>boolean</jk> isCurrent = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/addresses/0/isCurrent"</js>)
+		.getResponse(Boolean.<jk>class</jk>);
+			
+	<jc>// GET request, getting a filtered object</jc>
+	client.getParser().addFilters(CalendarFilter.<jsf>ISO8601</jsf>.<jk>class</jk>);
+	Calendar birthDate = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>)
+		.getResponse(GregorianCalendar.<jk>class</jk>);
+
+	<jc>// PUT request on regular field</jc>
+	String newName = <js>"John Smith"</js>;
+	<jk>int</jk> rc = client.doPut(<js>"http://localhost:9080/addressBook/0/name"</js>, newName).execute();
+	
+	<jc>// PUT request on filtered field</jc>
+	Calendar newBirthDate = <jk>new</jk> GregorianCalendar(1, 2, 3, 4, 5, 6);
+	rc = client.doPut(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>, newBirthDate).execute();
+	
+	<jc>// POST of a new entry to a list</jc>
+	Address newAddress = <jk>new</jk> Address(<js>"101 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12121, <jk>false</jk>);
+	rc = client.doPost(<js>"http://localhost:9080/addressBook/0/addresses"</js>, newAddress).execute();	
+	</p>
+	
+	<h6 class='notes'>Notes:</h6>
+	<ul class='notes'>
+		<li><p>The {@link com.ibm.juno.client.RestClient} class exposes all the builder methods on the Apache HttpClient {@link org.apache.http.impl.client.HttpClientBuilder} class.
+			Use these methods to provide any customized HTTP client behavior..</p>
+	</ul>
+	
+	<!-- ======================================================================================================== -->
+	<a id="SSL"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - SSL Support</h3>
+	<div class='topic'>
+		<p>
+			The simplest way to enable SSL support in the client is to use the {@link com.ibm.juno.client.RestClient#enableSSL(SSLOpts)} method
+			and one of the predefined {@link com.ibm.juno.client.SSLOpts} instances:
+			<ul>
+				<li>{@link com.ibm.juno.client.SSLOpts#DEFAULT} - Normal certificate and hostname validation.
+				<li>{@link com.ibm.juno.client.SSLOpts#LAX} - Allows for self-signed certificates.
+			</ul>
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableSSL(SSLOpts.<jsf>LAX</jsf>);
+		
+	<jc>// ...or...</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableLaxSSL();
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	
+	HostnameVerifier hv = <jk>new</jk> NoopHostnameVerifier();
+	TrustManager tm = <jk>new</jk> SimpleX509TrustManager(<jk>true</jk>);
+
+	<jk>for</jk> (String p : <jk>new</jk> String[]{<js>"SSL"</js>,<js>"TLS"</js>,<js>"SSL_TLS"</js>}) {
+		SSLContext ctx = SSLContext.<jsm>getInstance</jsm>(p);
+		ctx.init(<jk>null</jk>, <jk>new</jk> TrustManager[] { tm }, <jk>null</jk>);
+		SSLConnectionSocketFactory sf = <jk>new</jk> SSLConnectionSocketFactory(ctx, hv);
+		restClient.setSSLSocketFactory(sf);
+		Registry&lt;ConnectionSocketFactory&gt; r = RegistryBuilder.&lt;ConnectionSocketFactory&gt;<jsm>.create</jsm>().register(<js>"https"</js>, sf).build();
+		restClient.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r));
+	}
+		</p>
+		<p>
+			More complex SSL support can be enabled through the various {@link org.apache.http.impl.client.HttpClientBuilder} methods defined on the class.
+		</p>
+		
+		<!-- ======================================================================================================== -->
+		<a id="SSLOpts"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.1 - SSLOpts Bean</h4>
+		<div class='topic'>
+	<p>
+				The {@link com.ibm.juno.client.SSLOpts} class itself is a bean that can be created by the parsers.
+				For example, SSL options can be specified in a config file and retrieved as a bean using the {@link com.ibm.juno.core.ini.ConfigFile} class.
+	</p>
+			<h6 class='figure'>Contents of <code>MyConfig.cfg</code></h6>
+			<p class='bcode'>
+		<jc>#================================================================================
+		# My Connection Settings
+		#================================================================================</jc>
+		[Connection]
+		url = https://myremotehost:9443
+		ssl = {certValidate:'LAX',hostVerify:'LAX'}
+			</p>
+			<h6 class='figure'>Code that reads an <code>SSLOpts</code> bean from the config file</h6>
+			<p class='bcode'>
+		<jc>// Read config file and set SSL options based on what's in that file.</jc>
+		ConfigFile cf = ConfigMgr.<jsf>DEFAULT</jsf>.get(<js>"MyConfig.cfg"</js>);
+		SSLOpts ssl = cf.getObject(SSLOpts.<jk>class</jk>, <js>"Connection/ssl"</js>);
+		RestClient rc = <jk>new</jk> RestClient().enableSSL(ssl);
+			</p>
+		</div>
+	</div>	
+
+	<!-- ======================================================================================================== -->
+	<a id="Authentication"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - Authentication</h3>
+	<div class='topic'>
+
+		<!-- ======================================================================================================== -->
+		<a id="BASIC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.1 - BASIC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient#setBasicAuth(String,int,String,String)} method can be used to quickly enable
+				BASIC authentication support.
+			</p>
+			<h6 class='topic'>Example:</h6>
+			<p class='bcode'>
+	<jc>// Create a client that performs BASIC authentication using the specified user/pw.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.setBasicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>);
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	AuthScope scope = <jk>new</jk> AuthScope(<jsf>HOST</jsf>, <jsf>PORT</jsf>);
+	Credentials up = <jk>new</jk> UsernamePasswordCredentials(<jsf>USER</jsf>, <jsf>PW</jsf>);
+	CredentialsProvider p = <jk>new</jk> BasicCredentialsProvider();
+	p.setCredentials(scope, up);
+	restClient.setDefaultCredentialsProvider(p);
+			</p>
+		</div>
+	
+		<!-- ======================================================================================================== -->
+		<a id="FORM"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.2 - FORM-based Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient} class does not itself provide FORM-based authentication since there
+				is no standard way of providing such support. 
+				Typically, to perform FORM-based or other types of authentication, you'll want to create your own
+				subclass of {@link com.ibm.juno.client.RestClient} and override the {@link com.ibm.juno.client.RestClient#createHttpClient()}
+				method to provide an authenticated client.
+			</p>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				FORM-based authentication support.
+			</p>
+			<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		formBasedAuthenticate(client);
+		visitAuthenticatedURL(client);
+		<jk>return</jk> client;
+	}
+
+	<jc>/*
+	 * Performs form-based authentication against the Jazz server.
+	 */</jc>
+	<jk>private void</jk> formBasedAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		URI uri2 = <jf>jazzUri</jf>.resolve(<js>"j_security_check"</js>);
+		HttpPost request = <jk>new</jk> HttpPost(uri2);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		NameValuePairs params = <jk>new</jk> NameValuePairs()
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_username""</js>, <jf>user</jf>))
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, <jf>pw</jf>));
+		request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> rc = response.getStatusLine().getStatusCode();
+
+			Header authMsg = response.getFirstHeader(<js>"X-com-ibm-team-repository-web-auth-msg"</js>);
+			<jk>if</jk> (authMsg != <jk>null</jk>)
+				<jk>throw new</jk> IOException(authMsg.getValue());
+
+			<jc>// The form auth request should always respond with a 200 ok or 302 redirect code</jc>
+			<jk>if</jk> (rc == <jsf>SC_MOVED_TEMPORARILY</jsf>) {
+				<jk>if</jk> (response.getFirstHeader(<js>"Location"</js>).getValue().matches(<js>"^.*/auth/authfailed.*$"</js>))
+					<jk>throw new</jk> IOException(<js>"Invalid credentials."</js>);
+			} <jk>else if</jk> (rc != <jsf>SC_OK</jsf>) {
+				<jk>throw new</jk> IOException(<js>"Unexpected HTTP status: "</js> + rc);
+			}
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jc>/*
+	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
+	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
+	 * otherwise tomcat will not consider the session authenticated
+	 */</jc>
+	<jk>private int</jk> visitAuthenticatedURL(HttpClient httpClient) <jk>throws</jk> IOException {
+		HttpGet authenticatedURL = <jk>new</jk> HttpGet(<jf>jazzUri</jf>.resolve(<js>"authenticated/identity"</js>));
+		HttpResponse response = httpClient.execute(authenticatedURL);
+		<jk>try</jk> {
+			<jk>return</jk> response.getStatusLine().getStatusCode();
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+			</p>
+		</div>
+		
+		<!-- ======================================================================================================== -->
+		<a id="OIDC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.3 - OIDC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				OIDC authentication support.
+			</p>
+	<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		oidcAuthenticate(client);
+			<jk>return</jk> client;
+		}
+
+	<jk>private void</jk> oidcAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		HttpGet request = <jk>new</jk> HttpGet(<jf>jazzUri</jf>);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> code = response.getStatusLine().getStatusCode();
+
+			<jc>// Already authenticated</jc>
+			<jk>if</jk> (code == <jsf>SC_OK</jsf>)
+				<jk>return</jk>;
+
+			<jk>if</jk> (code != <jsf>SC_UNAUTHORIZED</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// x-jsa-authorization-redirect</jc>
+			String redirectUri = getHeader(response, <js>"X-JSA-AUTHORIZATION-REDIRECT"</js>);
+
+			<jk>if</jk> (redirectUri == <jk>null</jk>)
+				<jk>throw new</jk> RestCallException(<js>"Expected a redirect URI during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// Handle Bearer Challenge</jc>
+			HttpGet method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			String loginRequired = getHeader(response, <js>"X-JSA-LOGIN-REQUIRED"</js>);
+
+			<jk>if</jk> (! <js>"true"</js>.equals(loginRequired))
+				<jk>throw new</jk> RestCallException(<js>"X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+
+			addDefaultOidcHeaders(method);
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 3: "</js> + response.getStatusLine());
+
+			<jc>// Handle JAS Challenge</jc>
+			method = <jk>new</jk> HttpGet(redirectUri);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 4: "</js> + response.getStatusLine());
+
+			<jf>cookie</jf> = getHeader(response, <js>"Set-Cookie"</js>);
+
+			Header[] defaultHeaders = <jk>new</jk> Header[] {
+				<jk>new</jk> BasicHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>),
+				<jk>new</jk> BasicHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>),
+				<jk>new</jk> BasicHeader(<js>"Accept"</js>, <js>"text/json"</js>),
+				<jk>new</jk> BasicHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>)),
+				<jk>new</jk> BasicHeader(<js>"Cookie"</js>, cookie)
+	};
+
+			setDefaultHeaders(Arrays.<jsm>asList</jsm>(defaultHeaders));
+
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jk>private void</jk> addDefaultOidcHeaders(HttpRequestBase method) {
+		method.addHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>);
+		method.addHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>);
+		method.addHeader(<js>"Accept"</js>, <js>"text/json"</js>);
+
+		<jk>if</jk> (<jf>cookie</jf> != <jk>null</jk>) {
+			method.addHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>));
+			method.addHeader(<js>"Cookie"</js>, cookie);
+		}
+	}
+			</p>	
+		</div>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="ResponsePatterns"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - Using Response Patterns</h3>
+	<div class='topic'>
+		<p>
+			One issue with REST (and HTTP in general) is that the HTTP response code must be set as a header before the 
+			body of the request is sent.  This can be problematic when REST calls invoke long-running processes, pipes
+			the results through the connection, and then fails after an HTTP 200 has already been sent.
+		</p>
+		<p>
+			One common solution is to serialize some text at the end to indicate whether the long-running process succeeded (e.g. <js>"FAILED"</js> or <js>"SUCCEEDED"</js>).
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class has convenience methods for scanning the response without
+			interfering with the other methods used for retrieving output.  
+		</p>
+		<p>
+			The following example shows how the {@link com.ibm.juno.client.RestCall#successPattern(String)} method can be used
+			to look for a SUCCESS message in the output:
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.successPattern(<js>"SUCCESS"</js>)
+		.run();
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#failurePattern(String)} method does the opposite.  
+			It throws an exception if a failure message is detected.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.failurePattern(<js>"FAILURE|ERROR"</js>)
+		.run();
+		</p>
+		<p>
+			These convenience methods are specialized methods that use the {@link com.ibm.juno.client.RestCall#addResponsePattern(ResponsePattern)}
+				method which uses regular expression matching against the response body.
+			This method can be used to search for arbitrary patterns in the response body.
+		</p>
+		<p>
+			The following example shows how to use a response pattern finder to find and capture patterns for <js>"x=number"</js> and <js>"y=string"</js>
+				from a response body.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
+	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
+	
+	String responseText = restClient.doGet(<jsf>URL</jsf>)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
+				}
+			}
+		)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					yList.add(m.group(1));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
+				}
+			}
+		)
+		.getResponseAsString();
+		</p>
+		<p>
+			Using response patterns does not affect the functionality of any of the other methods
+			used to retrieve the response such as {@link com.ibm.juno.client.RestCall#getResponseAsString()} or {@link com.ibm.juno.client.RestCall#getResponse(Class)}.<br>
+			HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
+			use {@link com.ibm.juno.client.RestCall#getCapturedResponse()} since this method will not absorb the response for those other methods.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="#PipingOutput"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.4 - Piping Response Output</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestCall} class provides various convenience <code>pipeTo()</code> methods 
+			to pipe output to output streams and writers.
+		</p>
+		<p>
+			If you want to pipe output without any intermediate buffering, you can use the {@link com.ibm.juno.client.RestCall#byLines()} method.  
+			This will cause the output to be piped and flushed after every line.  
+			This can be useful if you want to display the results in real-time from a long running process producing
+				output on a REST call.
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Pipe output from REST call to System.out in real-time.</jc>
+	restClient.doPost(<jsf>URL</jsf>).byLines().pipeTo(<jk>new</jk> PrintWriter(System.<jk>out</jk>)).run();
+		</p>
+	</div>	
+	
+	<!-- ======================================================================================================== -->
+	<a id="Logging"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.5 - Logging</h3>
+	<div class='topic'>
+		<p>
+			Use the {@link com.ibm.juno.client.RestClient#logTo(Level,Logger)} and {@link com.ibm.juno.client.RestCall#logTo(Level,Logger)} methods
+			to log HTTP calls.
+			These methods will cause the HTTP request and response headers and body to be logged to the specified logger.  
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Log the HTTP request/response to the specified logger.</jc>
+	<jk>int</jk> rc = restClient.doGet(<jsf>URL</jsf>).logTo(<jsf>INFO</jsf>, getLogger()).run();
+		</p>
+		<p>
+			The method call is ignored if the logger level is below the specified level.
+		</p>
+		<p>
+			Customized logging can be handled by subclassing the {@link com.ibm.juno.client.RestCallLogger} class and using the 
+			{@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} method.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Interceptors"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.6 - Interceptors</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#addInterceptor(RestCallInterceptor)} and {@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} methods
+			can be used to intercept responses during specific connection lifecycle events.
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCallLogger} class is an example of an interceptor that uses the various lifecycle methods
+				to log HTTP requests.
+		</p>
+		<p class='bcode'>
+	<jd>/**
+	 * Specialized interceptor for logging calls to a log file.
+	 */</jd>
+	<jk>public class</jk> RestCallLogger <jk>extends</jk> RestCallInterceptor {
+	
+		<jk>private</jk> Level <jf>level</jf>;
+		<jk>private</jk> Logger <jf>log</jf>;
+	
+		<jd>/**
+		 * Constructor.
+		 *
+		 * <ja>@param</ja> level The log level to log messages at.
+		 * <ja>@param</ja> log The logger to log to.
+		 */</jd>
+		<jk>protected</jk> RestCallLogger(Level level, Logger log) {
+			<jk>this</jk>.<jf>level</jf> = level;
+			<jk>this</jk>.<jf>log</jf> = log;
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onInit(RestCall restCall) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				restCall.captureResponse();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onConnect(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jc>// Do nothing.</jc>
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onRetry(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				<jf>log</jf>.log(level, MessageFormat.<jsm>format</jsm>(<js>"Call to {0} returned {1}.  Will retry."</js>, req.getRequestLine().getUri(), statusCode)); 
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onClose(RestCall restCall) <jk>throws</jk> RestCallException {
+			<jk>try</jk> {
+				<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>)) {
+					String output = restCall.getCapturedResponse();
+					StringBuilder sb = <jk>new</jk> StringBuilder();
+					HttpUriRequest req = restCall.getRequest();
+					HttpResponse res = restCall.getResponse();
+					<jk>if</jk> (req != <jk>null</jk>) {
+						sb.append(<js>"\n=== HTTP Call =================================================================="</js>);
+	
+						sb.append(<js>"\n=== REQUEST ===\n"</js>).append(req);
+						sb.append(<js>"\n---request headers---"</js>);
+						<jk>for</jk> (Header h : req.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						<jk>if</jk> (req <jk>instanceof</jk> HttpEntityEnclosingRequestBase) {
+							sb.append(<js>"\n---request entity---"</js>);
+							HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
+							HttpEntity e = req2.getEntity();
+							<jk>if</jk> (e == <jk>null</jk>)
+								sb.append(<js>"\nEntity is null"</js>);
+							<jk>else</jk> {
+								<jk>if</jk> (e.getContentType() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentType());
+								<jk>if</jk> (e.getContentEncoding() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentEncoding());
+								<jk>if</jk> (e.isRepeatable()) {
+									<jk>try</jk> {
+										sb.append(<js>"\n---request content---\n"</js>).append(EntityUtils.<jsm>toString</jsm>(e));
+									} <jk>catch</jk> (Exception ex) {
+										<jk>throw new</jk> RuntimeException(ex);
+									}
+								}
+							}
+						}
+					}
+					<jk>if</jk> (res != <jk>null</jk>) {
+						sb.append(<js>"\n=== RESPONSE ===\n"</js>).append(res.getStatusLine());
+						sb.append(<js>"\n---response headers---"</js>);
+						<jk>for</jk> (Header h : res.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						sb.append(<js>"\n---response content---\n"</js>).append(output);
+						sb.append(<js>"\n=== END ========================================================================"</js>);
+					}
+					<jf>log</jf>.log(<jf>level</jf>, sb.toString());
+				}
+			} <jk>catch</jk> (IOException e) {
+				<jf>log</jf>.log(Level.<jsf>SEVERE</jsf>, e.getLocalizedMessage(), e);
+			}
+		}
+	}
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Remoteable"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.7 - Remotable Proxies</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the capability of calling methods on POJOs on a server through client-side proxy interfaces.
+			It offers a number of advantages over other similar remote proxy interfaces, such as being much simpler to 
+				use and allowing much more flexibility.
+		</p>
+		<p>
+			Proxy interfaces are retrieved using the {@link com.ibm.juno.client.RestClient#getRemoteableProxy(Class)} method.
+			The {@link com.ibm.juno.client.RestClient#setRemoteableServletUri(String)} method is used to specify the location
+				of the remoteable services servlet running on the server.
+			The remoteable servlet is a specialized subclass of {@link com.ibm.juno.server.RestServlet} that provides a full-blown
+				REST interface for calling interfaces remotely. 
+		</p>
+		<p>
+			In this example, we have the following interface defined that we want to call from the client side against
+				a POJO on the server side (i.e. a Remoteable Service)...
+		<p class='bcode'>
+	<jk>public interface</jk> IAddressBook {
+		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
+	}
+		</p>			
+		<p>
+			The client side code for invoking this method is shown below...
+		</p>
+		<p class='bcode'>
+	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setRemoteableServletUri(<js>"https://localhost:9080/juno/sample/remoteable"</js>);
+	
+	<jc>// Create a proxy interface.</jc>
+	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
+	
+	<jc>// Invoke a method on the server side and get the returned result.</jc>
+	Person p = ab.createPerson(
+		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
+			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
+			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
+	);
+		</p>
+		<p>
+			The requirements for a method to be callable through a remoteable service are:
+			<ul>
+				<li>The method must be public.
+				<li>The parameter and return types must be <a href='../../../../com/ibm/juno/core/package-summary.html#PojoCategories'><u>serializable and parsable</u></a>.
+			</ul>
+		</p>
+		<p>
+			One significant feature is that the remoteable services servlet is a full-blown REST interface.  
+			Therefore, in cases where the interface classes are not available on the client side,
+				the same method calls can be made through pure REST calls.  
+			This can also aid significantly in debugging since calls to the remoteable service
+				can be called directly from a browser with no code involved.
+		</p>
+		<p>
+			See {@link com.ibm.juno.server.remoteable} for more information.
+		</p> 
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Other"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.8 - Other Useful Methods</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setRootUrl(String)} method can be used to specify a root URL on 
+				all requests so that you don't have to use absolute paths on individual calls.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client with a root URL</jc>
+	RestClient rc = <jk>new</jk> RestClient().setRootUrl(<js>"http://localhost:9080/foobar"</js>);
+	String r = rc.doGet(<js>"/baz"</js>).getResponseAsString();  <jc>// Gets "http://localhost:9080/foobar/baz"</jc>
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setProperty(String,Object)} method can be used to set serializer
+			and parser properties.
+			For example, if you're parsing a response into POJOs and you want to ignore fields that aren't on the
+			POJOs, you can use the {@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties} property.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client that ignores unknown fields in the response</jc>
+	RestClient rc = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setProperty(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>);
+	MyPojo myPojo = rc.doGet(<jsf>URL</jsf>).getResponse(MyPojo.<jk>class</jk>);
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#setRetryable(int,long,RetryOn)} method can be used to automatically
+				retry requests on failures.
+			This can be particularly useful if you're attempting to connect to a REST resource that may be in
+				the process of still initializing.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest call that retries every 10 seconds for up to 30 minutes as long as a connection fails
+	// or a 400+ is received.</jc>
+	restClient.doGet(<jsf>URL</jsf>)
+		.setRetryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>)
+		.run();
+	</p>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/.classpath
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/.classpath b/com.ibm.team.juno.microservice.template/.classpath
new file mode 100755
index 0000000..e506ff2
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/com.ibm.team.juno"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/com.ibm.team.juno.client"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/com.ibm.team.juno.microservice"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/com.ibm.team.juno.server"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/.project
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/.project b/com.ibm.team.juno.microservice.template/.project
new file mode 100755
index 0000000..bd71c23
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.ibm.team.juno.microservice.template</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/.settings/org.eclipse.jdt.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/.settings/org.eclipse.jdt.core.prefs b/com.ibm.team.juno.microservice.template/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..54e493c
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/META-INF/MANIFEST.MF b/com.ibm.team.juno.microservice.template/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..1e8d419
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Main-Class: com.ibm.juno.microservice.RestMicroservice
+Rest-Resources: 
+ com.ibm.juno.microservice.sample.RootResources
+Main-ConfigFile: microservice.cfg
+Class-Path: 
+ lib/commons-codec-1.9.jar 
+ lib/commons-io-1.2.jar 
+ lib/commons-logging-1.1.1.jar 
+ lib/httpclient-4.5.jar 
+ lib/httpcore-4.4.1.jar 
+ lib/httpmime-4.5.jar 
+ lib/javax.servlet-api-3.0.jar 
+ lib/jetty-all-8.1.0.jar 
+ lib/juno-all-5.2.jar 
+ lib/org.apache.commons.fileupload_1.3.1.jar
+
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/HelloWorldResource.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/HelloWorldResource.class b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/HelloWorldResource.class
new file mode 100644
index 0000000..458fd52
Binary files /dev/null and b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/HelloWorldResource.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/RootResources.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/RootResources.class b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/RootResources.class
new file mode 100644
index 0000000..ef2ac44
Binary files /dev/null and b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/RootResources.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/nls/Messages.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/nls/Messages.properties b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/nls/Messages.properties
new file mode 100755
index 0000000..62b3f1a
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/bin/com/ibm/juno/microservice/sample/nls/Messages.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Licensed Materials - Property of IBM
+# (c) Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+# 
+# Note to U.S. Government Users Restricted Rights:  
+# Use, duplication or disclosure restricted by GSA ADP Schedule 
+# Contract with IBM Corp. 
+###############################################################################
+
+#--------------------------------------------------------------------------------
+# RootResources
+#--------------------------------------------------------------------------------
+RootResources.label = Juno Microservice Template
+RootResources.description = Template for creating REST microservices

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/microservice.cfg
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/microservice.cfg b/com.ibm.team.juno.microservice.template/microservice.cfg
new file mode 100755
index 0000000..95094ed
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/microservice.cfg
@@ -0,0 +1,196 @@
+#================================================================================
+# Basic configuration file for SaaS microservices
+# Subprojects can use this as a starting point.
+#================================================================================
+
+#================================================================================
+# Services
+#================================================================================
+[Services]
+REST = com.ibm.juno.microservice.rest.RestApplication
+
+#================================================================================
+# REST settings
+#================================================================================
+[REST]
+
+# The HTTP port number to use.
+# Default is Rest-Port setting in manifest file, or 8000.
+port = 10000
+
+# A JSON map of servlet paths to servlet classes.
+# Example:  
+# 	resourceMap = {'/*':'com.ibm.MyServlet'}
+# Either resourceMap or resources must be specified if it's not defined in
+# 	the manifest file.
+resourceMap = 
+
+# A comma-delimited list of names of classes that extend from Servlet.
+# Resource paths are pulled from @RestResource.path() annotation, or
+# 	"/*" if annotation not specified.
+# Example:  
+# 	resources = com.ibm.MyServlet
+# Default is Rest-Resources in manifest file.
+# Either resourceMap or resources must be specified if it's not defined in
+# 	the manifest file.
+resources = 
+
+# The context root of the Jetty server.
+# Default is Rest-ContextPath in manifest file, or "/".
+contextPath = 
+
+# Authentication:  NONE, BASIC.
+# Default is Rest-AuthType in manifest file, or NONE.
+authType = NONE
+
+# The BASIC auth username.
+# Default is Rest-LoginUser in manifest file.
+loginUser = 
+
+# The BASIC auth password.
+# Default is Rest-LoginPassword in manifest file.
+loginPassword = 
+
+# The BASIC auth realm.
+# Default is Rest-AuthRealm in manifest file.
+authRealm = 
+
+# Stylesheet to use for HTML views.
+# The default options are:
+#  - styles/juno.css
+#  - styles/devops.css
+# Other stylesheets can be referenced relative to the servlet package or working
+# 	directory.
+stylesheet = styles/devops.css
+
+# What to do when the config file is saved.
+# Possible values:
+# 	NOTHING - Don't do anything. (default)
+#	RESTART_SERVER - Restart the Jetty server.
+#	RESTART_SERVICE - Shutdown and exit with code '3'.
+saveConfigAction = RESTART_SERVER
+
+# Enable SSL support.
+# Default is false.
+useSsl = false
+
+#================================================================================
+# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
+#--------------------------------------------------------------------------------
+# Ignored if REST/useSsl is false.
+# Specify any of the following fields:
+# 	allowRenegotiate (boolean)
+# 	certAlias (String)
+# 	crlPath (String)
+# 	enableCRLDP (boolean)
+# 	enableOCSP (boolean)
+# 	excludeCipherSuites (String[]) 
+# 	excludeProtocols (String[])
+# 	includeCipherSuites (String[])
+# 	includeProtocols (String...)
+# 	keyManagerPassword (String)
+# 	keyStore (String)
+# 	keyStorePassword (String)
+# 	keyStorePath (String)
+# 	keyStoreProvider (String)
+# 	keyStoreType (String)
+# 	maxCertPathLength (int)
+# 	needClientAuth (boolean)
+# 	ocspResponderURL (String)
+# 	protocol (String)
+# 	provider (String)
+# 	secureRandomAlgorithm (String)
+# 	sessionCachingEnabled (boolean) 
+# 	sslKeyManagerFactoryAlgorithm (String)
+# 	sslSessionCacheSize (int)
+# 	sslSessionTimeout (int)
+# 	trustAll (boolean)
+# 	trustManagerFactoryAlgorithm (String)
+# 	trustStore (String)
+# 	trustStorePassword (String)
+# 	trustStoreProvider (String)
+# 	trustStoreType (String)
+# 	validateCerts (boolean)
+# 	validatePeerCerts (boolean)
+# 	wantClientAuth (boolean)			
+#================================================================================
+[REST-SslContextFactory]
+keyStorePath = client_keystore.jks
+keyStorePassword* = {HRAaRQoT}
+excludeCipherSuites = TLS_DHE.*, TLS_EDH.*
+excludeProtocols = SSLv3
+allowRenegotiate = false
+
+#================================================================================
+# Logger settings
+# See FileHandler Java class for details.
+#================================================================================
+[Logging]
+
+# The directory where to create the log file.
+# Default is "."
+logDir = logs
+
+# The name of the log file to create for the main logger.
+# The logDir and logFile make up the pattern that's passed to the FileHandler
+# constructor.
+# If value is not specified, then logging to a file will not be set up.
+logFile = microservice.%g.log
+
+# Whether to append to the existing log file or create a new one.
+# Default is false.
+append = 
+
+# The SimpleDateFormat format to use for dates.
+# Default is "yyyy.MM.dd hh:mm:ss".
+dateFormat = 
+
+# The log message format.
+# The value can contain any of the following variables:
+# 	{date} - The date, formatted per dateFormat.
+#	{class} - The class name.
+#	{method} - The method name.
+#	{logger} - The logger name.
+#	{level} - The log level name.
+#	{msg} - The log message.
+#	{threadid} - The thread ID.
+#	{exception} - The localized exception message.
+# Default is "[{date} {level}] {msg}%n".
+format =
+
+# The maximum log file size.
+# Suffixes available for numbers.
+# See ConfigFile.getInt(String,int) for details.
+# Default is 1M.
+limit = 10M
+
+# Max number of log files.
+# Default is 1.
+count = 5
+
+# Default log levels.
+# Keys are logger names.
+# Values are serialized Level POJOs.
+levels = { com.ibm.juno:'INFO' }
+
+# Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
+# Useful for preventing log files from filling up with duplicate stack traces.
+# Default is false.
+useStackTraceHashes = true
+
+# The default level for the console logger.
+# Default is WARNING.
+consoleLevel = 
+
+#================================================================================
+# System properties
+#--------------------------------------------------------------------------------
+# These are arbitrary system properties that are set during startup.
+#================================================================================
+[SystemProperties]
+
+# Configure Jetty for StdErrLog Logging
+org.eclipse.jetty.util.log.class = org.eclipse.jetty.util.log.StrErrLog
+
+# Jetty logging level
+org.eclipse.jetty.LEVEL = WARN

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/project-root/.classpath
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/project-root/.classpath b/com.ibm.team.juno.microservice.template/project-root/.classpath
new file mode 100755
index 0000000..2563b9e
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/project-root/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-codec-1.9.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-io-1.2.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-logging-1.1.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpcore-4.4.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpmime-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/javax.servlet-api-3.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jetty-all-8.1.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/juno-all-5.2.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/org.apache.commons.fileupload_1.3.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/project-root/.project
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/project-root/.project b/com.ibm.team.juno.microservice.template/project-root/.project
new file mode 100755
index 0000000..358082d
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/project-root/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>microservice-project</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/project-root/build.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/project-root/build.properties b/com.ibm.team.juno.microservice.template/project-root/build.properties
new file mode 100755
index 0000000..a2aad00
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/project-root/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# 
+# Licensed Materials - Property of IBM
+# (c) Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+# 
+# Note to U.S. Government Users Restricted Rights:  
+# Use, duplication or disclosure restricted by GSA ADP Schedule 
+# Contract with IBM Corp. 
+#  
+###############################################################################
+
+jar = microservice.jar
+zip = microservice.zip
+		
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/project-root/build.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/project-root/build.xml b/com.ibm.team.juno.microservice.template/project-root/build.xml
new file mode 100755
index 0000000..1ca6997
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/project-root/build.xml
@@ -0,0 +1,50 @@
+<?xml version='1.0'?>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+
+<!--
+	Provides a VERY basic ANT script for creating a microservice zip file.
+-->
+<project name='Microservice' default='Microservice.Build'>
+	
+	<target name='Microservice.Build'>
+		<tstamp/>
+		<loadproperties srcFile='build.properties'/>
+		
+		<path id='classpath'>
+			<fileset dir='lib' includes='*.jar'/>
+		</path>
+		
+		<delete dir='build' quiet='true'/>
+
+		<copy todir='build/bin'>
+			<fileset dir='src' excludes='**/*.java'/>
+		</copy>
+		<copy todir='build/microservice'>
+			<fileset dir='.' includes='*.cfg,lib/**'/>
+		</copy>
+		
+		<javac srcdir='src' destdir='build/bin' fork='true' source='1.6' target='1.6' debug='true' includeantruntime='false'>
+			<classpath refid='classpath'/>
+		</javac>
+		
+		<jar jarfile='build/microservice/${jar}' basedir='build/bin' duplicate='fail' level='9' manifest='META-INF/MANIFEST.MF'>
+			<manifest>
+				<attribute name='Built-By' value='${user.name}'/>
+				<attribute name='Build-Date' value='${TODAY}'/>
+				<attribute name='Bundle-Version' value='${version}'/>
+			</manifest>
+		</jar>
+		
+		<zip basedir='build/microservice' destfile='build/${zip}'/>
+
+		<delete dir='build/bin' quiet='true'/>
+	</target>
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/project-root/microservice-project.launch
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/project-root/microservice-project.launch b/com.ibm.team.juno.microservice.template/project-root/microservice-project.launch
new file mode 100755
index 0000000..49785df
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/project-root/microservice-project.launch
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+	<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+		<listEntry value="/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java"/>
+	</listAttribute>
+	<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+		<listEntry value="1"/>
+	</listAttribute>
+	<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.ibm.juno.microservice.RestMicroservice"/>
+	<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="microservice-project"/>
+</launchConfiguration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/HelloWorldResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/HelloWorldResource.java b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/HelloWorldResource.java
new file mode 100755
index 0000000..b2da5d5
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/HelloWorldResource.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.sample;
+
+import com.ibm.juno.microservice.*;
+import com.ibm.juno.server.annotation.*;
+
+/**
+ * Sample REST resource that prints out a simple "Hello world!" message.
+ */
+@RestResource(
+	label="Hello World example",
+	description="Simplest possible REST resource"
+)
+public class HelloWorldResource extends Resource {
+	private static final long serialVersionUID = 1L;
+
+	/** GET request handler */
+	@RestMethod(name="GET", path="/*")
+	public String sayHello() {
+		return "Hello world!";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/RootResources.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/RootResources.java b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/RootResources.java
new file mode 100755
index 0000000..09f60b2
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/RootResources.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.sample;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+
+import com.ibm.juno.microservice.*;
+import com.ibm.juno.microservice.resources.*;
+import com.ibm.juno.server.annotation.*;
+
+/**
+ * Root microservice page.
+ */
+@RestResource(
+	path="/",
+	label="Juno Microservice Template",
+	description="Template for creating REST microservices",
+	properties={
+		@Property(name=HTMLDOC_links, value="{options:'$R{servletURI}?method=OPTIONS'}")
+	},
+	children={
+		HelloWorldResource.class,
+		ConfigResource.class,
+		LogsResource.class
+	}
+)
+public class RootResources extends ResourceGroup {
+	private static final long serialVersionUID = 1L;
+}


[42/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogsResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogsResource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogsResource.java
new file mode 100755
index 0000000..8c1a252
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogsResource.java
@@ -0,0 +1,299 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+import static com.ibm.juno.core.html.HtmlSerializerProperties.*;
+import static com.ibm.juno.server.RestServletProperties.*;
+import static javax.servlet.http.HttpServletResponse.*;
+
+import java.io.*;
+import java.net.*;
+import java.nio.charset.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.dto.*;
+import com.ibm.juno.core.filters.*;
+import com.ibm.juno.core.ini.ConfigFile;
+import com.ibm.juno.core.utils.StringUtils;
+import com.ibm.juno.microservice.Resource;
+import com.ibm.juno.server.*;
+import com.ibm.juno.server.annotation.*;
+import com.ibm.juno.server.annotation.Properties;
+import com.ibm.juno.server.converters.Queryable;
+
+/**
+ * REST resource for viewing and accessing log files.
+ */
+@RestResource(
+	path="/logs",
+	label="Log files",
+	description="Log files from this service",
+	properties={
+		@Property(name=HTML_uriAnchorText, value=PROPERTY_NAME),
+		@Property(name=REST_allowMethodParam, value="true")
+	},
+	filters={
+		IteratorFilter.class,       // Allows Iterators and Iterables to be serialized.
+		DateFilter.ISO8601DT.class  // Serialize Date objects as ISO8601 strings.
+	}
+)
+@SuppressWarnings("nls")
+public class LogsResource extends Resource {
+	private static final long serialVersionUID = 1L;
+
+	private ConfigFile cf = getConfig();
+
+	private File logDir = new File(cf.getString("Logging/logDir", "."));
+	private LogEntryFormatter leFormatter = new LogEntryFormatter(
+		cf.getString("Logging/format", "[{date} {level}] {msg}%n"),
+		cf.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss"),
+		cf.getBoolean("Logging/useStackTraceHashes")
+	);
+
+	private final FileFilter filter = new FileFilter() {
+		@Override /* FileFilter */
+		public boolean accept(File f) {
+			return f.isDirectory() || f.getName().endsWith(".log");
+		}
+	};
+
+	/** 
+	 * [GET /*] - Get file details or directory listing. 
+	 * 
+	 * @param req The HTTP request
+	 * @param properties The writable properties for setting the descriptions.
+	 * @param path The log file path.
+	 * @return The log file.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/*", rc={200,404})
+	public Object getFileOrDirectory(RestRequest req, @Properties ObjectMap properties, @PathRemainder String path) throws Exception {
+
+		File f = getFile(path);
+
+		if (f.isDirectory()) {
+			Set<FileResource> l = new TreeSet<FileResource>(new FileResourceComparator());
+			for (File fc : f.listFiles(filter)) {
+				URL fUrl = new URL(req.getTrimmedRequestURL().append('/').append(fc.getName()).toString());
+				l.add(new FileResource(fc, fUrl));
+			}
+			properties.put(HTMLDOC_description, "Contents of " + f.getAbsolutePath());
+			return l;
+		}
+
+		properties.put(HTMLDOC_description, "File details on " + f.getAbsolutePath());
+		return new FileResource(f, new URL(req.getTrimmedRequestURL().toString()));
+	}
+
+	/**
+	 * [VIEW /*] - Retrieve the contents of a log file.
+	 * 
+	 * @param req The HTTP request.
+	 * @param res The HTTP response.
+	 * @param path The log file path.
+	 * @param properties The writable properties for setting the descriptions.
+	 * @param highlight If <code>true</code>, add color highlighting based on severity.
+	 * @param start Optional start timestamp.  Don't print lines logged before the specified timestamp.  Example:  "&start=2014-01-23 11:25:47".
+	 * @param end Optional end timestamp.  Don't print lines logged after the specified timestamp.  Example:  "&end=2014-01-23 11:25:47".
+	 * @param thread Optional thread name filter.  Only show log entries with the specified thread name.  Example: "&thread=pool-33-thread-1".
+	 * @param loggers Optional logger filter.  Only show log entries if they were produced by one of the specified loggers (simple class name).  Example: "&loggers=(LinkIndexService,LinkIndexRestService)".
+	 * @param severity Optional severity filter.  Only show log entries with the specified severity.  Example: "&severity=(ERROR,WARN)".
+	 * @throws Exception 
+	 */
+	@RestMethod(name="VIEW", path="/*", rc={200,404})
+	@SuppressWarnings("nls")
+	public void viewFile(RestRequest req, RestResponse res, @PathRemainder String path, @Properties ObjectMap properties, @Param("highlight") boolean highlight, @Param("start") String start, @Param("end") String end, @Param("thread") String thread, @Param("loggers") String[] loggers, @Param("severity") String[] severity) throws Exception {
+
+		File f = getFile(path);
+		if (f.isDirectory())
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "View not available on directories");
+
+		Date startDate = StringUtils.parseISO8601Date(start), endDate = StringUtils.parseISO8601Date(end);
+
+		if (! highlight) {
+			Object o = getReader(f, startDate, endDate, thread, loggers, severity);
+			res.setContentType("text/plain");
+			if (o instanceof Reader)
+				res.setOutput(o);
+			else {
+				LogParser p = (LogParser)o;
+				Writer w = res.getNegotiatedWriter();
+				try {
+					p.writeTo(w);
+				} finally {
+					w.flush();
+					w.close();
+				}
+			}
+			return;
+		}
+
+		res.setContentType("text/html");
+		PrintWriter w = res.getNegotiatedWriter();
+		try {
+			w.println("<html><body style='font-family:monospace;font-size:8pt;white-space:pre;'>");
+			LogParser lp = getLogParser(f, startDate, endDate, thread, loggers, severity);
+			try {
+				if (! lp.hasNext())
+					w.append("<span style='color:gray'>[EMPTY]</span>");
+				else for (LogParser.Entry le : lp) {
+					char s = le.severity.charAt(0);
+					String color = "black";
+					//SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST
+					if (s == 'I')
+						color = "#006400";
+					else if (s == 'W')
+						color = "#CC8400";
+					else if (s == 'E' || s == 'S')
+						color = "#DD0000";
+					else if (s == 'D' || s == 'F' || s == 'T')
+						color = "#000064";
+					w.append("<span style='color:").append(color).append("'>");
+					le.appendHtml(w).append("</span>");
+				}
+				w.append("</body></html>");
+			} finally {
+				lp.close();
+			}
+		} finally {
+			w.close();
+		}
+	}
+
+	/**
+	 * [VIEW /*] - Retrieve the contents of a log file as parsed entries.
+	 * 
+	 * @param req The HTTP request. 
+	 * @param path The log file path.
+	 * @param start Optional start timestamp.  Don't print lines logged before the specified timestamp.  Example:  "&start=2014-01-23 11:25:47".
+	 * @param end Optional end timestamp.  Don't print lines logged after the specified timestamp.  Example:  "&end=2014-01-23 11:25:47".
+	 * @param thread Optional thread name filter.  Only show log entries with the specified thread name.  Example: "&thread=pool-33-thread-1".
+	 * @param loggers Optional logger filter.  Only show log entries if they were produced by one of the specified loggers (simple class name).  Example: "&loggers=(LinkIndexService,LinkIndexRestService)".
+	 * @param severity Optional severity filter.  Only show log entries with the specified severity.  Example: "&severity=(ERROR,WARN)".
+	 * @return The parsed contents of the log file.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="PARSE", path="/*", converters=Queryable.class, rc={200,404})
+	public LogParser viewParsedEntries(RestRequest req, @PathRemainder String path, @Param("start") String start, @Param("end") String end, @Param("thread") String thread, @Param("loggers") String[] loggers, @Param("severity") String[] severity) throws Exception {
+
+		File f = getFile(path);
+		Date startDate = StringUtils.parseISO8601Date(start), endDate = StringUtils.parseISO8601Date(end);
+
+		if (f.isDirectory())
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "View not available on directories");
+
+		return getLogParser(f, startDate, endDate, thread, loggers, severity);
+	}
+
+	/**
+	 * [DOWNLOAD /*] - Download file.
+	 * 
+	 * @param res The HTTP response. 
+	 * @param path The log file path. 
+	 * @return The contents of the log file.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="DOWNLOAD", path="/*", rc={200,404})
+	public Object downloadFile(RestResponse res, @PathRemainder String path) throws Exception {
+
+		File f = getFile(path);
+
+		if (f.isDirectory())
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "Download not available on directories");
+
+		res.setContentType("application/octet-stream"); //$NON-NLS-1$
+		res.setContentLength((int)f.length());
+		return new FileInputStream(f);
+	}
+
+	/** 
+	 * [DELETE /*] - Delete a file. 
+	 * 
+	 * @param path The log file path. 
+	 * @return A redirect object to the root.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="DELETE", path="/*", rc={200,404})
+	public Object deleteFile(@PathRemainder String path) throws Exception {
+
+		File f = getFile(path);
+
+		if (f.isDirectory())
+			throw new RestException(SC_BAD_REQUEST, "Delete not available on directories.");
+
+		if (f.canWrite())
+			if (! f.delete())
+				throw new RestException(SC_FORBIDDEN, "Could not delete file.");
+
+		return new Redirect(path + "/.."); //$NON-NLS-1$
+	}
+
+	private static BufferedReader getReader(File f) throws IOException {
+		return new BufferedReader(new InputStreamReader(new FileInputStream(f), Charset.defaultCharset()));
+	}
+
+	private File getFile(String path) {
+		if (path != null && path.indexOf("..") != -1)
+			throw new RestException(SC_NOT_FOUND, "File not found.");
+		File f = (path == null ? logDir : new File(logDir.getAbsolutePath() + '/' + path));
+		if (filter.accept(f))
+			return f;
+		throw new RestException(SC_NOT_FOUND, "File not found.");
+	}
+
+	/**
+	 * File bean.
+	 */
+	@SuppressWarnings("javadoc")
+	public static class FileResource {
+		private File f;
+		public String type;
+		public Object name;
+		public Long size;
+		@BeanProperty(filter=DateFilter.Medium.class) public Date lastModified;
+		public URL view, highlighted, parsed, download, delete;
+
+		public FileResource(File f, URL url) throws IOException {
+			this.f = f;
+			this.type = (f.isDirectory() ? "dir" : "file");
+			this.name = f.isDirectory() ? new Link(f.getName(), url.toString()) : f.getName();
+			this.size = f.isDirectory() ? null : f.length();
+			this.lastModified = new Date(f.lastModified());
+			if (f.canRead() && ! f.isDirectory()) {
+				this.view = new URL(url + "?method=VIEW");
+				this.highlighted = new URL(url + "?method=VIEW&highlight=true");
+				this.parsed = new URL(url + "?method=PARSE");
+				this.download = new URL(url + "?method=DOWNLOAD");
+				this.delete = new URL(url + "?method=DELETE");
+			}
+		}
+	}
+
+	private static class FileResourceComparator implements Comparator<FileResource>, Serializable {
+		private static final long serialVersionUID = 1L;
+		@Override /* Comparator */
+		public int compare(FileResource o1, FileResource o2) {
+			int c = o1.type.compareTo(o2.type);
+			return c != 0 ? c : o1.f.getName().compareTo(o2.f.getName());
+		}
+	}
+
+	private Object getReader(File f, final Date start, final Date end, final String thread, final String[] loggers, final String[] severity) throws IOException {
+		if (start == null && end == null && thread == null && loggers == null)
+			return getReader(f);
+		return getLogParser(f, start, end, thread, loggers, severity);
+	}
+
+	private LogParser getLogParser(File f, final Date start, final Date end, final String thread, final String[] loggers, final String[] severity) throws IOException {
+		return new LogParser(leFormatter, f, start, end, thread, loggers, severity);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/SampleRootResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/SampleRootResource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/SampleRootResource.java
new file mode 100755
index 0000000..8c60073
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/SampleRootResource.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import com.ibm.juno.microservice.ResourceGroup;
+import com.ibm.juno.server.annotation.RestResource;
+
+/**
+ * Sample root REST resource.
+ * 
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@RestResource(
+	path="/",
+	label="Sample Root Resource",
+	description="This is a sample router page",
+	children={ConfigResource.class,LogsResource.class}
+)
+public class SampleRootResource extends ResourceGroup {
+	private static final long serialVersionUID = 1L;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ShutdownResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ShutdownResource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ShutdownResource.java
new file mode 100755
index 0000000..e36d51c
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ShutdownResource.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ * 
+ * Note to U.S. Government Users Restricted Rights:
+ * Use, duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp. 
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import com.ibm.juno.microservice.Resource;
+import com.ibm.juno.server.annotation.RestMethod;
+import com.ibm.juno.server.annotation.RestResource;
+
+/**
+ * Provides the capability to shut down this REST microservice through a REST call.
+ */
+@RestResource(
+	path="/shutdown",
+	label="Shut down this resource"
+)
+public class ShutdownResource extends Resource {
+	
+	private static final long serialVersionUID = 1L;
+
+	/** 
+	 * [GET /] - Shutdown this resource. 
+	 * 
+	 * @return The string <js>"OK"</js>.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/", description="Show contents of config file.")
+	public String shutdown() throws Exception {
+		new Thread(
+			new Runnable() {
+				@Override /* Runnable */
+				public void run() {
+					try {
+						Thread.sleep(1000);
+					System.exit(0);
+					} catch (InterruptedException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		).start();
+		return "OK";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/package.html b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/package.html
new file mode 100755
index 0000000..770c4f5
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/package.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2015. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+</head>
+<body>
+<p>Predefined Microservice Resources</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/.classpath
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/.classpath b/com.ibm.team.juno.releng/.classpath
new file mode 100755
index 0000000..85ebd8a
--- /dev/null
+++ b/com.ibm.team.juno.releng/.classpath
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry exported="true" kind="lib" path="lib/derby/derby.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jaxrs/jsr311-api-1.1.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/javax.servlet_2.5.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-codec-1.9/commons-codec-1.9.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-fileupload/org.apache.commons.fileupload_1.3.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient/commons-logging-1.1.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient/httpclient-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient/httpcomponents-client-4.5-src.zip"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient/httpcore-4.4.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient/httpmime-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jaxrs/wink-common-1.2.1-incubating.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jaxrs/wink-server-1.2.1-incubating.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/jena-core-2.7.1-sources.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/jena-core-2.7.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/jena-iri-0.9.2.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/log4j-1.2.16.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/slf4j-api-1.6.4.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jena/slf4j-log4j12-1.6.4.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/junit/hamcrest-core-1.3.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/junit/junit-4.12.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/.jazzignore
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/.jazzignore b/com.ibm.team.juno.releng/.jazzignore
new file mode 100755
index 0000000..f8f7ec4
--- /dev/null
+++ b/com.ibm.team.juno.releng/.jazzignore
@@ -0,0 +1,37 @@
+### Jazz Ignore 0
+# Ignored files and folders will not be committed, but may be modified during 
+# accept or update.  
+# - Ignore properties should contain a space separated list of filename patterns.  
+# - Each pattern is case sensitive and surrounded by braces ('{' and '}').  
+# - "*" matches zero or more characters.  
+# - "?" matches a single character.  
+# - The pattern list may be split across lines by ending the line with a 
+#     backslash and starting the next line with a tab.  
+# - Patterns in core.ignore prevent matching resources in the same 
+#     directory from being committed.  
+# - Patterns in core.ignore.recursive matching resources in the current 
+#     directory and all subdirectories from being committed.  
+# - The default value of core.ignore.recursive is *.class 
+# - The default value for core.ignore is bin 
+# 
+# To ignore shell scripts and hidden files in this subtree: 
+#     e.g: core.ignore.recursive = {*.sh} {\.*} 
+# 
+# To ignore resources named 'bin' in the current directory (but allow 
+#  them in any sub directorybelow): 
+#     e.g: core.ignore = {bin} 
+# 
+# NOTE: modifying ignore files will not change the ignore status of 
+#     Eclipse derived resources.
+
+core.ignore.recursive= \
+	{*.class} 
+
+core.ignore= \
+	{CT_Results} \
+	{CT_Results_html} \
+	{bin} \
+	{build} \
+	{doc} \
+	{docstage} \
+	{temp.build} 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/.project
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/.project b/com.ibm.team.juno.releng/.project
new file mode 100755
index 0000000..4b21cbb
--- /dev/null
+++ b/com.ibm.team.juno.releng/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.ibm.team.juno.releng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/.settings/org.eclipse.jdt.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/.settings/org.eclipse.jdt.core.prefs b/com.ibm.team.juno.releng/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..9370afe
--- /dev/null
+++ b/com.ibm.team.juno.releng/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,25 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.source=1.6

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/Juno+SW+Classification+Guidance+&+Questionnaire [v1].doc
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/Juno+SW+Classification+Guidance+&+Questionnaire [v1].doc b/com.ibm.team.juno.releng/Juno+SW+Classification+Guidance+&+Questionnaire [v1].doc
new file mode 100755
index 0000000..dea703b
Binary files /dev/null and b/com.ibm.team.juno.releng/Juno+SW+Classification+Guidance+&+Questionnaire [v1].doc differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..6e3c020
--- /dev/null
+++ b/com.ibm.team.juno.releng/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Juno Releng
+Bundle-SymbolicName: com.ibm.team.juno.releng
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: IBM
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: 
+ lib/derby/derby.jar,
+ lib/jaxrs/jsr311-api-1.1.1.jar,
+ lib/httpclient/httpclient-4.5.jar,
+ lib/httpclient/httpmime-4.5.jar,
+ lib/httpclient/httpcore-4.4.1.jar
+Export-Package: 
+ org.apache.derby.jdbc,
+ javax.ws.rs,
+ javax.ws.rs.core,
+ javax.ws.rs.ext,
+ org.apache.http,
+ org.apache.http.auth,
+ org.apache.http.client,
+ org.apache.http.client.config,
+ org.apache.http.client.entity,
+ org.apache.http.client.methods,
+ org.apache.http.client.params,
+ org.apache.http.client.utils,
+ org.apache.http.config,
+ org.apache.http.conn,
+ org.apache.http.conn.scheme,
+ org.apache.http.conn.ssl,
+ org.apache.http.conn.socket,
+ org.apache.http.entity,
+ org.apache.http.entity.mime,
+ org.apache.http.impl.client,
+ org.apache.http.impl.conn,
+ org.apache.http.impl.cookie,
+ org.apache.http.message,
+ org.apache.http.params,
+ org.apache.http.protocol,
+ org.apache.http.util

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/Readme.txt
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/Readme.txt b/com.ibm.team.juno.releng/Readme.txt
new file mode 100755
index 0000000..0c2facd
--- /dev/null
+++ b/com.ibm.team.juno.releng/Readme.txt
@@ -0,0 +1,33 @@
+#================================================================================
+# Juno Components List
+#================================================================================
+
+---------------------------------------------------------------------------------
+juno-all.jar
+Contains all binaries from the Core, Server, Client, and Microservice APIs
+---------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------
+bundles/*
+Contents of juno-all.jar as individual OSGi bundles.
+---------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------
+source/*
+Same as the binaries, except includes all the source code as well.
+---------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------
+juno-javadocs.war
+The docs for everything.
+---------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------
+microservice-project.zip
+The Eclipse project template for creating a microservice.
+---------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------
+microservice-samples-project.zip
+The Eclipse project for running the samples.
+---------------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/all/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/all/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/bin/all/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..f8481cf
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/all/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.8.3
+Created-By: pwa6470_27sr1-20140411_01 (SR1) (IBM Corporation)
+Built-By: jbognar
+Build-Date: December 30 2015
+Bundle-Name: Juno Cloud API
+Bundle-Vendor: IBM
+Bundle-SymbolicName: com.ibm.team.juno.all
+Bundle-Version: 5.2.0.0
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/bin/client/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..6c9827b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.8.3
+Created-By: pwa6470_27sr1-20140411_01 (SR1) (IBM Corporation)
+Bundle-ManifestVersion: 2
+Bundle-Name: Juno Cloud API - Client
+Bundle-SymbolicName: com.ibm.team.juno.client
+Bundle-Version: 5.2.0.0
+Bundle-Vendor: IBM
+Require-Bundle: com.ibm.team.juno
+Import-Package: org.apache.http,org.apache.http.auth,org.apache.http.c
+ lient,org.apache.http.client.config,org.apache.http.client.entity,org
+ .apache.http.client.methods,org.apache.http.client.params,org.apache.
+ http.client.utils,org.apache.http.config,org.apache.http.conn,org.apa
+ che.http.conn.routing,org.apache.http.conn.scheme,org.apache.http.con
+ n.socket,org.apache.http.conn.ssl,org.apache.http.conn.util,org.apach
+ e.http.cookie,org.apache.http.entity,org.apache.http.impl.client,org.
+ apache.http.impl.conn,org.apache.http.impl.cookie,org.apache.http.mes
+ sage,org.apache.http.params,org.apache.http.protocol,org.apache.http.
+ util
+Export-Package: com.ibm.juno.client,com.ibm.juno.client.jazz
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Built-By: jbognar
+Build-Date: December 30 2015
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.class
new file mode 100755
index 0000000..42defb1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.java
new file mode 100755
index 0000000..7f68ef0
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/AllowAllRedirects.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import org.apache.http.impl.client.*;
+
+/**
+ * Redirect strategy that allows for redirects on any request type, not just <code>GET</code> or <code>HEAD</code>.
+ * <p>
+ * Note:  This class is similar to <code>org.apache.http.impl.client.LaxRedirectStrategy</code>
+ * 	in Apache HttpClient 4.2, but also allows for redirects on <code>PUTs</code> and <code>DELETEs</code>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class AllowAllRedirects extends DefaultRedirectStrategy {
+
+   @Override /* DefaultRedirectStrategy */
+   protected boolean isRedirectable(final String method) {
+   	return true;
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.class
new file mode 100755
index 0000000..f83558b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.java
new file mode 100755
index 0000000..47247d5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/DateHeader.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.util.*;
+
+import org.apache.http.client.utils.*;
+import org.apache.http.message.*;
+
+/**
+ * Convenience class for setting date headers in RFC2616 format.
+ * <p>
+ * Equivalent to the following code:
+ * <p class='bcode'>
+ * 	Header h = <jk>new</jk> Header(name, DateUtils.<jsm>formatDate</jsm>(value));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class DateHeader extends BasicHeader {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Creates a date request property in RFC2616 format.
+	 *
+	 * @param name The header name.
+	 * @param value The header value.
+	 */
+	public DateHeader(String name, Date value) {
+		super(name, DateUtils.formatDate(value));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.class
new file mode 100755
index 0000000..45e2b0c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.java
new file mode 100755
index 0000000..773ada1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/HttpMethod.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+/**
+ * Enumeration of HTTP methods.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum HttpMethod {
+
+	/** HTTP GET */
+	GET(false),
+
+	/** HTTP PUT */
+	PUT(true),
+
+	/** HTTP POST */
+	POST(true),
+
+	/** HTTP DELETE */
+	DELETE(false),
+
+	/** HTTP OPTIONS */
+	OPTIONS(false),
+
+	/** HTTP HEAD */
+	HEAD(false),
+
+	/** HTTP TRACE */
+	TRACE(false),
+
+	/** HTTP CONNECT */
+	CONNECT(false),
+
+	/** HTTP MOVE */
+	MOVE(false);
+
+	private boolean hasContent;
+
+	HttpMethod(boolean hasContent) {
+		this.hasContent = hasContent;
+	}
+
+	/**
+	 * Returns whether this HTTP method normally has content.
+	 *
+	 * @return <jk>true</jk> if this HTTP method normally has content.
+	 */
+	public boolean hasContent() {
+		return hasContent;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.class
new file mode 100755
index 0000000..3373a82
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.java
new file mode 100755
index 0000000..9e6e65b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/NameValuePairs.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+
+/**
+ * Convenience class for constructing instances of <code>List&lt;NameValuePair&gt;</code>
+ * 	for the {@link UrlEncodedFormEntity} class.
+ *
+ * <h6 class='topic'>Example</h6>
+ * <p class='bcode'>
+ * 	NameValuePairs params = <jk>new</jk> NameValuePairs()
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"j_username"</js>, user))
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, pw));
+ * 	request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class NameValuePairs extends LinkedList<NameValuePair> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Appends the specified pair to the end of this list.
+	 *
+	 * @param pair The pair to append to this list.
+	 * @return This object (for method chaining).
+	 */
+	public NameValuePairs append(NameValuePair pair) {
+		super.add(pair);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.class
new file mode 100755
index 0000000..6d36243
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.java
new file mode 100755
index 0000000..a10e939
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/ResponsePattern.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.util.regex.*;
+
+/**
+ * Used to find regular expression matches in REST responses made through {@link RestCall}.
+ * <p>
+ * Response patterns are applied to REST calls through the {@link RestCall#addResponsePattern(ResponsePattern)} method.
+ * <p>
+ * <h6 class='topic'>Example</h6>
+ * This example shows how to use a response pattern finder to find and capture patterns for <js>"x=number"</js> and <js>"y=string"</js>
+ * 	from a response body.
+ * <p>
+ * <p class='bcode'>
+ * 	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
+ * 	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
+ *
+ * 	restClient.doGet(<jsf>URL</jsf>)
+ * 		.addResponsePattern(
+ * 			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+ * 					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
+ * 				}
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+ * 					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
+ * 				}
+ * 			}
+ * 		)
+ * 		.addResponsePattern(
+ * 			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+ * 					yList.add(m.group(1));
+ * 				}
+ * 				<ja>@Override</ja>
+ * 				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+ * 					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
+ * 				}
+ * 			}
+ * 		)
+ * 		.run();
+ * </p>
+ * <p>
+ * <h5 class='notes'>Important Notes:</h5>
+ * <ol class='notes'>
+ * 	<li><p>
+ * 		Using response patterns does not affect the functionality of any of the other methods
+ * 		used to retrieve the response such as {@link RestCall#getResponseAsString()} or {@link RestCall#getResponse(Class)}.<br>
+ * 		HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
+ * 		use {@link RestCall#getCapturedResponse()} since this method will not absorb the response for those other methods.
+ * 	</p>
+ * 	<li><p>
+ * 		Response pattern methods are NOT executed if a REST exception occurs during the request.
+ * 	</p>
+ * 	<li><p>
+ * 		The {@link RestCall#successPattern(String)} and {@link RestCall#failurePattern(String)} methods use instances of
+ * 		this class to throw {@link RestCallException RestCallExceptions} when success patterns are not found or failure patterns
+ * 		are found.
+ * 	</p>
+ * 	<li><p>
+ * 		{@link ResponsePattern} objects are reusable and thread-safe.
+ * 	</p>
+ * </ol>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class ResponsePattern {
+
+	private Pattern pattern;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param pattern Regular expression pattern.
+	 */
+	public ResponsePattern(String pattern) {
+		this.pattern = Pattern.compile(pattern);
+	}
+
+	void match(RestCall rc) throws RestCallException {
+		try {
+			Matcher m = pattern.matcher(rc.getCapturedResponse());
+			boolean found = false;
+			while (m.find()) {
+				onMatch(rc, m);
+				found = true;
+			}
+			if (! found)
+				onNoMatch(rc);
+		} catch (IOException e) {
+			throw new RestCallException(e);
+		}
+	}
+
+	/**
+	 * Returns the pattern passed in through the constructor.
+	 *
+	 * @return The pattern passed in through the constructor.
+	 */
+	protected String getPattern() {
+		return pattern.pattern();
+	}
+
+	/**
+	 * Instances can override this method to handle when a regular expression pattern matches
+	 * 	on the output.
+	 * <p>
+	 * This method is called once for every pattern match that occurs in the response text.
+	 *
+	 * @param rc The {@link RestCall} that this pattern finder is being used on.
+	 * @param m The regular expression {@link Matcher}.  Can be used to retrieve group matches in the pattern.
+	 * @throws RestCallException Instances can throw an exception if a failure condition is detected.
+	 */
+	public void onMatch(RestCall rc, Matcher m) throws RestCallException {}
+
+	/**
+	 * Instances can override this method to handle when a regular expression pattern doesn't match on the output.
+	 *
+	 * @param rc The {@link RestCall} that this pattern finder is being used on.
+	 * @throws RestCallException Instances can throw an exception if a failure condition is detected.
+	 */
+	public void onNoMatch(RestCall rc) throws RestCallException {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$1.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$1.class
new file mode 100755
index 0000000..3a5e0e9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$2.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$2.class
new file mode 100755
index 0000000..711dec8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$3.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$3.class
new file mode 100755
index 0000000..60f20dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.class
new file mode 100755
index 0000000..cbdd200
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.java
new file mode 100755
index 0000000..67cbff2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCall.java
@@ -0,0 +1,942 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.logging.*;
+import java.util.regex.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.client.config.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.encoders.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Represents a connection to a remote REST resource.
+ * <p>
+ * 	Instances of this class are created by the various {@code doX()} methods on the {@link RestClient} class.
+ * <p>
+ * 	This class uses only Java standard APIs.  Requests can be built up using a fluent interface with method chaining, like so...
+ *
+ * <p class='bcode'>
+ * 	RestClient client = <jk>new</jk> RestClient();
+ * 	RestCall c = client.doPost(<jsf>URL</jsf>).setInput(o).setHeader(x,y);
+ * 	MyBean b = c.getResponse(MyBean.<jk>class</jk>);
+ * </p>
+ * <p>
+ * 	The actual connection and request/response transaction occurs when calling one of the <code>getResponseXXX()</code> methods.
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client &gt; REST client API</a> for more information and code examples.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestCall {
+
+	private final RestClient client;                       // The client that created this call.
+	private final HttpRequestBase request;                 // The request.
+	private HttpResponse response;                         // The response.
+	private List<RestCallInterceptor> interceptors = new ArrayList<RestCallInterceptor>();               // Used for intercepting and altering requests.
+
+	private boolean isConnected = false;                   // connect() has been called.
+	private boolean allowRedirectsOnPosts;
+	private int retries = 1;
+	private int redirectOnPostsTries = 5;
+	private long retryInterval = -1;
+	private RetryOn retryOn = RetryOn.DEFAULT;
+	private boolean ignoreErrors;
+	private boolean byLines = false;
+	private TeeWriter writers = new TeeWriter();
+	private StringWriter capturedResponseWriter;
+	private String capturedResponse;
+	private TeeOutputStream outputStreams = new TeeOutputStream();
+	private boolean isClosed = false;
+	private boolean isFailed = false;
+
+	/**
+	 * Constructs a REST call with the specified method name.
+	 *
+	 * @param client The client that created this request.
+	 * @param request The wrapped Apache HTTP client request object.
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 */
+	protected RestCall(RestClient client, HttpRequestBase request) throws RestCallException {
+		this.client = client;
+		this.request = request;
+		for (RestCallInterceptor i : this.client.interceptors)
+			addInterceptor(i);
+	}
+
+	/**
+	 * Sets the input for this REST call.
+	 *
+	 * @param input The input to be sent to the REST resource (only valid for PUT and POST) requests. <br>
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If a retry was attempted, but the entity was not repeatable.
+	 */
+	public RestCall setInput(final Object input) throws RestCallException {
+		if (! (request instanceof HttpEntityEnclosingRequestBase))
+			throw new RestCallException(0, "Method does not support content entity.", request.getMethod(), request.getURI(), null);
+		HttpEntity entity = (input instanceof HttpEntity ? (HttpEntity)input : new RestRequestEntity(input, client.serializer));
+		((HttpEntityEnclosingRequestBase)request).setEntity(entity);
+		if (retries > 1 && ! entity.isRepeatable())
+			throw new RestCallException("Rest call set to retryable, but entity is not repeatable.");
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting a header value on the request.
+	 * <p>
+	 * Equivalent to calling <code>restCall.getRequest().setHeader(name, value.toString())</code>.
+	 *
+	 * @param name The header name.
+	 * @param value The header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setHeader(String name, Object value) {
+		request.setHeader(name, value.toString());
+		return this;
+	}
+
+	/**
+	 * Make this call retryable if an error response (>=400) is received.
+	 *
+	 * @param retries The number of retries to attempt.
+	 * @param interval The time in milliseconds between attempts.
+	 * @param retryOn Optional object used for determining whether a retry should be attempted.
+	 * 	If <jk>null</jk>, uses {@link RetryOn#DEFAULT}.
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If current entity is not repeatable.
+	 */
+	public RestCall setRetryable(int retries, long interval, RetryOn retryOn) throws RestCallException {
+		if (request instanceof HttpEntityEnclosingRequestBase) {
+		HttpEntity e = ((HttpEntityEnclosingRequestBase)request).getEntity();
+		if (e != null && ! e.isRepeatable())
+			throw new RestCallException("Attempt to make call retryable, but entity is not repeatable.");
+		}
+		this.retries = retries;
+		this.retryInterval = interval;
+		this.retryOn = (retryOn == null ? RetryOn.DEFAULT : retryOn);
+		return this;
+
+	}
+
+	/**
+	 * For this call, allow automatic redirects when a 302 or 307 occurs when
+	 * 	performing a POST.
+	 * <p>
+	 * Note that this can be inefficient since the POST body needs to be serialized
+	 * 	twice.
+	 * The preferred approach if possible is to use the {@link LaxRedirectStrategy} strategy
+	 * 	on the underlying HTTP client.  However, this method is provided if you don't
+	 * 	have access to the underlying client.
+	 *
+	 * @param b Redirect flag.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall allowRedirectsOnPosts(boolean b) {
+		this.allowRedirectsOnPosts = b;
+		return this;
+	}
+
+	/**
+	 * Specify the number of redirects to follow before throwing an exception.
+	 *
+	 * @param maxAttempts Allow a redirect to occur this number of times.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setRedirectMaxAttempts(int maxAttempts) {
+		this.redirectOnPostsTries = maxAttempts;
+		return this;
+	}
+
+	/**
+	 * Add an interceptor for this call only.
+	 *
+	 * @param interceptor The interceptor to add to this call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall addInterceptor(RestCallInterceptor interceptor) {
+		interceptors.add(interceptor);
+		interceptor.onInit(this);
+		return this;
+	}
+
+	/**
+	 * Pipes the request output to the specified writer when {@link #run()} is called.
+	 * <p>
+	 * The writer is not closed.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param w The writer to pipe the output to.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(Writer w) {
+		return pipeTo(w, false);
+	}
+
+	/**
+	 * Pipe output from response to the specified writer when {@link #run()} is called.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param w The writer to write the output to.
+	 * @param close Close the writer when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(Writer w, boolean close) {
+		return pipeTo(null, w, close);
+	}
+
+	/**
+	 * Pipe output from response to the specified writer when {@link #run()} is called and associate
+	 * that writer with an ID so it can be retrieved through {@link #getWriter(String)}.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple writers.
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @param w The writer to write the output to.
+	 * @param close Close the writer when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(String id, Writer w, boolean close) {
+		writers.add(id, w, close);
+		return this;
+	}
+
+	/**
+	 * Retrieves a writer associated with an ID via {@link #pipeTo(String, Writer, boolean)}
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @return The writer, or <jk>null</jk> if no writer is associated with that ID.
+	 */
+	public Writer getWriter(String id) {
+		return writers.getWriter(id);
+	}
+
+	/**
+	 * When output is piped to writers, flush the writers after every line of output.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestCall byLines() {
+		this.byLines = true;
+		return this;
+	}
+
+	/**
+	 * Pipes the request output to the specified output stream when {@link #run()} is called.
+	 * <p>
+	 * The output stream is not closed.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output streams.
+	 *
+	 * @param os The output stream to pipe the output to.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(OutputStream os) {
+		return pipeTo(os, false);
+	}
+
+	/**
+	 * Pipe output from response to the specified output stream when {@link #run()} is called.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output stream.
+	 *
+	 * @param os The output stream to write the output to.
+	 * @param close Close the output stream when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(OutputStream os, boolean close) {
+		return pipeTo(null, os, close);
+	}
+
+	/**
+	 * Pipe output from response to the specified output stream when {@link #run()} is called and associate
+	 * that output stream with an ID so it can be retrieved through {@link #getOutputStream(String)}.
+	 * <p>
+	 * This method can be called multiple times to pipe to multiple output stream.
+	 *
+	 * @param id A string identifier that can be used to retrieve the output stream using {@link #getOutputStream(String)}
+	 * @param os The output stream to write the output to.
+	 * @param close Close the output stream when {@link #close()} is called.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall pipeTo(String id, OutputStream os, boolean close) {
+		outputStreams.add(id, os, close);
+		return this;
+	}
+
+	/**
+	 * Retrieves an output stream associated with an ID via {@link #pipeTo(String, OutputStream, boolean)}
+	 *
+	 * @param id A string identifier that can be used to retrieve the writer using {@link #getWriter(String)}
+	 * @return The writer, or <jk>null</jk> if no writer is associated with that ID.
+	 */
+	public OutputStream getOutputStream(String id) {
+		return outputStreams.getOutputStream(id);
+	}
+
+	/**
+	 * Prevent {@link RestCallException RestCallExceptions} from being thrown when HTTP status 400+ is encountered.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall ignoreErrors() {
+		this.ignoreErrors = true;
+		return this;
+	}
+
+	/**
+	 * Stores the response text so that it can later be captured using {@link #getCapturedResponse()}.
+	 * <p>
+	 * This method should only be called once.  Multiple calls to this method are ignored.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestCall captureResponse() {
+		if (capturedResponseWriter == null) {
+			capturedResponseWriter = new StringWriter();
+			writers.add(capturedResponseWriter, false);
+		}
+		return this;
+	}
+
+
+	/**
+	 * Look for the specified regular expression pattern in the response output.
+	 * <p>
+	 * Causes a {@link RestCallException} to be thrown if the specified pattern is found in the output.
+	 * <p>
+	 * This method uses {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
+	 * 	restClient.doGet(<jsf>URL</jsf>)
+	 * 		.failurePattern(<js>"FAILURE|ERROR"</js>)
+	 * 		.run();
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param errorPattern A regular expression to look for in the response output.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall failurePattern(final String errorPattern) {
+		addResponsePattern(
+			new ResponsePattern(errorPattern) {
+				@Override
+				public void onMatch(RestCall rc, Matcher m) throws RestCallException {
+					throw new RestCallException("Failure pattern detected.");
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Look for the specified regular expression pattern in the response output.
+	 * <p>
+	 * Causes a {@link RestCallException} to be thrown if the specified pattern is not found in the output.
+	 * <p>
+	 * This method uses {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
+	 * 	restClient.doGet(<jsf>URL</jsf>)
+	 * 		.successPattern(<js>"SUCCESS"</js>)
+	 * 		.run();
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param successPattern A regular expression to look for in the response output.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall successPattern(String successPattern) {
+		addResponsePattern(
+			new ResponsePattern(successPattern) {
+				@Override
+				public void onNoMatch(RestCall rc) throws RestCallException {
+					throw new RestCallException("Success pattern not detected.");
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Adds a response pattern finder to look for regular expression matches in the response output.
+	 * <p>
+	 * This method can be called multiple times to add multiple response pattern finders.
+	 * <p>
+	 * {@link ResponsePattern ResponsePatterns} use the {@link #getCapturedResponse()} to read the response text and so does not affect the other output
+	 * 	methods such as {@link #getResponseAsString()}.
+	 *
+	 * @param responsePattern The response pattern finder.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall addResponsePattern(final ResponsePattern responsePattern) {
+		captureResponse();
+		addInterceptor(
+			new RestCallInterceptor() {
+				@Override
+				public void onClose(RestCall restCall) throws RestCallException {
+					responsePattern.match(RestCall.this);
+				}
+			}
+		);
+		return this;
+	}
+
+	/**
+	 * Set configuration settings on this request.
+	 * <p>
+	 * Use {@link RequestConfig#custom()} to create configuration parameters for the request.
+	 *
+	 * @param config The new configuration settings for this request.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setConfig(RequestConfig config) {
+		this.request.setConfig(config);
+		return this;
+	}
+
+	/**
+	 * @return The HTTP response code.
+	 * @throws RestCallException
+	 * @deprecated Use {@link #run()}.
+	 */
+	@Deprecated
+	public int execute() throws RestCallException {
+		return run();
+	}
+
+	/**
+	 * Method used to execute an HTTP response where you're only interested in the HTTP response code.
+	 * <p>
+	 * The response entity is discarded unless one of the pipe methods have been specified to pipe the
+	 * 	 output to an output stream or writer.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jk>try</jk> {
+	 * 		RestClient client = <jk>new</jk> RestClient();
+	 * 		<jk>int</jk> rc = client.doGet(url).execute();
+	 * 		<jc>// Succeeded!</jc>
+	 * 	} <jk>catch</jk> (RestCallException e) {
+	 * 		<jc>// Failed!</jc>
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 */
+	public int run() throws RestCallException {
+		connect();
+		try {
+			StatusLine status = response.getStatusLine();
+			int sc = status.getStatusCode();
+			if (sc >= 400 && ! ignoreErrors)
+				throw new RestCallException(sc, status.getReasonPhrase(), request.getMethod(), request.getURI(), getResponseAsString()).setHttpResponse(response);
+			if (outputStreams.size() > 0 || writers.size() > 0)
+				getReader();
+			return sc;
+		} catch (RestCallException e) {
+			isFailed = true;
+			throw e;
+		} catch (IOException e) {
+			isFailed = true;
+			throw new RestCallException(e).setHttpResponse(response);
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Connects to the REST resource.
+	 * <p>
+	 * 	If this is a <code>PUT</code> or <code>POST</code>, also sends the input to the remote resource.<br>
+	 * <p>
+	 * 	Typically, you would only call this method if you're not interested in retrieving the body of the HTTP response.
+	 * 	Otherwise, you're better off just calling one of the {@link #getReader()}/{@link #getResponse(Class)}/{@link #pipeTo(Writer)}
+	 * 	methods directly which automatically call this method already.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException If an exception or <code>400+</code> HTTP status code occurred during the connection attempt.
+	 */
+	public RestCall connect() throws RestCallException {
+
+		if (isConnected)
+			return this;
+		isConnected = true;
+
+		try {
+			int sc = 0;
+			while (retries > 0) {
+				retries--;
+				Exception ex = null;
+				try {
+			response = client.execute(request);
+				sc = response == null ? -1 : response.getStatusLine().getStatusCode();
+				} catch (Exception e) {
+					ex = e;
+					sc = -1;
+				}
+				if (! retryOn.onCode(sc))
+					retries = 0;
+				if (retries > 0) {
+					for (RestCallInterceptor rci : interceptors)
+						rci.onRetry(this, sc, request, response, ex);
+					request.reset();
+					long w = retryInterval;
+					synchronized(this) {
+						wait(w);
+					}
+				} else if (ex != null) {
+					throw ex;
+				}
+			}
+			for (RestCallInterceptor rci : interceptors)
+				rci.onConnect(this, sc, request, response);
+			if (response == null)
+				throw new RestCallException("HttpClient returned a null response");
+			StatusLine sl = response.getStatusLine();
+			String method = request.getMethod();
+			sc = sl.getStatusCode(); // Read it again in case it was changed by one of the interceptors.
+			if (sc >= 400 && ! ignoreErrors)
+				throw new RestCallException(sc, sl.getReasonPhrase(), method, request.getURI(), getResponseAsString()).setHttpResponse(response);
+			if ((sc == 307 || sc == 302) && allowRedirectsOnPosts && method.equalsIgnoreCase("POST")) {
+				if (redirectOnPostsTries-- < 1)
+					throw new RestCallException(sc, "Maximum number of redirects occurred.  Location header: " + response.getFirstHeader("Location"), method, request.getURI(), getResponseAsString());
+				Header h = response.getFirstHeader("Location");
+				if (h != null) {
+					reset();
+					request.setURI(URI.create(h.getValue()));
+					retries++;  // Redirects should affect retries.
+					connect();
+				}
+			}
+
+		} catch (RestCallException e) {
+			isFailed = true;
+			try {
+			close();
+			} catch (RestCallException e2) { /* Ignore */ }
+			throw e;
+		} catch (Exception e) {
+			isFailed = true;
+			close();
+			throw new RestCallException(e).setHttpResponse(response);
+		}
+
+		return this;
+	}
+
+	private void reset() {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+		request.reset();
+		isConnected = false;
+		isClosed = false;
+		isFailed = false;
+		if (capturedResponseWriter != null)
+			capturedResponseWriter.getBuffer().setLength(0);
+	}
+
+	/**
+	 * Connects to the remote resource (if <code>connect()</code> hasn't already been called) and returns the HTTP response message body as a reader.
+	 * <p>
+	 * 	If an {@link Encoder} has been registered with the {@link RestClient}, then the underlying input stream
+	 * 		will be wrapped in the encoded stream (e.g. a <code>GZIPInputStream</code>).
+	 * <p>
+	 * 	If present, automatically handles the <code>charset</code> value in the <code>Content-Type</code> response header.
+	 * <p>
+	 * 	<b>IMPORTANT:</b>  It is your responsibility to close this reader once you have finished with it.
+	 *
+	 * @return The HTTP response message body reader.  <jk>null</jk> if response was successful but didn't contain a body (e.g. HTTP 204).
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 */
+	public Reader getReader() throws IOException {
+		InputStream is = getInputStream();
+		if (is == null)
+			return null;
+
+		// Figure out what the charset of the response is.
+		String cs = null;
+		Header contentType = response.getLastHeader("Content-Type");
+		String ct = contentType == null ? null : contentType.getValue();
+
+		// First look for "charset=" in Content-Type header of response.
+		if (ct != null && ct.contains("charset="))
+			cs = ct.substring(ct.indexOf("charset=")+8).trim();
+
+		if (cs == null)
+			cs = "UTF-8";
+
+		Reader isr = new InputStreamReader(is, cs);
+
+		if (writers.size() > 0) {
+			StringWriter sw = new StringWriter();
+			writers.add(sw, true);
+			IOPipe.create(isr, writers).byLines(byLines).run();
+			return new StringReader(sw.toString());
+		}
+
+		return new InputStreamReader(is, cs);
+	}
+
+	/**
+	 * Returns the response text as a string if {@link #captureResponse()} was called on this object.
+	 * <p>
+	 * Note that while similar to {@link #getResponseAsString()}, this method can be called multiple times
+	 * 	to retrieve the response text multiple times.
+	 * <p>
+	 * Note that this method returns <jk>null</jk> if you have not called one of the methods that cause
+	 * 	the response to be processed.  (e.g. {@link #run()}, {@link #getResponse()}, {@link #getResponseAsString()}.
+	 *
+	 * @return The captured response, or <jk>null</jk> if {@link #captureResponse()} has not been called.
+	 * @throws IllegalStateException If trying to call this method before the response is consumed.
+	 */
+	public String getCapturedResponse() {
+		if (! isClosed)
+			throw new IllegalStateException("This method cannot be called until the response has been consumed.");
+		if (capturedResponse == null && capturedResponseWriter != null && capturedResponseWriter.getBuffer().length() > 0)
+			capturedResponse = capturedResponseWriter.toString();
+		return capturedResponse;
+	}
+
+	/**
+	 * Returns the parser specified on the client to use for parsing HTTP response bodies.
+	 *
+	 * @return The parser.
+	 * @throws RestCallException If no parser was defined on the client.
+	 */
+	protected Parser<?> getParser() throws RestCallException {
+		if (client.parser == null)
+			throw new RestCallException(0, "No parser defined on client", request.getMethod(), request.getURI(), null);
+		return client.parser;
+	}
+
+	/**
+	 * Returns the serializer specified on the client to use for serializing HTTP request bodies.
+	 *
+	 * @return The serializer.
+	 * @throws RestCallException If no serializer was defined on the client.
+	 */
+	protected Serializer<?> getSerializer() throws RestCallException {
+		if (client.serializer == null)
+			throw new RestCallException(0, "No serializer defined on client", request.getMethod(), request.getURI(), null);
+		return client.serializer;
+	}
+
+	/**
+	 * Returns the value of the <code>Content-Length</code> header.
+	 *
+	 * @return The value of the <code>Content-Length</code> header, or <code>-1</code> if header is not present.
+	 * @throws IOException
+	 */
+	public int getContentLength() throws IOException {
+		connect();
+		Header h = response.getLastHeader("Content-Length");
+		if (h == null)
+			return -1;
+		long l = Long.parseLong(h.getValue());
+		if (l > Integer.MAX_VALUE)
+			return Integer.MAX_VALUE;
+		return (int)l;
+	}
+
+	/**
+	 * Connects to the remote resource (if <code>connect()</code> hasn't already been called) and returns the HTTP response message body as an input stream.
+	 * <p>
+	 * 	If an {@link Encoder} has been registered with the {@link RestClient}, then the underlying input stream
+	 * 		will be wrapped in the encoded stream (e.g. a <code>GZIPInputStream</code>).
+	 * <p>
+	 * 	<b>IMPORTANT:</b>  It is your responsibility to close this reader once you have finished with it.
+	 *
+	 * @return The HTTP response message body input stream. <jk>null</jk> if response was successful but didn't contain a body (e.g. HTTP 204).
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 * @throws IllegalStateException If an attempt is made to read the response more than once.
+	 */
+	public InputStream getInputStream() throws IOException {
+		if (isClosed)
+			throw new IllegalStateException("Method cannot be called.  Response has already been consumed.");
+		connect();
+		if (response == null)
+			throw new RestCallException("Response was null");
+		if (response.getEntity() == null)  // HTTP 204 results in no content.
+			return null;
+		InputStream is = response.getEntity().getContent();
+
+		if (outputStreams.size() > 0) {
+			ByteArrayInOutStream baios = new ByteArrayInOutStream();
+			outputStreams.add(baios, true);
+			IOPipe.create(is, baios).run();
+			return baios.getInputStream();
+		}
+		return is;
+	}
+
+	/**
+	 * Connects to the remote resource (if {@code connect()} hasn't already been called) and returns the HTTP response message body as plain text.
+	 *
+	 * @return The response as a string.
+	 * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt.
+	 * @throws IOException If an exception occurred while streaming was already occurring.
+	 */
+	public String getResponseAsString() throws IOException {
+		try {
+			Reader r = getReader();
+			String s = IOUtils.read(r).toString();
+			return s;
+		} catch (IOException e) {
+			isFailed = true;
+			throw e;
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Converts the output from the connection into an object of the specified class using the registered {@link Parser}.
+	 *
+	 * @param type The class to convert the input to.
+	 * @param <T> The class to convert the input to.
+	 * @return The parsed output.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public <T> T getResponse(Class<T> type) throws IOException, ParseException {
+		BeanContext bc = getParser().getBeanContext();
+		if (bc == null)
+			bc = BeanContext.DEFAULT;
+		return getResponse(bc.getClassMeta(type));
+	}
+
+	/**
+	 * Parses the output from the connection into the specified type and then wraps that in a {@link PojoRest}.
+	 * <p>
+	 * Useful if you want to quickly retrieve a single value from inside of a larger JSON document.
+	 *
+	 * @param innerType The class type of the POJO being wrapped.
+	 * @return The parsed output wapped in a {@link PojoRest}.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public PojoRest getResponsePojoRest(Class<?> innerType) throws IOException, ParseException {
+		return new PojoRest(getResponse(innerType));
+	}
+
+	/**
+	 * Converts the output from the connection into an {@link ObjectMap} and then wraps that in a {@link PojoRest}.
+	 * <p>
+	 * Useful if you want to quickly retrieve a single value from inside of a larger JSON document.
+	 *
+	 * @return The parsed output wapped in a {@link PojoRest}.
+	 * @throws IOException If a connection error occurred.
+	 * @throws ParseException If the input contains a syntax error or is malformed for the <code>Content-Type</code> header.
+	 */
+	public PojoRest getResponsePojoRest() throws IOException, ParseException {
+		return getResponsePojoRest(ObjectMap.class);
+	}
+
+	/**
+	 * Convenience method when you want to parse into a Map&lt;K,V&gt; object.
+	 * 
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	Map&lt;String,MyBean&gt; m = client.doGet(url).getResponseMap(LinkedHashMap.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * A simpler approach is often to just extend the map class you want and just use the normal {@link #getResponse(Class)} method:
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyMap <jk>extends</jk> LinkedHashMap&lt;String,MyBean&gt; {}
+	 *
+	 * 	Map&lt;String,MyBean&gt; m = client.doGet(url).getResponse(MyMap.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param mapClass The map class to use (e.g. <code>TreeMap</code>)
+	 * @param keyClass The class type of the keys (e.g. <code>String</code>)
+	 * @param valueClass The class type of the values (e.g. <code>MyBean</code>)
+	 * @return The response parsed as a map.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public final <K,V,T extends Map<K,V>> T getResponseMap(Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getMapClassMeta(mapClass, keyClass, valueClass);
+		return getResponse(cm);
+	}
+
+	/**
+	 * Convenience method when you want to parse into a Collection&lt;E&gt; object.
+	 * 
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	List&lt;MyBean&gt; l = client.doGet(url).getResponseCollection(LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 * 		<p>
+	 * 			A simpler approach is often to just extend the collection class you want and just use the normal {@link #getResponse(Class)} method:
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jk>public static class</jk> MyList <jk>extends</jk> LinkedList&lt;MyBean&gt; {}
+	 *
+	 * 	List&lt;MyBean&gt; l = client.doGet(url).getResponse(MyList.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param collectionClass The collection class to use (e.g. <code>LinkedList</code>)
+	 * @param entryClass The class type of the values (e.g. <code>MyBean</code>)
+	 * @return The response parsed as a collection.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public final <E,T extends Collection<E>> T getResponseCollection(Class<T> collectionClass, Class<E> entryClass) throws ParseException, IOException {
+		ClassMeta<T> cm = getBeanContext().getCollectionClassMeta(collectionClass, entryClass);
+		return getResponse(cm);
+	}
+
+	<T> T getResponse(ClassMeta<T> type) throws IOException, ParseException {
+		try {
+		Parser<?> p = getParser();
+		T o = null;
+		int contentLength = getContentLength();
+			if (! p.isReaderParser()) {
+			InputStream is = getInputStream();
+			o = ((InputStreamParser)p).parse(is, contentLength, type);
+		} else {
+			Reader r = getReader();
+			o = ((ReaderParser)p).parse(r, contentLength, type);
+			}
+		return o;
+		} catch (ParseException e) {
+			isFailed = true;
+			throw e;
+		} catch (IOException e) {
+			isFailed = true;
+			throw e;
+		} finally {
+			close();
+		}
+	}
+
+	BeanContext getBeanContext() throws RestCallException {
+		BeanContext bc = getParser().getBeanContext();
+		if (bc == null)
+			bc = BeanContext.DEFAULT;
+		return bc;
+	}
+
+	/**
+	 * Returns access to the {@link HttpUriRequest} passed to {@link HttpClient#execute(HttpUriRequest)}.
+	 *
+	 * @return The {@link HttpUriRequest} object.
+	 */
+	public HttpUriRequest getRequest() {
+		return request;
+	}
+
+	/**
+	 * Returns access to the {@link HttpResponse} returned by {@link HttpClient#execute(HttpUriRequest)}.
+	 * Returns <jk>null</jk> if {@link #connect()} has not yet been called.
+	 *
+	 * @return The HTTP response object.
+	 * @throws IOException
+	 */
+	public HttpResponse getResponse() throws IOException {
+		connect();
+		return response;
+	}
+
+	/**
+	 * Shortcut for calling <code>getRequest().setHeader(header)</code>
+	 *
+	 * @param header The header to set on the request.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall setHeader(Header header) {
+		request.setHeader(header);
+		return this;
+	}
+
+	/** Use close() */
+	@Deprecated
+	public void consumeResponse() {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+	}
+
+	/**
+	 * Cleans up this HTTP call.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws RestCallException Can be thrown by one of the {@link RestCallInterceptor#onClose(RestCall)} calls.
+	 */
+	public RestCall close() throws RestCallException {
+		if (response != null)
+			EntityUtils.consumeQuietly(response.getEntity());
+		isClosed = true;
+		if (! isFailed)
+			for (RestCallInterceptor r : interceptors)
+				r.onClose(this);
+		return this;
+	}
+
+	/**
+	 * Adds a {@link RestCallLogger} to the list of interceptors on this class.
+	 *
+	 * @param level The log level to log events at.
+	 * @param log The logger.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall logTo(Level level, Logger log) {
+		addInterceptor(new RestCallLogger(level, log));
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.class
new file mode 100755
index 0000000..57f3148
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.class differ


[45/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/nls/Messages.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/nls/Messages.properties b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/nls/Messages.properties
new file mode 100755
index 0000000..62b3f1a
--- /dev/null
+++ b/com.ibm.team.juno.microservice.template/src/com/ibm/juno/microservice/sample/nls/Messages.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Licensed Materials - Property of IBM
+# (c) Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+# 
+# Note to U.S. Government Users Restricted Rights:  
+# Use, duplication or disclosure restricted by GSA ADP Schedule 
+# Contract with IBM Corp. 
+###############################################################################
+
+#--------------------------------------------------------------------------------
+# RootResources
+#--------------------------------------------------------------------------------
+RootResources.label = Juno Microservice Template
+RootResources.description = Template for creating REST microservices

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/.classpath
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/.classpath b/com.ibm.team.juno.microservice/.classpath
new file mode 100755
index 0000000..03170d5
--- /dev/null
+++ b/com.ibm.team.juno.microservice/.classpath
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-codec-1.9.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-io-1.2.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-logging-1.1.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpclient-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpcore-4.4.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/httpmime-4.5.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/javax.servlet-api-3.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jetty-all-8.1.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/org.apache.commons.fileupload_1.3.1.jar"/>
+	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/com.ibm.team.juno.server"/>
+	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/com.ibm.team.juno.releng"/>
+	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/com.ibm.team.juno.client"/>
+	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/com.ibm.team.juno"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/.project
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/.project b/com.ibm.team.juno.microservice/.project
new file mode 100755
index 0000000..ae4204e
--- /dev/null
+++ b/com.ibm.team.juno.microservice/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.ibm.team.juno.microservice</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.core.prefs b/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..f053be0
--- /dev/null
+++ b/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,305 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=200
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=1
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=3
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=200
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=3
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.ui.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.ui.prefs b/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.ui.prefs
new file mode 100755
index 0000000..ee3a695
--- /dev/null
+++ b/com.ibm.team.juno.microservice/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,62 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=false
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=true
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_Juno
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Juno
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.ondemandthreshold=1
+org.eclipse.jdt.ui.staticondemandthreshold=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * Bean property getter\:  &lt;property&gt;${bare_field_name}&lt;/property&gt;.\r\n *\r\n * @return The value of the &lt;property&gt;${bare_field_name}&lt;/property&gt; property on this bean, or &lt;jk&gt;null&lt;/jk&gt; if it is not set.\r\n */</template><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * Bean property setter\:  &lt;property&gt;${bare_field_name}&lt;/property&gt;.\r\n *\r\n * @param ${param} The new value for the &lt;property&gt;${bare_field_name}&lt;/property&gt; property on th
 is bean.\r\n * @return This object (for method chaining).\r\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * TODO\r\n * \r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * TODO\r\n * &lt;p&gt;\r\n * \r\n * @author James Bognar (jbognar@us.ibm.com)\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context
 " deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * TODO\r\n * \r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * TODO\r\n * \r\n * $
 {tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbo
 dy">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.
 jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/Dockerfile
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/Dockerfile b/com.ibm.team.juno.microservice/Dockerfile
new file mode 100755
index 0000000..842d17b
--- /dev/null
+++ b/com.ibm.team.juno.microservice/Dockerfile
@@ -0,0 +1,16 @@
+# Dockerfile for creating a Juno microservice container
+
+FROM ubuntu
+
+# Change this to whatever port you wish to use.
+EXPOSE 10000
+
+# Install Java
+apt-get update
+apt-get install default-jre
+
+# Copy our jar
+copy build/microservice.jar /
+
+ENTRYPOINT []
+CMD /bin/sh -c "java -jar microservice.jar 10000"

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/META-INF/MANIFEST.MF b/com.ibm.team.juno.microservice/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..f2ed4ea
--- /dev/null
+++ b/com.ibm.team.juno.microservice/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: com.ibm.team.juno.microservice
+Bundle-SymbolicName: com.ibm.team.juno.microservice
+Bundle-Version: 5.2.0
+Bundle-Vendor: IBM
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/bin/.gitignore
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/bin/.gitignore b/com.ibm.team.juno.microservice/bin/.gitignore
new file mode 100644
index 0000000..c2d9872
--- /dev/null
+++ b/com.ibm.team.juno.microservice/bin/.gitignore
@@ -0,0 +1 @@
+/com/

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/build.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/build.properties b/com.ibm.team.juno.microservice/build.properties
new file mode 100755
index 0000000..f32e521
--- /dev/null
+++ b/com.ibm.team.juno.microservice/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# 
+# Licensed Materials - Property of IBM
+# (c) Copyright IBM Corporation 2015. All Rights Reserved.
+# 
+# Note to U.S. Government Users Restricted Rights:  
+# Use, duplication or disclosure restricted by GSA ADP Schedule 
+# Contract with IBM Corp. 
+#  
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
+jar = microservice.jar
+jre.compilation.profile = JavaSE-1.6

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/commons-codec-1.9.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/commons-codec-1.9.jar b/com.ibm.team.juno.microservice/lib/commons-codec-1.9.jar
new file mode 100755
index 0000000..ef35f1c
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/commons-codec-1.9.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/commons-io-1.2.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/commons-io-1.2.jar b/com.ibm.team.juno.microservice/lib/commons-io-1.2.jar
new file mode 100755
index 0000000..b2867cd
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/commons-io-1.2.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/commons-logging-1.1.1.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/commons-logging-1.1.1.jar b/com.ibm.team.juno.microservice/lib/commons-logging-1.1.1.jar
new file mode 100755
index 0000000..1deef14
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/commons-logging-1.1.1.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/httpclient-4.5.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/httpclient-4.5.jar b/com.ibm.team.juno.microservice/lib/httpclient-4.5.jar
new file mode 100755
index 0000000..970c989
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/httpclient-4.5.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/httpcore-4.4.1.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/httpcore-4.4.1.jar b/com.ibm.team.juno.microservice/lib/httpcore-4.4.1.jar
new file mode 100755
index 0000000..99715b6
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/httpcore-4.4.1.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/httpmime-4.5.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/httpmime-4.5.jar b/com.ibm.team.juno.microservice/lib/httpmime-4.5.jar
new file mode 100755
index 0000000..b631ceb
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/httpmime-4.5.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/javax.servlet-api-3.0.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/javax.servlet-api-3.0.jar b/com.ibm.team.juno.microservice/lib/javax.servlet-api-3.0.jar
new file mode 100755
index 0000000..4e2edcc
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/javax.servlet-api-3.0.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/jetty-all-8.1.0.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/jetty-all-8.1.0.jar b/com.ibm.team.juno.microservice/lib/jetty-all-8.1.0.jar
new file mode 100755
index 0000000..1d74933
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/jetty-all-8.1.0.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/lib/org.apache.commons.fileupload_1.3.1.jar
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/lib/org.apache.commons.fileupload_1.3.1.jar b/com.ibm.team.juno.microservice/lib/org.apache.commons.fileupload_1.3.1.jar
new file mode 100755
index 0000000..af0cda2
Binary files /dev/null and b/com.ibm.team.juno.microservice/lib/org.apache.commons.fileupload_1.3.1.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Microservice.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Microservice.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Microservice.java
new file mode 100755
index 0000000..c175f5f
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Microservice.java
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice;
+
+import java.io.Console;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.Manifest;
+
+import com.ibm.juno.core.ObjectMap;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.ini.ConfigFile;
+import com.ibm.juno.core.ini.ConfigFileListener;
+import com.ibm.juno.core.ini.ConfigMgr;
+
+/**
+ * Parent class for all microservices.
+ * <p>
+ * A microservice defines a simple API for starting and stopping simple Java services
+ * 	contained in executable jars.
+ * <p>
+ * The general command for invoking these services is...
+ * <p class='bcode'>
+ * 	java -jar mymicroservice.jar [mymicroservice.cfg]
+ * </p>
+ * <p>
+ * Your microservice class must be specified as the <jk>Main-Class</jk> entry in
+ * 	the manifest file of your microservice jar file.
+ *
+ * <h6 class='topic'>Microservice Configuration</h6>
+ * 
+ * This class defines the following method for accessing configuration for your microservice:
+ * <p>
+ * <ul>
+ * 	<li>{@link #getArgs()} - The command-line arguments passed to the jar file.
+ * 	<li>{@link #getConfig()} - An external INI-style configuration file.
+ * 	<li>{@link #getManifest()} - The manifest file for the main jar file.
+ * </ul>
+ *
+ * <h6 class='topic'>Entrypoint Method</h6>
+ * 
+ * Subclasses must implement a static void main method as the entry point for the microservice.
+ * Typically, this method will simply consist of the following...
+ * <p>
+ * <p class='bcode'>
+ * 	<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
+ * 		<jk>new</jk> MyMicroservice(args).start();
+ * 	}
+ * </p>
+ *
+ * <h6 class='topic'>Lifecycle Methods</h6>
+ * 
+ * Subclasses must implement the following lifecycle methods:
+ * <p>
+ * <ul>
+ * 	<li>{@link #start()} - Gets executed during startup.
+ * 	<li>{@link #stop()} - Gets executed when 'exit' is typed in the console or an external shutdown signal is received.
+ * 	<li>{@link #kill()} - Can be used to forcibly shut down the service.  Doesn't get called during normal operation.
+ * </ul>
+ *
+ * <h6 class='topic'>Lifecycle Listener Methods</h6>
+ * 
+ * Subclasses can optionally implement the following event listener methods:
+ * <p>
+ * <ul>
+ * 	<li>{@link #onStart()} - Gets executed before {@link #start()}.
+ * 	<li>{@link #onStop()} - Gets executed before {@link #stop()}.
+ * 	<li>{@link #onConfigSave(ConfigFile)} - Gets executed after a config file has been saved.
+ * 	<li>{@link #onConfigChange(ConfigFile, Set)} - Gets executed after a config file has been modified.
+ * </ul>
+ *
+ * <h6 class='topic'>Other Methods</h6>
+ * 
+ * Subclasses can optionally override the following methods to provide customized behavior:
+ * <p>
+ * <ul>
+ * 	<li>{@link #createVarResolver()} - Creates the {@link StringVarResolver} used to resolve variables in the config file returned by {@link #getConfig()}.
+ * </ul>
+ * 
+ * @author jbognar@us.ibm.com
+ */
+public abstract class Microservice {
+
+	private static Args args;
+	private static ConfigFile cf;
+	private static ObjectMap mf;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param args2 Command line arguments.
+	 * @throws Exception 
+	 */
+	protected Microservice(String[] args2) throws Exception {
+		Microservice.args = new Args(args2);
+
+		// --------------------------------------------------------------------------------
+		// Try to get the manifest file.
+		// --------------------------------------------------------------------------------
+		Manifest m = new Manifest();
+
+		// If running within an eclipse workspace, need to get it from the file system.
+		File f = new File("META-INF/MANIFEST.MF");
+		if (f.exists()) {
+			try {
+				m.read(new FileInputStream(f));
+			} catch (IOException e) {
+				System.err.println("Problem detected in MANIFEST.MF.  Contents below:\n" + IOUtils.read(f));
+				throw e;
+			}
+		} else {
+			// Otherwise, read from manifest file in the jar file containing the main class.
+			URLClassLoader cl = (URLClassLoader)getClass().getClassLoader();
+			URL url = cl.findResource("META-INF/MANIFEST.MF");
+			if (url != null) {
+				try {
+					m.read(url.openStream());
+				} catch (IOException e) {
+					System.err.println("Problem detected in MANIFEST.MF.  Contents below:\n" + IOUtils.read(url.openStream()));
+					throw e;
+				}
+			}
+		}
+		mf = new ObjectMap();
+		for (Map.Entry<Object,Object> e : m.getMainAttributes().entrySet())
+			mf.put(e.getKey().toString(), e.getValue().toString());
+		
+		// --------------------------------------------------------------------------------
+		// Find config file.
+		// Can either be passed in as first parameter, or we discover it using
+		// the 'sun.java.command' system property.
+		// --------------------------------------------------------------------------------
+		String cFile = null;
+		if (args.hasArg(0))
+			cFile = args.getArg(0);
+		else if (mf.containsKey("Main-ConfigFile"))
+			cFile = mf.getString("Main-ConfigFile");
+		else {
+			String cmd = System.getProperty("sun.java.command", "not_found").split("\\s+")[0];
+			if (cmd.endsWith(".jar"))
+				cFile = cmd.replace(".jar", ".cfg");
+		}
+
+		if (cFile == null) {
+			System.err.println("Running class ["+getClass().getSimpleName()+"] without a config file.");
+			cf = ConfigMgr.DEFAULT.create();
+		} else {
+			System.out.println("Running class ["+getClass().getSimpleName()+"] using config file ["+cFile+"]");
+			System.setProperty("juno.configFile", cFile);
+			cf = ConfigMgr.DEFAULT.get(cFile).getResolving(createVarResolver());
+		}
+
+		// --------------------------------------------------------------------------------
+		// Set system properties.
+		// --------------------------------------------------------------------------------
+		Set<String> spKeys = cf.getSectionKeys("SystemProperties");
+		if (spKeys != null)
+			for (String key : spKeys) 
+				System.setProperty(key, cf.get("SystemProperties", key));
+		
+		// --------------------------------------------------------------------------------
+		// Add a config file change listener.
+		// --------------------------------------------------------------------------------
+		cf.addListener(new ConfigFileListener() {
+			@Override /* ConfigFileListener */
+			public void onSave(ConfigFile cf) {
+				onConfigSave(cf);
+			}
+			@Override /* ConfigFileListener */
+			public void onChange(ConfigFile cf, Set<String> changes) {
+				onConfigChange(cf, changes);
+			}
+		});
+
+		// --------------------------------------------------------------------------------
+		// Add exit listeners.
+		// --------------------------------------------------------------------------------
+		new Thread() {
+			@Override /* Thread */
+			public void run() {
+				Console c = System.console();
+				if (c == null)
+					System.out.println("No available console.");
+				else {
+					while (true) {
+						String l = c.readLine("\nEnter 'exit' to exit.\n");
+						if (l == null || l.equals("exit")) {
+							Microservice.this.stop();
+							break;
+						}
+					}
+				}
+			}
+		}.start();
+		Runtime.getRuntime().addShutdownHook(
+			new Thread() {
+				@Override /* Thread */
+				public void run() {
+					Microservice.this.stop();
+				}
+			}
+		);
+	}
+
+	/**
+	 * Creates the {@link StringVarResolver} used to resolve variables in the 
+	 * config file returned by {@link #getConfig()}.
+	 * <p>
+	 * The default implementation resolves the following variables:
+	 * <ul>
+	 * 	<li><code>$S{key}</code>, <code>$S{key,default}</code> - System properties.
+	 * 	<li><code>$E{key}</code>, <code>$E{key,default}</code> - Environment variables.
+	 * 	<li><code>$C{key}</code>, <code>$C{key,default}</code> - Config file entries.
+	 * 	<li><code>$MF{key}</code>, <code>$MF{key,default}</code> - Manifest file entries.
+	 * 	<li><code>$ARG{key}</code>, <code>$ARG{key,default}</code> - Command-line arguments.
+	 * </ul> 
+	 * <p>
+	 * Subclasses can override this method to provide their own variables.
+	 * <dl>
+	 * 	<dt>Examples:</dt>
+	 * 	<dd>
+	 * 		<p class='bcode'>
+	 * 	<jd>/** 
+	 * 	 * Augment default var resolver with a custom $B{...} variable that simply wraps strings inside square brackets.
+	 * 	 * /</jd>
+	 * 	<ja>@Override</ja> <jc>// Microservice</jc>
+	 * 	<jk>protected</jk> StringVarResolver createVarResolver() {
+	 * 		<jk>return super</jk>.createVarResolver()
+	 * 			.addVar(<js>"B"</js>,
+	 * 				<jk>new</jk> StringVarWithDefault() {
+	 * 					<ja>@Override</ja> <jc>// StringVar</jc> 
+	 * 					<jk>public</jk> String resolve(String varVal) {
+	 * 						<jk>return</jk> <js>'['</js> + varVal + <js>']'</js>;
+	 * 					}
+	 * 				}
+	 * 			);
+	 * 	}
+	 * 		</p>
+	 * 		<p class='bcode'>
+	 * 	<cc># Example config file</cc>
+	 * 	<cs>[MySection]</cs>
+	 * 	<ck>myEntry</ck> = $B{foo}
+	 * 		</p>
+	 * 		<p class='bcode'>
+	 * 	<jc>// Example java code</jc>
+	 * 	String myentry = getConfig().getString(<js>"MySection/myEntry"</js>); <jc>// == "[foo]"</js>
+	 * 		</p>
+	 * 	</dd>
+	 * </dl>
+	 * 
+	 * @return A new {@link StringVarResolver}.
+	 */
+	protected StringVarResolver createVarResolver() {
+		return new StringVarResolver(StringVarResolver.DEFAULT)
+			.addVar("C", 
+				new StringVarWithDefault() {
+					@Override /* StringVar */
+					public String resolve(String varVal) {
+						return cf.getString(varVal);
+					}
+				}
+			)
+			.addVar("MF", 
+				new StringVarWithDefault() {
+					@Override /* StringVar */
+					public String resolve(String varVal) {
+						if (mf == null)
+							return null;
+						return mf.getString(varVal);
+					}
+				}
+			)
+			.addVar("ARG", 
+				new StringVarWithDefault() {
+					@Override /* StringVar */
+					public String resolve(String varVal) {
+						if (args == null)
+							return null;
+						return args.getString(varVal);
+					}
+				}
+			);
+	}
+	
+	/**
+	 * Returns the command-line arguments passed into the application.
+	 * <p>
+	 * This method can be called from the class constructor.
+	 * <p>
+	 * See {@link Args} for details on using this method.
+	 * 
+	 * @return The command-line arguments passed into the application.
+	 */
+	protected static Args getArgs() {
+		return args;
+	}
+
+	/**
+	 * Overrides the value returned by {@link #getArgs()}.
+	 * 
+	 * @param args The new arguments. 
+	 * @return This object (for method chaining).
+	 */
+	protected Microservice setArgs(String[] args) {
+		Microservice.args = new Args(args);
+		return this;
+	}
+
+	/**
+	 * Returns the external INI-style configuration file that can be used to configure your microservice.
+	 * <p>
+	 * The config file location is determined in the following order:
+	 * <ol class='spaced-list'>
+	 * 	<li>The first argument passed to the microservice jar.
+	 * 	<li>The <code>Main-ConfigFile</code> entry in the microservice jar manifest file.
+	 * 	<li>The name of the microservice jar with a <js>".cfg"</js> suffix (e.g. <js>"mymicroservice.jar"</js>-&gt;<js>"mymicroservice.cfg"</js>).
+	 * </ol>
+	 * <p>
+	 * If all methods for locating the config file fail, then this method returns <jk>null</jk>.
+	 * <p>
+	 * Subclasses can set their own config file by calling the {@link #setConfig(ConfigFile)} method.
+	 * <p>
+	 * String variables defined by {@link #createVarResolver()} are automatically resolved when using this method.
+	 * <p>
+	 * This method can be called from the class constructor.
+	 * <dl>
+	 * 	<dt>Examples:</dt>
+	 * 	<dd>
+	 * 		<p class='bcode'>
+	 * 	<cc>#--------------------------</cc>
+	 * 	<cc># My section</cc>
+	 * 	<cc>#--------------------------</cc>
+	 * 	<cs>[MySection]</cs>
+	 * 	
+	 * 	<cc># An integer</cc>
+	 * 	<ck>anInt</ck> = 1 
+	 * 	
+	 * 	<cc># A boolean</cc>
+	 * 	<ck>aBoolean</ck> = true 
+	 * 	
+	 * 	<cc># An int array</cc>
+	 * 	<ck>anIntArray</ck> = 1,2,3 
+	 * 	
+	 * 	<cc># A POJO that can be converted from a String</cc>
+	 * 	<ck>aURL</ck> = http://foo 
+	 * 	
+	 * 	<cc># A POJO that can be converted from JSON</cc>
+	 * 	<ck>aBean</ck> = {foo:'bar',baz:123}
+	 * 	
+	 * 	<cc># A system property</cc>
+	 * 	<ck>locale</ck> = $S{java.locale, en_US}
+	 * 	
+	 * 	<cc># An environment variable</cc>
+	 * 	<ck>path</ck> = $E{PATH, unknown}
+	 * 	
+	 * 	<cc># A manifest file entry</cc>
+	 * 	<ck>mainClass</ck> = $MF{Main-Class}
+	 * 	
+	 * 	<cc># Another value in this config file</cc>
+	 * 	<ck>sameAsAnInt</ck> = $C{MySection/anInt}
+	 * 	
+	 * 	<cc># A command-line argument in the form "myarg=foo"</cc>
+	 * 	<ck>myArg</ck> = $ARG{myarg}
+	 * 	
+	 * 	<cc># The first command-line argument</cc>
+	 * 	<ck>firstArg</ck> = $ARG{0}
+	 * 
+	 * 	<cc># Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.</cc>
+	 * 	<ck>nested</ck> = $S{mySystemProperty,$E{MY_ENV_VAR,$ARG{0}}}
+	 * 
+	 * 	<cc># A POJO with embedded variables</cc>
+	 * 	<ck>aBean2</ck> = {foo:'$ARG{0}',baz:$C{MySection/anInt}}
+	 * 	
+	 * 		</p>
+	 * 		<p class='bcode'>
+	 * 	<jc>// Java code for accessing config entries above.</jc>
+	 * 	ConfigFile cf = getConfig();
+	 * 	
+	 * 	<jk>int</jk> anInt = cf.getInt(<js>"MySection/anInt"</js>); 
+	 * 	<jk>boolean</jk> aBoolean = cf.getBoolean(<js>"MySection/aBoolean"</js>); 
+	 * 	<jk>int</jk>[] anIntArray = cf.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"MySection/anIntArray"</js>); 
+	 * 	URL aURL = cf.getObject(URL.<jk>class</jk>, <js>"MySection/aURL"</js>); 
+	 * 	MyBean aBean = cf.getObject(MyBean.<jk>class</jk>, <js>"MySection/aBean"</js>); 
+	 * 	Locale locale = cf.getObject(Locale.<jk>class</jk>, <js>"MySection/locale"</js>); 
+	 * 	String path = cf.getString(<js>"MySection/path"</js>); 
+	 * 	String mainClass = cf.getString(<js>"MySection/mainClass"</js>); 
+	 * 	<jk>int</jk> sameAsAnInt = cf.getInt(<js>"MySection/sameAsAnInt"</js>); 
+	 * 	String myArg = cf.getString(<js>"MySection/myArg"</js>); 
+	 * 	String firstArg = cf.getString(<js>"MySection/firstArg"</js>); 
+	 * 		</p>
+	 * 	</dd>
+	 * </dl>
+	 * 
+	 * @return The config file for this application, or <jk>null</jk> if no config file is configured. 
+	 */
+	protected static ConfigFile getConfig() {
+		return cf;
+	}
+
+	/**
+	 * Overrides the value returned by {@link #getConfig()}.
+	 * 
+	 * @param cf The config file for this application, or <jk>null</jk> if no config file is configured. 
+	 * @return This object (for method chaining).
+	 */
+	protected Microservice setConfig(ConfigFile cf) {
+		Microservice.cf = cf;
+		return this;
+	}
+
+	/**
+	 * Returns the main jar manifest file contents as a simple {@link ObjectMap}.
+	 * <p>
+	 * This map consists of the contents of {@link Manifest#getMainAttributes()} with the keys
+	 * 	and entries converted to simple strings.
+	 * <p>
+	 * This method can be called from the class constructor.
+	 * <dl>
+	 * 	<dt>Examples:</dt>
+	 * 	<dd>
+	 * 		<p class='bcode'>
+	 * 	<jc>// Get Main-Class from manifest file.</jc>
+	 * 	String mainClass = Microservice.<jsm>getManifest</jsm>().getString(<js>"Main-Class"</js>, <js>"unknown"</js>);
+	 * 
+	 * 	<jc>// Get Rest-Resources from manifest file.</jc>
+	 * 	String[] restResources = Microservice.<jsm>getManifest</jsm>().getStringArray(<js>"Rest-Resources"</js>);
+	 * 		</p>
+	 * 	</dd>
+	 * </dl>
+	 * 
+	 * @return The manifest file from the main jar, or <jk>null</jk> if the manifest file could not be retrieved.
+	 */
+	protected static ObjectMap getManifest() {
+		return mf;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Abstract lifecycle methods.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Start this application.
+	 * <p>
+	 * Default implementation simply calls {@link #onStart()}.
+	 * <p>
+	 * Overridden methods MUST call this method FIRST so that the {@link #onStart()} method is called.
+	 * 
+	 * @throws Exception
+	 */
+	protected void start() throws Exception {
+		onStart();
+	}
+
+	/**
+	 * Stop this application.
+	 * <p>
+	 * Default implementation simply calls {@link #onStop()}.
+	 * <p>
+	 * Overridden methods MUST call this method LAST so that the {@link #onStop()} method is called.
+	 */
+	protected void stop() {
+		onStop();
+	}
+
+	/**
+	 * Kill the JVM by calling <code>System.exit(2);</code>.
+	 */
+	protected void kill() {
+		// This triggers the shutdown hook.
+		System.exit(2);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Lifecycle listener methods.
+	// Subclasses can override these methods to run code on certain events.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Called at the beginning of the {@link #start()} call.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStart() {}
+
+	/**
+	 * Called at the end of the {@link #stop()} call.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStop() {}
+
+	/**
+	 * Called if the {@link ConfigFile#save()} is called on the config file.
+	 * <p>
+	 * Subclasses can override this method to listen for config file changes.
+	 * 
+	 * @param cf The config file. 
+	 */
+	protected void onConfigSave(ConfigFile cf) {}
+
+	/**
+	 * Called if one or more changes occur in the config file.
+	 * <p>
+	 * Subclasses can override this method to listen for config file changes.
+	 * 
+	 * @param cf The config file. 
+	 * @param changes The list of keys in the config file being changed.
+	 */
+	protected void onConfigChange(ConfigFile cf, Set<String> changes) {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Resource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Resource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Resource.java
new file mode 100755
index 0000000..cce3bc8
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/Resource.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice;
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.server.*;
+import com.ibm.juno.server.annotation.*;
+
+/**
+ * Superclass for all REST resources.
+ * <p>
+ * In additional to the functionality of the {@link RestServletDefault} group, 
+ * augments the {@link #createVarResolver()} method with the following additional variable types:
+ * <ul class='spaced-list'>
+ * 	<li><code class='snippet'>$ARG{...}</code> - Command line arguments pulled from {@link Microservice#getArgs()}.<br>
+ * 		<h6 class='figure'>Example:</h6>
+ * 		<p class='bcode'>
+ * 			String firstArg = request.getVarResolver().resolve(<js>"$ARG{0}"</js>);  <jc>// First argument.</jc> 
+ * 			String namedArg = request.getVarResolver().resolve(<js>"$ARG{myarg}"</js>);  <jc>// Named argument (e.g. "myarg=foo"). </jc>
+ * 		</p>
+ * 	<li><code class='snippet'>$MF{...}</code> - Manifest file entries pulled from {@link Microservice#getManifest()}.<br>
+ * 		<h6 class='figure'>Example:</h6>
+ * 		<p class='bcode'>
+ * 			String mainClass = request.getVarResolver().resolve(<js>"$MF{Main-Class}"</js>);  <jc>// Main class. </jc>
+ * 		</p>
+ * </ul>
+ * 
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("serial")
+@RestResource(
+	properties={
+		@Property(name=HTMLDOC_links, value="{up:'$R{requestParentURI}',options:'$R{servletURI}?method=OPTIONS'}")
+	},
+	config="$S{juno.configFile}",
+	stylesheet="$C{REST/stylesheet,styles/juno.css}"
+)
+public abstract class Resource extends RestServletDefault {
+
+	/**
+	 * Adds $ARG and $MF variables to variable resolver defined on {@link RestServlet#createVarResolver()}.
+	 */
+	@Override
+	protected StringVarResolver createVarResolver() {
+		StringVarResolver r = super.createVarResolver();
+
+		// Command-line arguments.
+		r.addVar("ARG", new StringVarWithDefault() {
+			@Override /* StringVar */
+			public String resolve(String varVal) {
+				return Microservice.getArgs().getArg(varVal);
+			}
+		});
+
+		// Manifest file entries.
+		r.addVar("MF", new StringMapVar(Microservice.getManifest()));
+
+		return r;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceGroup.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceGroup.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceGroup.java
new file mode 100755
index 0000000..db8f3d3
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceGroup.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.server.*;
+import com.ibm.juno.server.annotation.*;
+
+/**
+ * Superclass for all REST resource groups.
+ * <p>
+ * In additional to the functionality of the {@link RestServletGroupDefault} group, 
+ * augments the {@link #createVarResolver()} method with the following additional variable types:
+ * <ul>
+ * 	<li><jk>$ARG{...}</jk> - Command line arguments.<br>
+ * 		Resolves values from {@link Microservice#getArgs()}.<br>
+ * 		<h6>Example:</h6>
+ * 		<p class='bcode'>
+ * 			String firstArg = request.getVarResolver().resolve(<js>"$ARG{0}"</js>);  <jc>// First argument.</jc> 
+ * 			String namedArg = request.getVarResolver().resolve(<js>"$ARG{myarg}"</js>);  <jc>// Named argument (e.g. "myarg=foo"). </jc>
+ * 		</p>
+ * 	<li><jk>$MF{...}</jk> - Manifest file entries.
+ * 		<h6>Example:</h6>
+ * 		<p class='bcode'>
+ * 			String mainClass = request.getVarResolver().resolve(<js>"$MF{Main-Class}"</js>);  <jc>// Main class. </jc>
+ * 		</p>
+ * </ul>
+ * 
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("serial")
+@RestResource(
+	properties={
+		@Property(name=HTMLDOC_links, value="{up:'$R{requestParentURI}',options:'$R{servletURI}?method=OPTIONS'}"),
+	},
+	config="$S{juno.configFile}",
+	stylesheet="$C{REST/stylesheet,styles/juno.css}"
+)
+public abstract class ResourceGroup extends RestServletGroupDefault {
+
+	@Override
+	protected StringVarResolver createVarResolver() {
+		StringVarResolver r = super.createVarResolver();
+
+		// Command-line arguments.
+		r.addVar("ARG", new StringVarWithDefault() {
+			@Override /* StringVar */
+			public String resolve(String varVal) {
+				return Microservice.getArgs().getArg(varVal);
+			}
+		});
+
+		// Manifest file entries.
+		r.addVar("MF", new StringMapVar(Microservice.getManifest()));
+
+		return r;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceJena.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceJena.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceJena.java
new file mode 100755
index 0000000..153a000
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/ResourceJena.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015, 2016. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice;
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+
+import com.ibm.juno.server.annotation.*;
+import com.ibm.juno.server.jena.*;
+
+/**
+ * Superclass for all REST resources with RDF support.
+ * 
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("serial")
+@RestResource(
+	properties={
+		@Property(name=HTMLDOC_links, value="{up:'$R{requestParentURI}',options:'$R{servletURI}?method=OPTIONS'}")
+	},
+	config="$S{juno.configFile}",
+	stylesheet="$C{REST/stylesheet,styles/juno.css}"
+)
+public abstract class ResourceJena extends RestServletJenaDefault {}


[41/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.java
new file mode 100755
index 0000000..b0129f4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallException.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static java.lang.String.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.regex.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.util.*;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Exception representing a <code>400+</code> HTTP response code against a remote resource.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestCallException extends IOException {
+
+	private static final long serialVersionUID = 1L;
+
+	private int responseCode;
+	private String response, responseStatusMessage;
+	HttpResponseException e;
+	private HttpResponse httpResponse;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The exception message.
+	 */
+	public RestCallException(String msg) {
+		super(msg);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param e The inner cause of the exception.
+	 */
+	public RestCallException(Exception e) {
+		super(e.getLocalizedMessage(), e);
+		if (e instanceof FileNotFoundException) {
+			responseCode = 404;
+		} else if (e.getMessage() != null) {
+			Pattern p = Pattern.compile("[^\\d](\\d{3})[^\\d]");
+			Matcher m = p.matcher(e.getMessage());
+			if (m.find())
+				responseCode = Integer.parseInt(m.group(1));
+		}
+		setStackTrace(e.getStackTrace());
+	}
+
+	/**
+	 * Create an exception with a simple message and the status code and body of the specified response.
+	 *
+	 * @param msg The exception message.
+	 * @param response The HTTP response object.
+	 * @throws ParseException
+	 * @throws IOException
+	 */
+	public RestCallException(String msg, HttpResponse response) throws ParseException, IOException {
+		super(format("%s%nstatus='%s'%nResponse: %n%s%n", msg, response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), IOUtils.UTF8)));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param responseCode The response code.
+	 * @param responseMsg The response message.
+	 * @param method The HTTP method (for message purposes).
+	 * @param url The HTTP URL (for message purposes).
+	 * @param response The reponse from the server.
+	 */
+	public RestCallException(int responseCode, String responseMsg, String method, URI url, String response) {
+		super(format("HTTP method '%s' call to '%s' caused response code '%s,%s'.%nResponse: %n%s%n", method, url, responseCode, responseMsg, response));
+		this.responseCode = responseCode;
+		this.responseStatusMessage = responseMsg;
+		this.response = response;
+	}
+
+	/**
+	 * Sets the HTTP response object that caused this exception.
+	 *
+	 * @param httpResponse The HTTP respose object.
+	 * @return This object (for method chaining).
+	 */
+	protected RestCallException setHttpResponse(HttpResponse httpResponse) {
+		this.httpResponse = httpResponse;
+		return this;
+	}
+
+	/**
+	 * Returns the HTTP response object that caused this exception.
+	 *
+	 * @return The HTTP response object that caused this exception, or <jk>null</jk> if no response was created yet when the exception was thrown.
+	 */
+	public HttpResponse getHttpResponse() {
+		return this.httpResponse;
+	}
+
+	/**
+	 * Returns the HTTP response status code.
+	 *
+	 * @return The response status code.  If a connection could not be made at all, returns <code>0<code>.
+	 */
+	public int getResponseCode() {
+		return responseCode;
+	}
+
+	/**
+	 * Returns the HTTP response message body text.
+	 *
+	 * @return The response message body text.
+	 */
+	public String getResponseMessage() {
+		return response;
+	}
+
+	/**
+	 * Returns the response status message as a plain string.
+	 *
+	 * @return The response status message.
+	 */
+	public String getResponseStatusMessage() {
+		return responseStatusMessage;
+	}
+
+	/**
+	 * Sets the inner cause for this exception.
+	 * @param cause The inner cause.
+	 * @return This object (for method chaining).
+	 */
+	@Override /* Throwable */
+	public synchronized RestCallException initCause(Throwable cause) {
+		super.initCause(cause);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.class
new file mode 100755
index 0000000..e4e4096
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.java
new file mode 100755
index 0000000..52c278b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallInterceptor.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import org.apache.http.*;
+
+/**
+ * Used to intercept http connection responses to allow modification of that response before processing
+ * and for listening for call lifecycle events.
+ * <p>
+ * Useful if you want to prevent {@link RestCallException RestCallExceptions} from being thrown on error conditions.
+ */
+public abstract class RestCallInterceptor {
+
+	/**
+	 * Called when {@link RestCall} object is created.
+	 *
+	 * @param restCall The restCall object invoking this method.
+	 */
+	public void onInit(RestCall restCall) {}
+
+	/**
+	 * Called immediately after an HTTP response has been received.
+	 *
+	 * @param statusCode The HTTP status code received.
+	 * @param restCall The restCall object invoking this method.
+	 * @param req The HTTP request object.
+	 * @param res The HTTP response object.
+	 */
+	public void onConnect(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res) {}
+
+	/**
+	 * Called if retry is going to be attempted.
+	 *
+	 * @param statusCode The HTTP status code received.
+	 * @param restCall The restCall object invoking this method.
+	 * @param req The HTTP request object.
+	 * @param res The HTTP response object.
+	 * @param ex The exception thrown from the client.
+	 */
+	public void onRetry(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res, Exception ex) {}
+
+	/**
+	 * Called when {@link RestCall#close()} is called.
+	 *
+	 * @param restCall The restCall object invoking this method.
+	 * @throws RestCallException
+	 */
+	public void onClose(RestCall restCall) throws RestCallException {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.class
new file mode 100755
index 0000000..27cbe0c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.java
new file mode 100755
index 0000000..a0dc722
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestCallLogger.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+import java.text.*;
+import java.util.logging.*;
+
+import org.apache.http.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.util.*;
+
+/**
+ * Specialized interceptor for logging calls to a log file.
+ * <p>
+ * Causes a log entry to be created that shows all the request and response headers and content
+ * 	at the end of the request.
+ * <p>
+ * Use the {@link RestClient#logTo(Level, Logger)} and {@link RestCall#logTo(Level, Logger)}
+ * <p>
+ * methods to create instances of this class.
+ */
+public class RestCallLogger extends RestCallInterceptor {
+
+	private Level level;
+	private Logger log;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param level The log level to log messages at.
+	 * @param log The logger to log to.
+	 */
+	protected RestCallLogger(Level level, Logger log) {
+		this.level = level;
+		this.log = log;
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onInit(RestCall restCall) {
+		if (log.isLoggable(level))
+			restCall.captureResponse();
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onConnect(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res) {
+		// Do nothing.
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onRetry(RestCall restCall, int statusCode, HttpRequest req, HttpResponse res, Exception ex) {
+		if (log.isLoggable(level)) {
+			if (ex == null)
+			log.log(level, MessageFormat.format("Call to {0} returned {1}.  Will retry.", req.getRequestLine().getUri(), statusCode)); //$NON-NLS-1$
+			else
+				log.log(level, MessageFormat.format("Call to {0} caused exception {1}.  Will retry.", req.getRequestLine().getUri(), ex.getLocalizedMessage()), ex); //$NON-NLS-1$
+		}
+	}
+
+	@Override /* RestCallInterceptor */
+	public void onClose(RestCall restCall) throws RestCallException {
+		try {
+			if (log.isLoggable(level)) {
+				String output = restCall.getCapturedResponse();
+				StringBuilder sb = new StringBuilder();
+				HttpUriRequest req = restCall.getRequest();
+				HttpResponse res = restCall.getResponse();
+				if (req != null) {
+					sb.append("\n=== HTTP Call ==================================================================");
+
+					sb.append("\n=== REQUEST ===\n").append(req);
+					sb.append("\n---request headers---");
+					for (Header h : req.getAllHeaders())
+						sb.append("\n").append(h);
+					if (req instanceof HttpEntityEnclosingRequestBase) {
+						sb.append("\n---request entity---");
+						HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
+						HttpEntity e = req2.getEntity();
+						if (e == null)
+							sb.append("\nEntity is null");
+						else {
+							if (e.getContentType() != null)
+								sb.append("\n").append(e.getContentType());
+							if (e.getContentEncoding() != null)
+								sb.append("\n").append(e.getContentEncoding());
+							if (e.isRepeatable()) {
+								try {
+									sb.append("\n---request content---\n").append(EntityUtils.toString(e));
+								} catch (Exception ex) {
+									throw new RuntimeException(ex);
+								}
+							}
+						}
+					}
+				}
+				if (res != null) {
+					sb.append("\n=== RESPONSE ===\n").append(res.getStatusLine());
+					sb.append("\n---response headers---");
+					for (Header h : res.getAllHeaders())
+						sb.append("\n").append(h);
+					sb.append("\n---response content---\n").append(output);
+					sb.append("\n=== END ========================================================================");
+				}
+				log.log(level, sb.toString());
+			}
+		} catch (IOException e) {
+			log.log(Level.SEVERE, e.getLocalizedMessage(), e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$1.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$1.class
new file mode 100755
index 0000000..59a5b7c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$2.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$2.class
new file mode 100755
index 0000000..dbb30de
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$3.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$3.class
new file mode 100755
index 0000000..bf86a9a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$4.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$4.class
new file mode 100755
index 0000000..0d56649
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.class
new file mode 100755
index 0000000..f169511
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.java
new file mode 100755
index 0000000..a63018e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestClient.java
@@ -0,0 +1,1378 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.lang.reflect.Proxy;
+import java.net.*;
+import java.security.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.logging.*;
+import java.util.regex.*;
+
+import javax.net.ssl.*;
+
+import org.apache.http.*;
+import org.apache.http.auth.*;
+import org.apache.http.client.*;
+import org.apache.http.client.CookieStore;
+import org.apache.http.client.config.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.config.*;
+import org.apache.http.conn.*;
+import org.apache.http.conn.routing.*;
+import org.apache.http.conn.socket.*;
+import org.apache.http.conn.ssl.*;
+import org.apache.http.conn.util.*;
+import org.apache.http.cookie.*;
+import org.apache.http.entity.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.impl.conn.*;
+import org.apache.http.protocol.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.urlencoding.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Utility class for interfacing with remote REST interfaces.
+ *
+ *
+ * <h6 class='topic'>Features</h6>
+ * <ul>
+ * 	<li>Convert POJOs directly to HTTP request message bodies using {@link Serializer} class.
+ * 	<li>Convert HTTP response message bodies directly to POJOs using {@link Parser} class.
+ * 	<li>Fluent interface.
+ * 	<li>Thread safe.
+ * 	<li>API for interacting with remoteable services.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client &gt; REST client API</a> for more information and code examples.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class RestClient extends CoreApi {
+
+	Map<String,Object> headers = new TreeMap<String,Object>(String.CASE_INSENSITIVE_ORDER);
+	CloseableHttpClient httpClient;
+	HttpClientBuilder httpClientBuilder;
+	HttpClientConnectionManager connectionManager;
+	Serializer<?> serializer;
+	UrlEncodingSerializer urlEncodingSerializer = new UrlEncodingSerializer();  // Used for form posts only.
+	Parser<?> parser;
+	String accept, contentType;
+	List<RestCallInterceptor> interceptors = new ArrayList<RestCallInterceptor>();
+	String remoteableServletUri;
+	private Map<Method,String> remoteableServiceUriMap = new ConcurrentHashMap<Method,String>();
+	private String rootUrl;
+	private SSLOpts sslOpts;
+
+	/**
+	 * Create a new client with no serializer, parser, or HTTP client.
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 */
+	public RestClient() {
+	}
+
+	/**
+	 * Create a new client with the specified HTTP client.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 */
+	public RestClient(CloseableHttpClient httpClient) {
+		setHttpClient(httpClient);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setSerializer(s).setParser(p);
+	 * </p>
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 *
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 */
+	public RestClient(Serializer<?> s, Parser<?> p) {
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient).setSerializer(s).setParser(p);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 */
+	public RestClient(CloseableHttpClient httpClient, Serializer<?> s, Parser<?> p) {
+		setHttpClient(httpClient);
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setSerializer(s).setParser(p);
+	 * </p>
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 *
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public RestClient(Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException {
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient).setSerializer(s).setParser(p);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public RestClient(CloseableHttpClient httpClient, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException {
+		setHttpClient(httpClient);
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Creates an instance of an {@link HttpClient} to be used to handle all HTTP communications with the target server.
+	 * <p>
+	 * This HTTP client is used when the HTTP client is not specified through one of the constructors or the
+	 * 	{@link #setHttpClient(CloseableHttpClient)} method.
+	 * <p>
+	 * Subclasses can override this method to provide specially-configured HTTP clients to handle
+	 * 	stuff such as SSL/TLS certificate handling, authentication, etc.
+	 * <p>
+	 * The default implementation returns an instance of {@link HttpClient} using the client builder
+	 * 	returned by {@link #getHttpClientBuilder()}.
+	 *
+	 * @return The HTTP client to use.
+	 * @throws Exception
+	 */
+	protected CloseableHttpClient createHttpClient() throws Exception {
+		return getHttpClientBuilder().build();
+	}
+
+	/**
+	 * Returns the {@link HttpClientBuilder} used to create {@link HttpClient httpClient} in {@link #createHttpClient()}.
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	protected HttpClientBuilder getHttpClientBuilder() {
+		if (httpClientBuilder == null)
+			httpClientBuilder = createHttpClientBuilder();
+		return httpClientBuilder;
+	}
+
+	/**
+	 * Creates an instance of an {@link HttpClientBuilder} to be used to create
+	 * 	the {@link HttpClient} the first time {@link #getHttpClientBuilder()} is called.
+	 * <p>
+	 * 	Subclasses can override this method to provide their own client builder.
+	 * </p>
+	 * <p>
+	 * 	The predefined method returns an {@link HttpClientBuilder} with the following settings:
+	 * </p>
+	 * <ul>
+	 * 	<li>Lax redirect strategy.
+	 * 	<li>The connection manager returned by {@link #getConnectionManager()}.
+	 * </ul>
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	protected HttpClientBuilder createHttpClientBuilder() {
+		HttpClientBuilder b = HttpClientBuilder.create();
+		b.setRedirectStrategy(new LaxRedirectStrategy());
+		b.setConnectionManager(getConnectionManager());
+		return b;
+	}
+
+	/**
+	 * Returns the {@link HttpClientConnectionManager} passed to the {@link HttpClientBuilder} created in {@link #createHttpClientBuilder()}.
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	protected HttpClientConnectionManager getConnectionManager() {
+		if (connectionManager == null)
+			connectionManager = createConnectionManager();
+		return connectionManager;
+	}
+
+	/**
+	 * Creates the {@link HttpClientConnectionManager} returned by {@link #getConnectionManager()}.
+	 * <p>
+	 * 	Subclasses can override this method to provide their own connection manager.
+	 * </p>
+	 * <p>
+	 * 	The default implementation returns an instance of a {@link PoolingHttpClientConnectionManager}.
+	 * </p>
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	protected HttpClientConnectionManager createConnectionManager() {
+		if (sslOpts != null) {
+			HostnameVerifier hv = null;
+			switch (sslOpts.getHostVerify()) {
+				case LAX: hv = new NoopHostnameVerifier(); break;
+				case DEFAULT: hv = new DefaultHostnameVerifier(); break;
+			}
+
+			for (String p : StringUtils.split(sslOpts.getProtocols(), ',')) {
+				try {
+					TrustManager tm = new SimpleX509TrustManager(sslOpts.getCertValidate() == SSLOpts.CertValidate.LAX);
+
+					SSLContext ctx = SSLContext.getInstance(p);
+					ctx.init(null, new TrustManager[] { tm }, null);
+
+					// Create a socket to ensure this algorithm is acceptable.
+					// This will correctly disallow certain configurations (such as SSL_TLS under FIPS)
+					ctx.getSocketFactory().createSocket().close();
+					SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(ctx, hv);
+					setSSLSocketFactory(sf);
+
+					Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sf).build();
+
+					return new PoolingHttpClientConnectionManager(r);
+				} catch (Throwable t) {}
+			}
+		}
+
+			// Using pooling connection so that this client is threadsafe.
+		return new PoolingHttpClientConnectionManager();
+	}
+
+	/**
+	 * Set up this client to use BASIC auth.
+	 *
+	 * @param host The auth scope hostname.
+	 * @param port The auth scope port.
+	 * @param user The username.
+	 * @param pw The password.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setBasicAuth(String host, int port, String user, String pw) {
+		AuthScope scope = new AuthScope(host, port);
+		Credentials up = new UsernamePasswordCredentials(user, pw);
+		CredentialsProvider p = new BasicCredentialsProvider();
+		p.setCredentials(scope, up);
+		setDefaultCredentialsProvider(p);
+		return this;
+	}
+
+	/**
+	 * Calls {@link CloseableHttpClient#close()} on the underlying {@link CloseableHttpClient}.
+	 * It's good practice to call this method after the client is no longer used.
+	 *
+	 * @throws IOException
+	 */
+	public void close() throws IOException {
+		if (httpClient != null)
+			httpClient.close();
+	}
+
+	/**
+	 * Specifies a request header property to add to all requests created by this client.
+	 *
+	 * @param name The HTTP header name.
+	 * @param value The HTTP header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setHeader(String name, Object value) {
+		this.headers.put(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets the serializer used for serializing POJOs to the HTTP request message body.
+	 *
+	 * @param serializer The serializer.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setSerializer(Serializer<?> serializer) {
+		this.serializer = serializer;
+		return this;
+	}
+
+	/**
+	 * Same as {@link #setSerializer(Serializer)}, except takes in a serializer class that
+	 * 	will be instantiated through a no-arg constructor.
+	 *
+	 * @param c The serializer class.
+	 * @return This object (for method chaining).
+	 * @throws InstantiationException If serializer could not be instantiated.
+	 */
+	public RestClient setSerializer(Class<? extends Serializer<?>> c) throws InstantiationException {
+		try {
+			return setSerializer(c.newInstance());
+		} catch (IllegalAccessException e) {
+			throw new InstantiationException(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Sets the parser used for parsing POJOs from the HTTP response message body.
+	 *
+	 * @param parser The parser.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setParser(Parser<?> parser) {
+		this.parser = parser;
+		this.accept = parser.getMediaTypes()[0];
+		return this;
+	}
+
+	/**
+	 * Same as {@link #setParser(Parser)}, except takes in a parser class that
+	 * 	will be instantiated through a no-arg constructor.
+	 *
+	 * @param c The parser class.
+	 * @return This object (for method chaining).
+	 * @throws InstantiationException If parser could not be instantiated.
+	 */
+	public RestClient setParser(Class<? extends Parser<?>> c) throws InstantiationException {
+		try {
+			return setParser(c.newInstance());
+		} catch (IllegalAccessException e) {
+			throw new InstantiationException(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Sets the internal {@link HttpClient} to use for handling HTTP communications.
+	 *
+	 * @param httpClient The HTTP client.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setHttpClient(CloseableHttpClient httpClient) {
+		this.httpClient = httpClient;
+		return this;
+	}
+
+	/**
+	 * Adds an interceptor that gets called immediately after a connection is made.
+	 *
+	 * @param interceptor The interceptor.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient addInterceptor(RestCallInterceptor interceptor) {
+		interceptors.add(interceptor);
+		return this;
+	}
+
+	/**
+	 * Adds a {@link RestCallLogger} to the list of interceptors on this class.
+	 *
+	 * @param level The log level to log messsages at.
+	 * @param log The logger to log messages to.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient logTo(Level level, Logger log) {
+		addInterceptor(new RestCallLogger(level, log));
+		return this;
+	}
+
+	/**
+	 * Returns the serializer currently associated with this client.
+	 *
+	 * @return The serializer currently associated with this client, or <jk>null</jk> if no serializer is currently associated.
+	 */
+	public Serializer<?> getSerializer() {
+		return serializer;
+	}
+
+	/**
+	 * Returns the parser currently associated with this client.
+	 *
+	 * @return The parser currently associated with this client, or <jk>null</jk> if no parser is currently associated.
+	 */
+	public Parser<?> getParser() {
+		return parser;
+	}
+
+	/**
+	 * Returns the {@link HttpClient} currently associated with this client.
+	 *
+	 * @return The HTTP client currently associated with this client.
+	 * @throws Exception
+	 */
+	public HttpClient getHttpClient() throws Exception {
+		if (httpClient == null)
+			httpClient = createHttpClient();
+		return httpClient;
+	}
+
+	/**
+	 * Execute the specified request.
+	 * Subclasses can override this method to provide specialized handling.
+	 *
+	 * @param req The HTTP request.
+	 * @return The HTTP response.
+	 * @throws Exception
+	 */
+	protected HttpResponse execute(HttpUriRequest req) throws Exception {
+		return getHttpClient().execute(req);
+	}
+
+	/**
+	 * Sets the value for the <code>Accept</code> request header.
+	 * <p>
+	 * 	This overrides the media type specified on the parser, but is overridden by calling <code>setHeader(<js>"Accept"</js>, newvalue);</code>
+	 *
+	 * @param accept The new header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setAccept(String accept) {
+		this.accept = accept;
+		return this;
+	}
+
+	/**
+	 * Sets the value for the <code>Content-Type</code> request header.
+	 * <p>
+	 * 	This overrides the media type specified on the serializer, but is overridden by calling <code>setHeader(<js>"Content-Type"</js>, newvalue);</code>
+	 *
+	 * @param contentType The new header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setContentType(String contentType) {
+		this.contentType = contentType;
+		return this;
+	}
+
+	/**
+	 * Sets the URI of the remoteable services REST servlet for invoking remoteable services.
+	 *
+	 * @param remoteableServletUri The URI of the REST resource implementing a remoteable services servlet.
+	 *		(typically an instance of <code>RemoteableServlet</code>).
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setRemoteableServletUri(String remoteableServletUri) {
+		this.remoteableServletUri = remoteableServletUri;
+		return this;
+	}
+
+	/**
+	 * Set a root URL for this client.
+	 * <p>
+	 * When set, URL strings passed in through the various rest call methods (e.g. {@link #doGet(Object)}
+	 * 	will be prefixed with the specified root.
+	 * This root URL is ignored on those methods if you pass in a {@link URL}, {@link URI}, or an absolute URL string.
+	 *
+	 * @param rootUrl The root URL to prefix to relative URL strings.  Trailing slashes are trimmed.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setRootUrl(String rootUrl) {
+		if (rootUrl.endsWith("/"))
+			rootUrl = rootUrl.replaceAll("\\/$", "");
+		this.rootUrl = rootUrl;
+		return this;
+	}
+
+	/**
+	 * Enable SSL support on this client.
+	 *
+	 * @param opts The SSL configuration options.  See {@link SSLOpts} for details.
+	 * 	This method is a no-op if <code>sslConfig</code> is <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public RestClient enableSSL(SSLOpts opts) throws KeyStoreException, NoSuchAlgorithmException {
+		this.sslOpts = opts;
+		return this;
+	}
+
+	/**
+	 * Enable LAX SSL support.
+	 * <p>
+	 * Certificate chain validation and hostname verification is disabled.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public RestClient enableLaxSSL() throws KeyStoreException, NoSuchAlgorithmException {
+		return enableSSL(SSLOpts.LAX);
+	}
+
+	/**
+	 * Perform a <code>GET</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doGet(Object url) throws RestCallException {
+		return doCall("GET", url, false);
+	}
+
+	/**
+	 * Perform a <code>PUT</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doPut(Object url, Object o) throws RestCallException {
+		return doCall("PUT", url, true).setInput(o);
+	}
+
+	/**
+	 * Perform a <code>POST</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doPost(Object url, Object o) throws RestCallException {
+		return doCall("POST", url, true).setInput(o);
+	}
+
+	/**
+	 * Perform a <code>DELETE</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doDelete(Object url) throws RestCallException {
+		return doCall("DELETE", url, false);
+	}
+
+	/**
+	 * Perform an <code>OPTIONS</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doOptions(Object url) throws RestCallException {
+		return doCall("OPTIONS", url, true);
+	}
+
+	/**
+	 * Perform a <code>POST</code> request with a content type of <code>application/x-www-form-urlencoded</code> against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request, serialized as a form post
+	 * 	using the {@link UrlEncodingSerializer#DEFAULT} serializer.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doFormPost(Object url, Object o) throws RestCallException {
+		return doCall("POST", url, true)
+			.setInput(new RestRequestEntity(o, urlEncodingSerializer));
+	}
+
+	/**
+	 * Performs a REST call where the entire call is specified in a simple string.
+	 * <p>
+	 * This method is useful for performing callbacks when the target of a callback is passed in
+	 * on an initial request, for example to signal when a long-running process has completed.
+	 * <p>
+	 * The call string can be any of the following formats:
+	 * <ul>
+	 * 	<li><js>"[method] [url]"</js> - e.g. <js>"GET http://localhost/callback"</js>
+	 * 	<li><js>"[method] [url] [payload]"</js> - e.g. <js>"POST http://localhost/callback some text payload"</js>
+	 * 	<li><js>"[method] [headers] [url] [payload]"</js> - e.g. <js>"POST {'Content-Type':'text/json'} http://localhost/callback {'some':'json'}"</js>
+	 * </ul>
+	 * <p>
+	 * The payload will always be sent using a simple {@link StringEntity}.
+	 *
+	 * @param callString The call string.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException
+	 */
+	public RestCall doCallback(String callString) throws RestCallException {
+		String s = callString;
+		try {
+			RestCall rc = null;
+			String method = null, uri = null, content = null;
+			ObjectMap h = null;
+			int i = s.indexOf(' ');
+			if (i != -1) {
+				method = s.substring(0, i).trim();
+				s = s.substring(i).trim();
+				if (s.length() > 0) {
+					if (s.charAt(0) == '{') {
+						i = s.indexOf('}');
+						if (i != -1) {
+							String json = s.substring(0, i+1);
+							h = JsonParser.DEFAULT.parse(json, ObjectMap.class);
+							s = s.substring(i+1).trim();
+						}
+					}
+					if (s.length() > 0) {
+						i = s.indexOf(' ');
+						if (i == -1)
+							uri = s;
+						else {
+							uri = s.substring(0, i).trim();
+							s = s.substring(i).trim();
+							if (s.length() > 0)
+								content = s;
+						}
+					}
+				}
+			}
+			if (method != null && uri != null) {
+				rc = doCall(method, uri, content != null);
+				if (content != null)
+					rc.setInput(new StringEntity(content));
+				if (h != null)
+					for (Map.Entry<String,Object> e : h.entrySet())
+						rc.setHeader(e.getKey(), e.getValue());
+				return rc;
+			}
+		} catch (Exception e) {
+			throw new RestCallException(e);
+		}
+		throw new RestCallException("Invalid format for call string.");
+	}
+
+	/**
+	 * Perform a generic REST call.
+	 *
+	 * @param method The HTTP method.
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param content The HTTP body content.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * 	This parameter is IGNORED if {@link HttpMethod#hasContent()} is <jk>false</jk>.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doCall(HttpMethod method, Object url, Object content) throws RestCallException {
+		RestCall rc = doCall(method.name(), url, method.hasContent());
+		if (method.hasContent())
+			rc.setInput(content);
+		return rc;
+	}
+
+	/**
+	 * Perform a generic REST call.
+	 *
+	 * @param method The method name (e.g. <js>"GET"</js>, <js>"OPTIONS"</js>).
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param hasContent Boolean flag indicating if the specified request has content associated with it.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doCall(String method, Object url, boolean hasContent) throws RestCallException {
+		HttpRequestBase req = null;
+		RestCall restCall = null;
+		final String methodUC = method.toUpperCase(Locale.ENGLISH);
+		if (hasContent) {
+			req = new HttpEntityEnclosingRequestBase() {
+				@Override /* HttpRequest */
+				public String getMethod() {
+					return methodUC;
+				}
+			};
+			restCall = new RestCall(this, req);
+			if (contentType != null)
+				restCall.setHeader("Content-Type", contentType);
+		} else {
+			req = new HttpRequestBase() {
+				@Override /* HttpRequest */
+				public String getMethod() {
+					return methodUC;
+				}
+			};
+			restCall = new RestCall(this, req);
+		}
+		try {
+			req.setURI(toURI(url));
+		} catch (URISyntaxException e) {
+			throw new RestCallException(e);
+		}
+		if (accept != null)
+			restCall.setHeader("Accept", accept);
+		for (Map.Entry<String,? extends Object> e : headers.entrySet())
+			restCall.setHeader(e.getKey(), e.getValue());
+		return restCall;
+	}
+
+	/**
+	 * Create a new proxy interface for the specified remoteable service interface.
+	 *
+	 * @param interfaceClass The interface to create a proxy for.
+	 * @return The new proxy interface.
+	 * @throws RuntimeException If the Remotable service URI has not been specified on this
+	 * 	client by calling {@link #setRemoteableServletUri(String)}.
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T getRemoteableProxy(final Class<T> interfaceClass) {
+		if (remoteableServletUri == null)
+			throw new RuntimeException("Remoteable service URI has not been specified.");
+		return (T)Proxy.newProxyInstance(
+			interfaceClass.getClassLoader(),
+			new Class[] { interfaceClass },
+			new InvocationHandler() {
+				@Override /* InvocationHandler */
+				public Object invoke(Object proxy, Method method, Object[] args) {
+					try {
+						String uri = remoteableServiceUriMap.get(method);
+						if (uri == null) {
+							// Constructing this string each time can be time consuming, so cache it.
+							uri = remoteableServletUri + '/' + interfaceClass.getName() + '/' + ClassUtils.getMethodSignature(method);
+							remoteableServiceUriMap.put(method, uri);
+						}
+						return doPost(uri, args).getResponse(method.getReturnType());
+					} catch (Exception e) {
+						throw new RuntimeException(e);
+					}
+				}
+		});
+	}
+
+	private Pattern absUrlPattern = Pattern.compile("^\\w+\\:\\/\\/.*");
+
+	private URI toURI(Object url) throws URISyntaxException {
+		assertFieldNotNull(url, "url");
+		if (url instanceof URI)
+			return (URI)url;
+		if (url instanceof URL)
+			((URL)url).toURI();
+		String s = url.toString();
+		if (rootUrl != null && ! absUrlPattern.matcher(s).matches()) {
+			if (s.isEmpty())
+				s = rootUrl;
+			else {
+				StringBuilder sb = new StringBuilder(rootUrl);
+				if (! s.startsWith("/"))
+					sb.append('/');
+				sb.append(s);
+				s = sb.toString();
+			}
+		}
+		return new URI(s);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* CoreAPI */
+	public RestClient setProperty(String property, Object value) throws LockedException {
+		super.setProperty(property, value);
+		if (serializer != null)
+			serializer.setProperty(property, value);
+		if (parser != null)
+			parser.setProperty(property, value);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient setProperties(ObjectMap properties) throws LockedException {
+		super.setProperties(properties);
+		if (serializer != null)
+			serializer.setProperties(properties);
+		if (parser != null)
+			parser.setProperties(properties);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setProperties(properties);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		if (serializer != null)
+			serializer.addNotBeanClasses(classes);
+		if (parser != null)
+			parser.addNotBeanClasses(classes);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		if (serializer != null)
+			serializer.addFilters(classes);
+		if (parser != null)
+			parser.addFilters(classes);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public <T> RestClient addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		if (serializer != null)
+			serializer.addImplClass(interfaceClass, implClass);
+		if (parser != null)
+			parser.addImplClass(interfaceClass, implClass);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		if (serializer != null)
+			serializer.setClassLoader(classLoader);
+		if (parser != null)
+			parser.setClassLoader(classLoader);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setClassLoader(classLoader);
+		return this;
+	}
+
+
+	//------------------------------------------------------------------------------------------------
+	// Passthrough methods for HttpClientBuilder.
+	//------------------------------------------------------------------------------------------------
+
+	/**
+	 * @param redirectStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRedirectStrategy(RedirectStrategy)
+	 */
+	public RestClient setRedirectStrategy(RedirectStrategy redirectStrategy) {
+		getHttpClientBuilder().setRedirectStrategy(redirectStrategy);
+		return this;
+	}
+
+	/**
+	 * @param cookieSpecRegistry
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCookieSpecRegistry(Lookup)
+	 */
+	public RestClient setDefaultCookieSpecRegistry(Lookup<CookieSpecProvider> cookieSpecRegistry) {
+		getHttpClientBuilder().setDefaultCookieSpecRegistry(cookieSpecRegistry);
+		return this;
+	}
+
+	/**
+	 * @param requestExec
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRequestExecutor(HttpRequestExecutor)
+	 */
+	public RestClient setRequestExecutor(HttpRequestExecutor requestExec) {
+		getHttpClientBuilder().setRequestExecutor(requestExec);
+		return this;
+	}
+
+	/**
+	 * @param hostnameVerifier
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLHostnameVerifier(HostnameVerifier)
+	 */
+	public RestClient setSSLHostnameVerifier(HostnameVerifier hostnameVerifier) {
+		getHttpClientBuilder().setSSLHostnameVerifier(hostnameVerifier);
+		return this;
+	}
+
+	/**
+	 * @param publicSuffixMatcher
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setPublicSuffixMatcher(PublicSuffixMatcher)
+	 */
+	public RestClient setPublicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) {
+		getHttpClientBuilder().setPublicSuffixMatcher(publicSuffixMatcher);
+		return this;
+	}
+
+	/**
+	 * @param sslContext
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLContext(SSLContext)
+	 */
+	public RestClient setSSLContext(SSLContext sslContext) {
+		getHttpClientBuilder().setSSLContext(sslContext);
+		return this;
+	}
+
+	/**
+	 * @param sslSocketFactory
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLSocketFactory(LayeredConnectionSocketFactory)
+	 */
+	public RestClient setSSLSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) {
+		getHttpClientBuilder().setSSLSocketFactory(sslSocketFactory);
+		return this;
+	}
+
+	/**
+	 * @param maxConnTotal
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setMaxConnTotal(int)
+	 */
+	public RestClient setMaxConnTotal(int maxConnTotal) {
+		getHttpClientBuilder().setMaxConnTotal(maxConnTotal);
+		return this;
+	}
+
+	/**
+	 * @param maxConnPerRoute
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setMaxConnPerRoute(int)
+	 */
+	public RestClient setMaxConnPerRoute(int maxConnPerRoute) {
+		getHttpClientBuilder().setMaxConnPerRoute(maxConnPerRoute);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultSocketConfig(SocketConfig)
+	 */
+	public RestClient setDefaultSocketConfig(SocketConfig config) {
+		getHttpClientBuilder().setDefaultSocketConfig(config);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultConnectionConfig(ConnectionConfig)
+	 */
+	public RestClient setDefaultConnectionConfig(ConnectionConfig config) {
+		getHttpClientBuilder().setDefaultConnectionConfig(config);
+		return this;
+	}
+
+	/**
+	 * @param connTimeToLive
+	 * @param connTimeToLiveTimeUnit
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionTimeToLive(long,TimeUnit)
+	 */
+	public RestClient setConnectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) {
+		getHttpClientBuilder().setConnectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit);
+		return this;
+	}
+
+	/**
+	 * @param connManager
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionManager(HttpClientConnectionManager)
+	 */
+	public RestClient setConnectionManager(HttpClientConnectionManager connManager) {
+		this.connectionManager = connManager;
+		getHttpClientBuilder().setConnectionManager(connManager);
+		return this;
+	}
+
+	/**
+	 * @param shared
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionManagerShared(boolean)
+	 */
+	public RestClient setConnectionManagerShared(boolean shared) {
+		getHttpClientBuilder().setConnectionManagerShared(shared);
+		return this;
+	}
+
+	/**
+	 * @param reuseStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionReuseStrategy(ConnectionReuseStrategy)
+	 */
+	public RestClient setConnectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) {
+		getHttpClientBuilder().setConnectionReuseStrategy(reuseStrategy);
+		return this;
+	}
+
+	/**
+	 * @param keepAliveStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setKeepAliveStrategy(ConnectionKeepAliveStrategy)
+	 */
+	public RestClient setKeepAliveStrategy(ConnectionKeepAliveStrategy keepAliveStrategy) {
+		getHttpClientBuilder().setKeepAliveStrategy(keepAliveStrategy);
+		return this;
+	}
+
+	/**
+	 * @param targetAuthStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setTargetAuthenticationStrategy(AuthenticationStrategy)
+	 */
+	public RestClient setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy) {
+		getHttpClientBuilder().setTargetAuthenticationStrategy(targetAuthStrategy);
+		return this;
+	}
+
+	/**
+	 * @param proxyAuthStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setProxyAuthenticationStrategy(AuthenticationStrategy)
+	 */
+	public RestClient setProxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy) {
+		getHttpClientBuilder().setProxyAuthenticationStrategy(proxyAuthStrategy);
+		return this;
+	}
+
+	/**
+	 * @param userTokenHandler
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setUserTokenHandler(UserTokenHandler)
+	 */
+	public RestClient setUserTokenHandler(UserTokenHandler userTokenHandler) {
+		getHttpClientBuilder().setUserTokenHandler(userTokenHandler);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableConnectionState()
+	 */
+	public RestClient disableConnectionState() {
+		getHttpClientBuilder().disableConnectionState();
+		return this;
+	}
+
+	/**
+	 * @param schemePortResolver
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSchemePortResolver(SchemePortResolver)
+	 */
+	public RestClient setSchemePortResolver(SchemePortResolver schemePortResolver) {
+		getHttpClientBuilder().setSchemePortResolver(schemePortResolver);
+		return this;
+	}
+
+	/**
+	 * @param userAgent
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setUserAgent(String)
+	 */
+	public RestClient setUserAgent(String userAgent) {
+		getHttpClientBuilder().setUserAgent(userAgent);
+		return this;
+	}
+
+	/**
+	 * @param defaultHeaders
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultHeaders(Collection)
+	 */
+	public RestClient setDefaultHeaders(Collection<? extends Header> defaultHeaders) {
+		getHttpClientBuilder().setDefaultHeaders(defaultHeaders);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorFirst(HttpResponseInterceptor)
+	 */
+	public RestClient addInterceptorFirst(HttpResponseInterceptor itcp) {
+		getHttpClientBuilder().addInterceptorFirst(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorLast(HttpResponseInterceptor)
+	 */
+	public RestClient addInterceptorLast(HttpResponseInterceptor itcp) {
+		getHttpClientBuilder().addInterceptorLast(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorFirst(HttpRequestInterceptor)
+	 */
+	public RestClient addInterceptorFirst(HttpRequestInterceptor itcp) {
+		getHttpClientBuilder().addInterceptorFirst(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorLast(HttpRequestInterceptor)
+	 */
+	public RestClient addInterceptorLast(HttpRequestInterceptor itcp) {
+		getHttpClientBuilder().addInterceptorLast(itcp);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableCookieManagement()
+	 */
+	public RestClient disableCookieManagement() {
+		getHttpClientBuilder().disableCookieManagement();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableContentCompression()
+	 */
+	public RestClient disableContentCompression() {
+		getHttpClientBuilder().disableContentCompression();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableAuthCaching()
+	 */
+	public RestClient disableAuthCaching() {
+		getHttpClientBuilder().disableAuthCaching();
+		return this;
+	}
+
+	/**
+	 * @param httpprocessor
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setHttpProcessor(HttpProcessor)
+	 */
+	public RestClient setHttpProcessor(HttpProcessor httpprocessor) {
+		getHttpClientBuilder().setHttpProcessor(httpprocessor);
+		return this;
+	}
+
+	/**
+	 * @param retryHandler
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRetryHandler(HttpRequestRetryHandler)
+	 */
+	public RestClient setRetryHandler(HttpRequestRetryHandler retryHandler) {
+		getHttpClientBuilder().setRetryHandler(retryHandler);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableAutomaticRetries()
+	 */
+	public RestClient disableAutomaticRetries() {
+		getHttpClientBuilder().disableAutomaticRetries();
+		return this;
+	}
+
+	/**
+	 * @param proxy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setProxy(HttpHost)
+	 */
+	public RestClient setProxy(HttpHost proxy) {
+		getHttpClientBuilder().setProxy(proxy);
+		return this;
+	}
+
+	/**
+	 * @param routePlanner
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRoutePlanner(HttpRoutePlanner)
+	 */
+	public RestClient setRoutePlanner(HttpRoutePlanner routePlanner) {
+		getHttpClientBuilder().setRoutePlanner(routePlanner);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableRedirectHandling()
+	 */
+	public RestClient disableRedirectHandling() {
+		getHttpClientBuilder().disableRedirectHandling();
+		return this;
+	}
+
+	/**
+	 * @param connectionBackoffStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionBackoffStrategy(ConnectionBackoffStrategy)
+	 */
+	public RestClient setConnectionBackoffStrategy(ConnectionBackoffStrategy connectionBackoffStrategy) {
+		getHttpClientBuilder().setConnectionBackoffStrategy(connectionBackoffStrategy);
+		return this;
+	}
+
+	/**
+	 * @param backoffManager
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setBackoffManager(BackoffManager)
+	 */
+	public RestClient setBackoffManager(BackoffManager backoffManager) {
+		getHttpClientBuilder().setBackoffManager(backoffManager);
+		return this;
+	}
+
+	/**
+	 * @param serviceUnavailStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)
+	 */
+	public RestClient setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) {
+		getHttpClientBuilder().setServiceUnavailableRetryStrategy(serviceUnavailStrategy);
+		return this;
+	}
+
+	/**
+	 * @param cookieStore
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCookieStore(CookieStore)
+	 */
+	public RestClient setDefaultCookieStore(CookieStore cookieStore) {
+		getHttpClientBuilder().setDefaultCookieStore(cookieStore);
+		return this;
+	}
+
+	/**
+	 * @param credentialsProvider
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCredentialsProvider(CredentialsProvider)
+	 */
+	public RestClient setDefaultCredentialsProvider(CredentialsProvider credentialsProvider) {
+		getHttpClientBuilder().setDefaultCredentialsProvider(credentialsProvider);
+		return this;
+	}
+
+	/**
+	 * @param authSchemeRegistry
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultAuthSchemeRegistry(Lookup)
+	 */
+	public RestClient setDefaultAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) {
+		getHttpClientBuilder().setDefaultAuthSchemeRegistry(authSchemeRegistry);
+		return this;
+	}
+
+	/**
+	 * @param contentDecoderMap
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setContentDecoderRegistry(Map)
+	 */
+	public RestClient setContentDecoderRegistry(Map<String,InputStreamFactory> contentDecoderMap) {
+		getHttpClientBuilder().setContentDecoderRegistry(contentDecoderMap);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultRequestConfig(RequestConfig)
+	 */
+	public RestClient setDefaultRequestConfig(RequestConfig config) {
+		getHttpClientBuilder().setDefaultRequestConfig(config);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#useSystemProperties()
+	 */
+	public RestClient useSystemProperties() {
+		getHttpClientBuilder().useSystemProperties();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#evictExpiredConnections()
+	 */
+	public RestClient evictExpiredConnections() {
+		getHttpClientBuilder().evictExpiredConnections();
+		return this;
+	}
+
+	/**
+	 * @param maxIdleTime
+	 * @param maxIdleTimeUnit
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#evictIdleConnections(long,TimeUnit)
+	 */
+	public RestClient evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) {
+		getHttpClientBuilder().evictIdleConnections(maxIdleTime, maxIdleTimeUnit);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.class
new file mode 100755
index 0000000..10ee13e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.java
new file mode 100755
index 0000000..9336c23
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RestRequestEntity.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+
+import org.apache.http.entity.*;
+import org.apache.http.message.*;
+
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * HttpEntity for serializing POJOs as the body of HTTP requests.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestRequestEntity extends BasicHttpEntity {
+	final Object output;
+	final Serializer<?> serializer;
+	byte[] outputBytes;
+
+	/**
+	 * Constructor.
+	 * @param input The POJO to serialize.  Can also be a {@link Reader} or {@link InputStream}.
+	 * @param serializer The serializer to use to serialize this response.
+	 */
+	public RestRequestEntity(Object input, Serializer<?> serializer) {
+		this.output = input;
+		this.serializer = serializer;
+		if (serializer != null)
+			setContentType(new BasicHeader("Content-Type", serializer.getResponseContentType()));
+	}
+
+	@Override /* BasicHttpEntity */
+	public void writeTo(OutputStream os) throws IOException {
+		if (output instanceof InputStream) {
+			IOPipe.create(output, os).closeOut().run();
+		} else if (output instanceof Reader) {
+			IOPipe.create(output, new OutputStreamWriter(os, IOUtils.UTF8)).closeOut().run();
+		} else {
+			try {
+				if (serializer == null) {
+					// If no serializer specified, just close the stream.
+					os.close();
+				} else if (! serializer.isWriterSerializer()) {
+					OutputStreamSerializer s2 = (OutputStreamSerializer)serializer;
+					s2.serialize(output, os);
+					os.close();
+				} else {
+					Writer w = new OutputStreamWriter(os, IOUtils.UTF8);
+					WriterSerializer s2 = (WriterSerializer)serializer;
+					s2.serialize(output, w);
+					w.close();
+				}
+			} catch (SerializeException e) {
+				throw new com.ibm.juno.client.RestCallException(e);
+			}
+		}
+	}
+
+	@Override /* BasicHttpEntity */
+	public boolean isRepeatable() {
+		return true;
+	}
+
+	@Override /* BasicHttpEntity */
+	public InputStream getContent() {
+		if (outputBytes == null) {
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			try {
+				writeTo(baos);
+				outputBytes = baos.toByteArray();
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return new ByteArrayInputStream(outputBytes);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn$1.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn$1.class
new file mode 100755
index 0000000..243a150
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.class
new file mode 100755
index 0000000..5b38ebc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.java
new file mode 100755
index 0000000..6b9bf75
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/RetryOn.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+/**
+ * Used to determine whether a request should be retried based on the HTTP response code.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface RetryOn {
+
+	/**
+	 * Default RetryOn that returns <jk>true</jk> of any HTTP response &gt;= 400 is received.
+	 */
+	public static final RetryOn DEFAULT = new RetryOn() {
+		@Override /* RetryOn */
+		public boolean onCode(int httpResponseCode) {
+			return httpResponseCode <= 0 || httpResponseCode >= 400;
+		}
+	};
+
+	/**
+	 * Subclasses should override this method to determine whether the HTTP response is retryable.
+	 *
+	 * @param httpResponseCode The HTTP response code.
+	 * @return <jk>true</jk> if the specified response code is retryable.
+	 */
+	boolean onCode(int httpResponseCode);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$CertValidate.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$CertValidate.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$CertValidate.class
new file mode 100755
index 0000000..9d5c1ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$CertValidate.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$HostVerify.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$HostVerify.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$HostVerify.class
new file mode 100755
index 0000000..5e5fc3c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts$HostVerify.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.class
new file mode 100755
index 0000000..0f1923d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.java
new file mode 100755
index 0000000..2a7ed82
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SSLOpts.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * SSL configuration options that get passed to {@link RestClient#enableSSL(SSLOpts)}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SSLOpts {
+
+	private String protocols = getDefaultProtocols();
+	private CertValidate certValidate = CertValidate.DEFAULT;
+	private HostVerify hostVerify = HostVerify.DEFAULT;
+
+	/**
+	 * Reusable SSL options for lenient SSL (no cert validation or hostname verification).
+	 */
+	public static final SSLOpts LAX = new SSLOpts(null, CertValidate.LAX, HostVerify.LAX);
+
+	/**
+	 * Reusable SSL options for normal SSL (default cert validation and hostname verification).
+	 */
+	public static final SSLOpts DEFAULT = new SSLOpts(null, CertValidate.DEFAULT, HostVerify.DEFAULT);
+
+	/**
+	 * Constructor.
+	 */
+	public SSLOpts() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param protocols A comma-delimited list of supported SSL protocols.
+	 * 	If <jk>null</jk>, uses the value returned by {@link #getDefaultProtocols()}.
+	 * @param certValidate Certificate validation setting.
+	 * @param hostVerify Host verification setting.
+	 */
+	public SSLOpts(String protocols, CertValidate certValidate, HostVerify hostVerify) {
+		if (protocols != null)
+			this.protocols = protocols;
+		this.certValidate = certValidate;
+		this.hostVerify = hostVerify;
+	}
+
+	/**
+	 * Returns the default list of SSL protocols to support when the <code>protocols</code>
+	 * 	parameter on the constructor is <jk>null</jk>.
+	 * <p>
+	 * The default value is <jk>"SSL_TLS,TLS,SSL"</js> unless overridden by one of the following
+	 * 	system properties:
+	 * <ul>
+	 * 	<li><js>"com.ibm.team.repository.transport.client.protocol"</js>
+	 * 	<li><js>"transport.client.protocol"</js>
+	 * </ul>
+	 * <p>
+	 * Subclasses can override this method to provide their own logic for determining default supported protocols.
+	 *
+	 * @return The comma-delimited list of supported protocols.
+	 */
+	protected String getDefaultProtocols() {
+		String sp = System.getProperty("com.ibm.team.repository.transport.client.protocol");
+		if (StringUtils.isEmpty(sp))
+			sp = System.getProperty("transport.client.protocol");
+		if (StringUtils.isEmpty(sp))
+			sp = "SSL_TLS,TLS,SSL";
+		return sp;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>protocols</property>.
+	 *
+	 * @return The value of the <property>protocols</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public String getProtocols() {
+		return protocols;
+	}
+
+	/**
+	 * Bean property setter:  <property>protocols</property>.
+	 *
+	 * @param protocols The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setProtocols(String protocols) {
+		this.protocols = protocols;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>certValidate</property>.
+	 *
+	 * @return The value of the <property>certValidate</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public CertValidate getCertValidate() {
+		return certValidate;
+	}
+
+	/**
+	 * Bean property setter:  <property>certValidate</property>.
+	 *
+	 * @param certValidate The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setCertValidate(CertValidate certValidate) {
+		this.certValidate = certValidate;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>hostVerify</property>.
+	 *
+	 * @return The value of the <property>hostVerify</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public HostVerify getHostVerify() {
+		return hostVerify;
+	}
+
+	/**
+	 * Bean property setter:  <property>hostVerify</property>.
+	 *
+	 * @param hostVerify The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setHostVerify(HostVerify hostVerify) {
+		this.hostVerify = hostVerify;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Enums
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Certificate validation options.
+	 * <p>
+	 * Used as enum for {@link SSLOpts#getCertValidate()} property.
+	 */
+	@SuppressWarnings("hiding")
+	public static enum CertValidate {
+
+		/**
+		 * Verify that the certificate is valid, but allow for self-signed certificates.
+		 */
+		LAX,
+
+		/**
+		 * Do normal certificate chain validation.
+		 */
+		DEFAULT
+	}
+
+	/**
+	 * Certificate host verification options.
+	 * <p>
+	 * Used as enum for {@link SSLOpts#getHostVerify()} property.
+	 */
+	@SuppressWarnings("hiding")
+	public enum HostVerify {
+
+		/**
+		 * Don't verify the hostname in the certificate.
+		 */
+		LAX,
+
+		/**
+		 * Do normal hostname verification.
+		 */
+		DEFAULT
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.class
new file mode 100755
index 0000000..1dd1178
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.java
new file mode 100755
index 0000000..cdb3b2e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SerializedNameValuePair.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static com.ibm.juno.core.urlencoding.UonSerializerProperties.*;
+
+import org.apache.http.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.urlencoding.*;
+
+/**
+ * Subclass of {@link NameValuePair} for serializing POJOs as URL-encoded form post entries
+ * 	using the {@link UrlEncodingSerializer class}.
+ * <p>
+ * Example:
+ * <p class='bcode'>
+ * 	NameValuePairs params = <jk>new</jk> NameValuePairs()
+ * 		.append(<jk>new</jk> SerializedNameValuePair(<js>"myPojo"</js>, pojo, UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>))
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"someOtherParam"</js>, <js>"foobar"</js>));
+ * 	request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SerializedNameValuePair implements NameValuePair {
+	private String name;
+	private Object value;
+	private UrlEncodingSerializer serializer;
+
+	// We must be sure to disable character encoding since it's done in the http client layer.
+	private static final ObjectMap op = new ObjectMap().append(UON_encodeChars, false);
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The parameter name.
+	 * @param value The POJO to serialize to the parameter value.
+	 * @param serializer The serializer to use to convert the value to a string.
+	 */
+	public SerializedNameValuePair(String name, Object value, UrlEncodingSerializer serializer) {
+		this.name = name;
+		this.value = value;
+		this.serializer = serializer;
+	}
+
+	@Override /* NameValuePair */
+	public String getName() {
+		if (name != null && name.length() > 0) {
+			char c = name.charAt(0);
+			if (c == '$' || c == '(') {
+				try {
+					UonSerializerContext ctx = serializer.createContext(op, null);
+					return serializer.serialize(name, ctx);
+				} catch (SerializeException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		}
+		return name;
+	}
+
+	@Override /* NameValuePair */
+	public String getValue() {
+		try {
+			UonSerializerContext ctx = serializer.createContext(op, null);
+			return serializer.serialize(value, ctx);
+		} catch (SerializeException e) {
+			throw new RuntimeException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.class
new file mode 100755
index 0000000..72c6dc0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.java b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.java
new file mode 100755
index 0000000..72975cb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/SimpleX509TrustManager.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.security.*;
+import java.security.cert.*;
+
+import javax.net.ssl.*;
+
+/**
+ * A trust manager that optionally allows for self-signed certificates.
+ */
+public final class SimpleX509TrustManager implements X509TrustManager {
+
+	private X509TrustManager baseTrustManager;  // The JRE-provided trust manager used to validate certificates presented by a server.
+
+	/**
+	 * Constructor.
+	 *
+	 * @param lax If <jk>true</jk>, allow self-signed and expired certificates.
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public SimpleX509TrustManager(boolean lax) throws KeyStoreException, NoSuchAlgorithmException {
+		if (! lax) {
+			// Find the JRE-provided X509 trust manager.
+			KeyStore ks = KeyStore.getInstance("jks");
+			TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+			factory.init(ks);
+			for (TrustManager tm : factory.getTrustManagers()) {
+				if (tm instanceof X509TrustManager) {
+					baseTrustManager = (X509TrustManager)tm; // Take the first X509TrustManager we find
+					return;
+				}
+			}
+			throw new IllegalStateException("Couldn't find JRE's X509TrustManager"); //$NON-NLS-1$
+		}
+	}
+
+	@Override /* X509TrustManager */
+	public X509Certificate[] getAcceptedIssuers() {
+		return baseTrustManager == null ? new X509Certificate[0] : baseTrustManager.getAcceptedIssuers();
+	}
+
+	@Override /* X509TrustManager */
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		if (baseTrustManager != null)
+			baseTrustManager.checkClientTrusted(chain, authType);
+	}
+
+	@Override /* X509TrustManager */
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		if (baseTrustManager != null)
+			baseTrustManager.checkServerTrusted(chain, authType);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.class b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.class
new file mode 100755
index 0000000..aad4ecd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/deprecated/CertificateStore.class differ


[15/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/package.html
new file mode 100755
index 0000000..ac9a67e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jso/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Java-serialized-object support</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.class
new file mode 100755
index 0000000..035d4fa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.java
new file mode 100755
index 0000000..7beba59
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonClassMeta.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import com.ibm.juno.core.json.annotation.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class JsonClassMeta {
+
+	private final Json json;
+	private final String wrapperAttr;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param c The class that this annotation is defined on.
+	 */
+	public JsonClassMeta(Class<?> c) {
+		this.json = ReflectionUtils.getAnnotation(Json.class, c);
+		if (json != null) {
+			wrapperAttr = StringUtils.nullIfEmpty(json.wrapperAttr());
+		} else {
+			wrapperAttr = null;
+		}
+	}
+
+	/**
+	 * Returns the {@link Json} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Json} annotation, or <jk>null</jk> if not specified.
+	 */
+	protected Json getAnnotation() {
+		return json;
+	}
+
+	/**
+	 * Returns the {@link Json#wrapperAttr()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Json#wrapperAttr()} annotation, or <jk>null</jk> if not specified.
+	 */
+	protected String getWrapperAttr() {
+		return wrapperAttr;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.class
new file mode 100755
index 0000000..fe41f60
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.java
new file mode 100755
index 0000000..42cd8b9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParser.java
@@ -0,0 +1,852 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import static com.ibm.juno.core.json.JsonParserProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parses any valid JSON text into a POJO model.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Content-Type</code> types: <code>application/json, text/json</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This parser uses a state machine, which makes it very fast and efficient.  It parses JSON in about 70% of the
+ * 	time that it takes the built-in Java DOM parsers to parse equivalent XML.
+ * <p>
+ * 	This parser handles all valid JSON syntax.
+ * 	In addition, when strict mode is disable, the parser also handles the following:
+ * 	<ul>
+ * 		<li> Javascript comments (both {@code /*} and {@code //}) are ignored.
+ * 		<li> Both single and double quoted strings.
+ * 		<li> Automatically joins concatenated strings (e.g. <code><js>"aaa"</js> + <js>'bbb'</js></code>).
+ * 		<li> Unquoted attributes.
+ * 	</ul>
+ * 	Also handles negative, decimal, hexadecimal, octal, and double numbers, including exponential notation.
+ * <p>
+ * 	This parser handles the following input, and automatically returns the corresponding Java class.
+ * 	<ul>
+ * 		<li> JSON objects (<js>"{...}"</js>) are converted to {@link ObjectMap ObjectMaps}.  <br>
+ * 				Note:  If a <code><xa>_class</xa>=<xs>'xxx'</xs></code> attribute is specified on the object, then an attempt is made to convert the object
+ * 				to an instance of the specified Java bean class.  See the classProperty setting on the {@link BeanContextFactory} for more information
+ * 				about parsing beans from JSON.
+ * 		<li> JSON arrays (<js>"[...]"</js>) are converted to {@link ObjectList ObjectLists}.
+ * 		<li> JSON string literals (<js>"'xyz'"</js>) are converted to {@link String Strings}.
+ * 		<li> JSON numbers (<js>"123"</js>, including octal/hexadecimal/exponential notation) are converted to {@link Integer Integers},
+ * 				{@link Long Longs}, {@link Float Floats}, or {@link Double Doubles} depending on whether the number is decimal, and the size of the number.
+ * 		<li> JSON booleans (<js>"false"</js>) are converted to {@link Boolean Booleans}.
+ * 		<li> JSON nulls (<js>"null"</js>) are converted to <jk>null</jk>.
+ * 		<li> Input consisting of only whitespace or JSON comments are converted to <jk>null</jk>.
+ * 	</ul>
+ * <p>
+ * 	Input can be any of the following:<br>
+ * 	<ul>
+ * 		<li> <js>"{...}"</js> - Converted to a {@link ObjectMap} or an instance of a Java bean if a <xa>_class</xa> attribute is present.
+ *  		<li> <js>"[...]"</js> - Converted to a {@link ObjectList}.
+ *  		<li> <js>"123..."</js> - Converted to a {@link Number} (either {@link Integer}, {@link Long}, {@link Float}, or {@link Double}).
+ *  		<li> <js>"true"</js>/<js>"false"</js> - Converted to a {@link Boolean}.
+ *  		<li> <js>"null"</js> - Returns <jk>null</jk>.
+ *  		<li> <js>"'xxx'"</js> - Converted to a {@link String}.
+ *  		<li> <js>"\"xxx\""</js> - Converted to a {@link String}.
+ *  		<li> <js>"'xxx' + \"yyy\""</js> - Converted to a concatenated {@link String}.
+ * 	</ul>
+  * <p>
+ * 	TIP:  If you know you're parsing a JSON object or array, it can be easier to parse it using the {@link ObjectMap#ObjectMap(CharSequence) ObjectMap(CharSequence)}
+ * 		or {@link ObjectList#ObjectList(CharSequence) ObjectList(CharSequence)} constructors instead of using this class.  The end result should be the same.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Consumes({"application/json","text/json"})
+public final class JsonParser extends ReaderParser {
+
+	/** Default parser, all default settings.*/
+	public static final JsonParser DEFAULT = new JsonParser().lock();
+
+	/** Default parser, all default settings.*/
+	public static final JsonParser DEFAULT_STRICT = new JsonParser().setProperty(JSON_strictMode, true).lock();
+
+	/** JSON specific properties currently defined on this class */
+	protected transient JsonParserProperties jpp = new JsonParserProperties();
+
+	private <T> T parseAnything(JsonParserContext ctx, ClassMeta<T> nt, ParserReader r, BeanPropertyMeta p, Object outer, Object name) throws ParseException {
+
+		BeanContext bc = ctx.getBeanContext();
+		if (nt == null)
+			nt = (ClassMeta<T>)object();
+		PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+		ClassMeta<?> ft = nt.getFilteredClassMeta();
+		String wrapperAttr = ft.getJsonMeta().getWrapperAttr();
+
+		int line = r.getLine();
+		int column = r.getColumn();
+		Object o = null;
+		try {
+			skipCommentsAndSpace(ctx, r);
+			if (wrapperAttr != null)
+				skipWrapperAttrStart(ctx, r, wrapperAttr);
+			int c = r.peek();
+			if (c == -1) {
+				// Let o be null.
+			} else if ((c == ',' || c == '}' || c == ']')) {
+				if (ctx.isStrictMode())
+					throw new ParseException(line, column, "Missing value detected.");
+				// Handle bug in Cognos 10.2.1 that can product non-existent values.
+				// Let o be null;
+			} else if (c == 'n') {
+				parseKeyword("null", r);
+			} else if (ft.isObject()) {
+				if (c == '{') {
+					ObjectMap m2 = new ObjectMap(bc);
+					parseIntoMap2(ctx, r, m2, string(), object());
+					o = m2.cast();
+				} else if (c == '[')
+					o = parseIntoCollection2(ctx, r, new ObjectList(bc), object());
+				else if (c == '\'' || c == '"') {
+					o = parseString(ctx, r);
+					if (ft.isChar())
+						o = o.toString().charAt(0);
+				}
+				else if (c >= '0' && c <= '9' || c == '-')
+					o = parseNumber(ctx, r, null);
+				else if (c == 't') {
+					parseKeyword("true", r);
+					o = Boolean.TRUE;
+				} else {
+					parseKeyword("false", r);
+					o = Boolean.FALSE;
+				}
+			} else if (ft.isBoolean()) {
+				o = parseBoolean(ctx, r);
+			} else if (ft.isCharSequence()) {
+				o = parseString(ctx, r);
+			} else if (ft.isChar()) {
+				o = parseString(ctx, r).charAt(0);
+			} else if (ft.isNumber()) {
+				o = parseNumber(ctx, r, (Class<? extends Number>)ft.getInnerClass());
+			} else if (ft.isMap()) {
+				Map m = (ft.canCreateNewInstance(outer) ? (Map)ft.newInstance(outer) : new ObjectMap(bc));
+				o = parseIntoMap2(ctx, r, m, ft.getKeyType(), ft.getValueType());
+			} else if (ft.isCollection()) {
+				if (c == '{') {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap2(ctx, r, m, string(), object());
+					o = m.cast();
+				} else {
+					Collection l = (ft.canCreateNewInstance(outer) ? (Collection)ft.newInstance() : new ObjectList(bc));
+					o = parseIntoCollection2(ctx, r, l, ft.getElementType());
+				}
+			} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap2(ctx, r, m, string(), object());
+				o = ft.newInstanceFromObjectMap(outer, m);
+			} else if (ft.canCreateNewBean(outer)) {
+				BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+				o = parseIntoBeanMap2(ctx, r, m).getBean();
+			} else if (ft.canCreateNewInstanceFromString(outer) && (c == '\'' || c == '"')) {
+				o = ft.newInstanceFromString(outer, parseString(ctx, r));
+			} else if (ft.isArray()) {
+				if (c == '{') {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap2(ctx, r, m, string(), object());
+					o = m.cast();
+				} else {
+					ArrayList l = (ArrayList)parseIntoCollection2(ctx, r, new ArrayList(), ft.getElementType());
+					o = bc.toArray(ft, l);
+				}
+			} else if (c == '{' ){
+				Map m = new ObjectMap(bc);
+				parseIntoMap2(ctx, r, m, ft.getKeyType(), ft.getValueType());
+				if (m.containsKey("_class"))
+					o = ((ObjectMap)m).cast();
+				else
+					throw new ParseException(line, column, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", ft.getInnerClass().getName(), ft.getNotABeanReason());
+			} else if (ft.canCreateNewInstanceFromString(outer) && ! ctx.isStrictMode()) {
+				o = ft.newInstanceFromString(outer, parseString(ctx, r));
+			} else {
+				throw new ParseException(line, column, "Unrecognized syntax for class type ''{0}'', starting character ''{1}''", ft, (char)c);
+			}
+
+			if (wrapperAttr != null)
+				skipWrapperAttrEnd(ctx, r);
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (name != null)
+				setName(nt, o, name);
+
+			return (T)o;
+
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			if (p == null)
+				throw new ParseException("Error occurred trying to parse into class ''{0}''", ft).initCause(e);
+			throw new ParseException("Error occurred trying to parse value for bean property ''{0}'' on class ''{1}''",
+				p.getName(), p.getBeanMeta().getClassMeta()
+			).initCause(e);
+		}
+	}
+
+	private Number parseNumber(JsonParserContext ctx, ParserReader r, Class<? extends Number> type) throws IOException, ParseException {
+		int c = r.peek();
+		if (c == '\'' || c == '"')
+			return parseNumber(ctx, parseString(ctx, r), type);
+		return parseNumber(ctx, StringUtils.parseNumberString(r), type);
+	}
+
+	private Number parseNumber(JsonParserContext ctx, String s, Class<? extends Number> type) throws ParseException {
+		if (ctx.isStrictMode()) {
+			// Need to weed out octal and hexadecimal formats:  0123,-0123,0x123,-0x123.
+			// Don't weed out 0 or -0.
+			// All other number formats are supported in JSON.
+			boolean isNegative = false;
+			char c = (s.length() == 0 ? 'x' : s.charAt(0));
+			if (c == '-') {
+				isNegative = true;
+				c = (s.length() == 1 ? 'x' : s.charAt(1));
+			}
+			if (c == 'x' || (c == '0' && s.length() > (isNegative ? 2 : 1)))
+				throw new NumberFormatException("Invalid JSON number '"+s+"'");
+		}
+		return StringUtils.parseNumber(s, type);
+	}
+
+	private Boolean parseBoolean(JsonParserContext ctx, ParserReader r) throws IOException, ParseException {
+		int c = r.peek();
+		if (c == '\'' || c == '"')
+			return Boolean.valueOf(parseString(ctx, r));
+		if (c == 't') {
+			parseKeyword("true", r);
+			return Boolean.TRUE;
+		}
+		parseKeyword("false", r);
+		return Boolean.FALSE;
+	}
+
+
+	private <K,V> Map<K,V> parseIntoMap2(JsonParserContext ctx, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		if (keyType == null)
+			keyType = (ClassMeta<K>)string();
+
+		int S0=0; // Looking for outer {
+		int S1=1; // Looking for attrName start.
+		int S3=3; // Found attrName end, looking for :.
+		int S4=4; // Found :, looking for valStart: { [ " ' LITERAL.
+		int S5=5; // Looking for , or }
+
+		int state = S0;
+		String currAttr = null;
+		int c = 0;
+		while (c != -1) {
+			c = r.read();
+			if (state == S0) {
+				if (c == '{')
+					state = S1;
+			} else if (state == S1) {
+				if (c == '}') {
+					return m;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					currAttr = parseFieldName(ctx, r.unread());
+					state = S3;
+				}
+			} else if (state == S3) {
+				if (c == ':')
+					state = S4;
+			} else if (state == S4) {
+				if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					K key = convertAttrToType(m, currAttr, keyType);
+					V value = parseAnything(ctx, valueType, r.unread(), null, m, key);
+					m.put(key, value);
+					state = S5;
+				}
+			} else if (state == S5) {
+				if (c == ',')
+					state = S1;
+				else if (c == '/')
+					skipCommentsAndSpace(ctx, r.unread());
+				else if (c == '}') {
+					return m;
+				}
+			}
+		}
+		if (state == S0)
+			throw new ParseException(line, column, "Expected '{' at beginning of JSON object.");
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on JSON object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Could not find ':' following attribute name on JSON object.");
+		if (state == S4)
+			throw new ParseException(line, column, "Expected one of the following characters: {,[,',\",LITERAL.");
+		if (state == S5)
+			throw new ParseException(line, column, "Could not find '}' marking end of JSON object.");
+
+		return null; // Unreachable.
+	}
+
+	/*
+	 * Parse a JSON attribute from the character array at the specified position, then
+	 * set the position marker to the last character in the field name.
+	 */
+	private String parseFieldName(JsonParserContext ctx, ParserReader r) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		int c = r.peek();
+		if (c == '\'' || c == '"')
+			return parseString(ctx, r);
+		if (ctx.isStrictMode())
+			throw new ParseException(line, column, "Unquoted attribute detected.");
+		r.mark();
+		// Look for whitespace.
+		while (c != -1) {
+			c = r.read();
+			if (c == ':' || Character.isWhitespace(c) || c == '/') {
+				r.unread();
+				String s = r.getMarked().intern();
+				return s.equals("null") ? null : s;
+			}
+		}
+		throw new ParseException(line, column, "Could not find the end of the field name.");
+	}
+
+	private <E> Collection<E> parseIntoCollection2(JsonParserContext ctx, ParserReader r, Collection<E> l, ClassMeta<E> elementType) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int S0=0; // Looking for outermost [
+		int S1=1; // Looking for starting [ or { or " or ' or LITERAL
+		int S2=2; // Looking for , or ]
+
+		int state = S0;
+		int c = 0;
+		while (c != -1) {
+			c = r.read();
+			if (state == S0) {
+				if (c == '[')
+					state = S1;
+			} else if (state == S1) {
+				if (c == ']') {
+					return l;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					l.add(parseAnything(ctx, elementType, r.unread(), null, l, null));
+					state = S2;
+				}
+			} else if (state == S2) {
+				if (c == ',') {
+					state = S1;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (c == ']') {
+					return l;
+				}
+			}
+		}
+		if (state == S0)
+			throw new ParseException(line, column, "Expected '[' at beginning of JSON array.");
+		if (state == S1)
+			throw new ParseException(line, column, "Expected one of the following characters: {,[,',\",LITERAL.");
+		if (state == S2)
+			throw new ParseException(line, column, "Expected ',' or ']'.");
+
+		return null;  // Unreachable.
+	}
+
+	private Object[] parseArgs(JsonParserContext ctx, ParserReader r, ClassMeta<?>[] argTypes) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int S0=0; // Looking for outermost [
+		int S1=1; // Looking for starting [ or { or " or ' or LITERAL
+		int S2=2; // Looking for , or ]
+
+		Object[] o = new Object[argTypes.length];
+		int i = 0;
+
+		int state = S0;
+		int c = 0;
+		while (c != -1) {
+			c = r.read();
+			if (state == S0) {
+				if (c == '[')
+					state = S1;
+			} else if (state == S1) {
+				if (c == ']') {
+					return o;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					o[i] = parseAnything(ctx, argTypes[i], r.unread(), null, ctx.getOuter(), null);
+					i++;
+					state = S2;
+				}
+			} else if (state == S2) {
+				if (c == ',') {
+					state = S1;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (c == ']') {
+					return o;
+				}
+			}
+		}
+		if (state == S0)
+			throw new ParseException(line, column, "Expected '[' at beginning of JSON array.");
+		if (state == S1)
+			throw new ParseException(line, column, "Expected one of the following characters: {,[,',\",LITERAL.");
+		if (state == S2)
+			throw new ParseException(line, column, "Expected ',' or ']'.");
+
+		return null;  // Unreachable.
+	}
+
+	private <T> BeanMap<T> parseIntoBeanMap2(JsonParserContext ctx, ParserReader r, BeanMap<T> m) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int S0=0; // Looking for outer {
+		int S1=1; // Looking for attrName start.
+		int S3=3; // Found attrName end, looking for :.
+		int S4=4; // Found :, looking for valStart: { [ " ' LITERAL.
+		int S5=5; // Looking for , or }
+
+		int state = S0;
+		String currAttr = "";
+		int c = 0;
+		int currAttrLine = -1, currAttrCol = -1;
+		while (c != -1) {
+			c = r.read();
+			if (state == S0) {
+				if (c == '{')
+					state = S1;
+			} else if (state == S1) {
+				if (c == '}') {
+					return m;
+				} else if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					r.unread();
+					currAttrLine= r.getLine();
+					currAttrCol = r.getColumn();
+					currAttr = parseFieldName(ctx, r);
+					state = S3;
+				}
+			} else if (state == S3) {
+				if (c == ':')
+					state = S4;
+			} else if (state == S4) {
+				if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					if (! currAttr.equals("_class")) {
+						BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
+						if (pMeta == null) {
+							if (m.getMeta().isSubTyped()) {
+								m.put(currAttr, parseAnything(ctx, object(), r.unread(), null, m.getBean(false), currAttr));
+							} else {
+								onUnknownProperty(ctx, currAttr, m, currAttrLine, currAttrCol);
+								parseAnything(ctx, object(), r.unread(), null, m.getBean(false), null); // Read content anyway to ignore it
+							}
+						} else {
+							Object value = parseAnything(ctx, pMeta.getClassMeta(), r.unread(), pMeta, m.getBean(false), currAttr);
+							pMeta.set(m, value);
+						}
+					}
+					state = S5;
+				}
+			} else if (state == S5) {
+				if (c == ',')
+					state = S1;
+				else if (c == '/')
+					skipCommentsAndSpace(ctx, r.unread());
+				else if (c == '}') {
+					return m;
+				}
+			}
+		}
+		if (state == S0)
+			throw new ParseException(line, column, "Expected '{' at beginning of JSON object.");
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on JSON object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Could not find ':' following attribute name on JSON object.");
+		if (state == S4)
+			throw new ParseException(line, column, "Expected one of the following characters: {,[,',\",LITERAL.");
+		if (state == S5)
+			throw new ParseException(line, column, "Could not find '}' marking end of JSON object.");
+
+		return null; // Unreachable.
+	}
+
+	/*
+	 * Starting from the specified position in the character array, returns the
+	 * position of the character " or '.
+	 * If the string consists of a concatenation of strings (e.g. 'AAA' + "BBB"), this method
+	 * will automatically concatenate the strings and return the result.
+	 */
+	private String parseString(JsonParserContext ctx, ParserReader r) throws ParseException, IOException  {
+		int line = r.getLine();
+		int column = r.getColumn();
+		r.mark();
+		int qc = r.read();		// The quote character being used (" or ')
+		if (qc != '"' && ctx.isStrictMode()) {
+			String msg = (qc == '\'' ? "Invalid quote character \"{0}\" being used." : "Did not find quote character marking beginning of string.  Character=\"{0}\"");
+			throw new ParseException(line, column, msg, (char)qc);
+		}
+		final boolean isQuoted = (qc == '\'' || qc == '"');
+		String s = null;
+		boolean isInEscape = false;
+		int c = 0;
+		while (c != -1) {
+			c = r.read();
+			if (isInEscape) {
+				switch (c) {
+					case 'n': r.replace('\n'); break;
+					case 'r': r.replace('\r'); break;
+					case 't': r.replace('\t'); break;
+					case 'f': r.replace('\f'); break;
+					case 'b': r.replace('\b'); break;
+					case '\\': r.replace('\\'); break;
+					case '/': r.replace('/'); break;
+					case '\'': r.replace('\''); break;
+					case '"': r.replace('"'); break;
+					case 'u': {
+						String n = r.read(4);
+						r.replace(Integer.parseInt(n, 16), 6);
+						break;
+					}
+					default:
+						throw new ParseException(line, column, "Invalid escape sequence in string.");
+				}
+				isInEscape = false;
+			} else {
+				if (c == '\\') {
+					isInEscape = true;
+					r.delete();
+				} else if (isQuoted) {
+					if (c == qc) {
+						s = r.getMarked(1, -1);
+						break;
+					}
+				} else {
+					if (c == ',' || c == '}' || Character.isWhitespace(c)) {
+						s = r.getMarked(0, -1);
+						r.unread();
+						break;
+					} else if (c == -1) {
+						s = r.getMarked(0, 0);
+						break;
+					}
+				}
+			}
+		}
+		if (s == null)
+			throw new ParseException(line, column, "Could not find expected end character ''{0}''.", (char)qc);
+
+		// Look for concatenated string (i.e. whitespace followed by +).
+		skipCommentsAndSpace(ctx, r);
+		if (r.peek() == '+') {
+			if (ctx.isStrictMode())
+				throw new ParseException(r.getLine(), r.getColumn(), "String concatenation detected.");
+			r.read();	// Skip past '+'
+			skipCommentsAndSpace(ctx, r);
+			s += parseString(ctx, r);
+		}
+		return s; // End of input reached.
+	}
+
+	/*
+	 * Looks for the keywords true, false, or null.
+	 * Throws an exception if any of these keywords are not found at the specified position.
+	 */
+	private void parseKeyword(String keyword, ParserReader r) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		try {
+			String s = r.read(keyword.length());
+			if (s.equals(keyword))
+				return;
+			throw new ParseException(line, column, "Unrecognized syntax.");
+		} catch (IndexOutOfBoundsException e) {
+			throw new ParseException(line, column, "Unrecognized syntax.");
+		}
+	}
+
+	/*
+	 * Doesn't actually parse anything, but moves the position beyond any whitespace or comments.
+	 * If positionOnNext is 'true', then the cursor will be set to the point immediately after
+	 * the comments and whitespace.  Otherwise, the cursor will be set to the last position of
+	 * the comments and whitespace.
+	 */
+	private void skipCommentsAndSpace(JsonParserContext ctx, ParserReader r) throws ParseException, IOException {
+		int c = 0;
+		while ((c = r.read()) != -1) {
+			if (! Character.isWhitespace(c)) {
+				if (c == '/') {
+					if (ctx.isStrictMode())
+						throw new ParseException(r.getLine(), r.getColumn(), "Javascript comment detected.");
+					skipComments(r);
+				} else {
+					r.unread();
+					return;
+				}
+			}
+		}
+	}
+
+	/*
+	 * Doesn't actually parse anything, but moves the position beyond the construct "{wrapperAttr:" when
+	 * the @Json.wrapperAttr() annotation is used on a class.
+	 */
+	private void skipWrapperAttrStart(JsonParserContext ctx, ParserReader r, String wrapperAttr) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int S0=0; // Looking for outer {
+		int S1=1; // Looking for attrName start.
+		int S3=3; // Found attrName end, looking for :.
+		int S4=4; // Found :, looking for valStart: { [ " ' LITERAL.
+
+		int state = S0;
+		String currAttr = null;
+		int c = 0;
+		while (c != -1) {
+			c = r.read();
+			if (state == S0) {
+				if (c == '{')
+					state = S1;
+			} else if (state == S1) {
+				if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					currAttr = parseFieldName(ctx, r.unread());
+					if (! currAttr.equals(wrapperAttr))
+						throw new ParseException(line, column, "Expected to find wrapper attribute ''{0}'' but found attribute ''{1}''", wrapperAttr, currAttr);
+					state = S3;
+				}
+			} else if (state == S3) {
+				if (c == ':')
+					state = S4;
+			} else if (state == S4) {
+				if (c == '/') {
+					skipCommentsAndSpace(ctx, r.unread());
+				} else if (! Character.isWhitespace(c)) {
+					r.unread();
+					return;
+				}
+			}
+		}
+		if (state == S0)
+			throw new ParseException(line, column, "Expected '{' at beginning of JSON object.");
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on JSON object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Could not find ':' following attribute name on JSON object.");
+		if (state == S4)
+			throw new ParseException(line, column, "Expected one of the following characters: {,[,',\",LITERAL.");
+	}
+
+	/*
+	 * Doesn't actually parse anything, but moves the position beyond the construct "}" when
+	 * the @Json.wrapperAttr() annotation is used on a class.
+	 */
+	private void skipWrapperAttrEnd(JsonParserContext ctx, ParserReader r) throws ParseException, IOException {
+		int c = 0;
+		int line = r.getLine();
+		int column = r.getColumn();
+		while ((c = r.read()) != -1) {
+			if (! Character.isWhitespace(c)) {
+				if (c == '/') {
+					if (ctx.isStrictMode())
+						throw new ParseException(line, column, "Javascript comment detected.");
+					skipComments(r);
+				} else if (c == '}') {
+					return;
+				} else {
+					throw new ParseException(line, column, "Could not find '}' at the end of JSON wrapper object.");
+				}
+			}
+		}
+	}
+
+	/*
+	 * Doesn't actually parse anything, but when positioned at the beginning of comment,
+	 * it will move the pointer to the last character in the comment.
+	 */
+	private void skipComments(ParserReader r) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+		int c = r.read();
+		//  "/* */" style comments
+		if (c == '*') {
+			while (c != -1)
+				if ((c = r.read()) == '*')
+					if ((c = r.read()) == '/')
+						return;
+		//  "//" style comments
+		} else if (c == '/') {
+			while (c != -1) {
+				c = r.read();
+				if (c == -1 || c == '\n')
+					return;
+			}
+		}
+		throw new ParseException(line, column, "Open ended comment.");
+	}
+
+	/*
+	 * Call this method after you've finished a parsing a string to make sure that if there's any
+	 * remainder in the input, that it consists only of whitespace and comments.
+	 */
+	private void validateEnd(JsonParserContext ctx, ParserReader r) throws ParseException, IOException {
+		skipCommentsAndSpace(ctx, r);
+		int line = r.getLine();
+		int column = r.getColumn();
+		int c = r.read();
+		if (c != -1 && c != ';')  // var x = {...}; expressions can end with a semicolon.
+			throw new ParseException(line, column, "Remainder after parse: ''{0}''.", (char)c);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public JsonParserContext createContext(ObjectMap op, Method javaMethod, Object outer) {
+		return new JsonParserContext(getBeanContext(), jpp, pp, op, javaMethod, outer);
+	}
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		JsonParserContext jctx = (JsonParserContext)ctx;
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+		ParserReader r = jctx.getReader(in, estimatedSize);
+		T o = parseAnything(jctx, type, r, null, ctx.getOuter(), null);
+		validateEnd(jctx, r);
+		return o;
+	}
+
+	@Override /* ReaderParser */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		JsonParserContext jctx = (JsonParserContext)ctx;
+		ParserReader r = jctx.getReader(in, estimatedSize);
+		m = parseIntoMap2(jctx, r, m, ctx.getBeanContext().getClassMeta(keyType), ctx.getBeanContext().getClassMeta(valueType));
+		validateEnd(jctx, r);
+		return m;
+	}
+
+	@Override /* ReaderParser */
+	protected <E> Collection<E> doParseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType, ParserContext ctx) throws ParseException, IOException {
+		JsonParserContext jctx = (JsonParserContext)ctx;
+		ParserReader r = jctx.getReader(in, estimatedSize);
+		c = parseIntoCollection2(jctx, r, c, ctx.getBeanContext().getClassMeta(elementType));
+		validateEnd(jctx, r);
+		return c;
+	}
+
+	@Override /* ReaderParser */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		JsonParserContext jctx = (JsonParserContext)ctx;
+		ParserReader r = jctx.getReader(in, estimatedSize);
+		Object[] a = parseArgs(jctx, r, argTypes);
+		validateEnd(jctx, r);
+		return a;
+	}
+
+	@Override /* Parser */
+	public JsonParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! jpp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> JsonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public JsonParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public JsonParser clone() {
+		try {
+			return (JsonParser)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.class
new file mode 100755
index 0000000..b0e2e01
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.java
new file mode 100755
index 0000000..325169d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserContext.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import static com.ibm.juno.core.json.JsonParserProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Context object that lives for the duration of a single parsing of {@link JsonParser}.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonParserContext extends ParserContext {
+
+	private final boolean strictMode;
+
+	/**
+	 * Create a new parser context with the specified options.
+	 *
+	 * @param beanContext The bean context being used.
+	 * @param jpp The JSON parser properties.
+	 * @param pp The default parser properties.
+	 * @param op The override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	public JsonParserContext(BeanContext beanContext, JsonParserProperties jpp, ParserProperties pp, ObjectMap op, Method javaMethod, Object outer) {
+		super(beanContext, pp, op, javaMethod, outer);
+		if (op == null || op.isEmpty()) {
+			strictMode = jpp.isStrictMode();
+		} else {
+			strictMode = op.getBoolean(JSON_strictMode, jpp.isStrictMode());
+		}
+	}
+
+	/**
+	 * Returns the {@link JsonParserProperties#JSON_strictMode} setting in this context.
+	 *
+	 * @return The {@link JsonParserProperties#JSON_strictMode} setting in this context.
+	 */
+	public boolean isStrictMode() {
+		return strictMode;
+	}
+
+	/**
+	 * Returns the reader associated with this context wrapped in a {@link ParserReader}.
+	 *
+	 * @param in The reader being wrapped.
+	 * @param estimatedSize The estimated size of the input.
+	 * @return The reader wrapped in a specialized parser reader.
+	 */
+	public ParserReader getReader(Reader in, int estimatedSize) {
+		if (in instanceof ParserReader)
+			return (ParserReader)in;
+		return new ParserReader(in, Math.min(8096, estimatedSize));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.class
new file mode 100755
index 0000000..869515e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.java
new file mode 100755
index 0000000..ac1f632
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonParserProperties.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Configurable properties on the {@link JsonParser} class.
+ * <p>
+ * 	Use the {@link JsonParser#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link JsonParser}.
+ * <ul>
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonParserProperties implements Cloneable {
+
+	/**
+	 * Set strict mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * When in strict mode, parser throws exceptions on the following invalid JSON syntax:
+	 * <ul>
+	 * 	<li>Unquoted attributes.
+	 * 	<li>Missing attribute values.
+	 * 	<li>Concatenated strings.
+	 * 	<li>Javascript comments.
+	 * 	<li>Numbers and booleans when Strings are expected.
+	 * </ul>
+	 */
+	public static final String JSON_strictMode = "JsonParser.strictMode";
+
+	private boolean
+		strictMode = false;
+
+	/**
+	 * Sets the specified property value.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 * @throws LockedException If the bean context has been locked.
+	 */
+	protected boolean setProperty(String property, Object value) throws LockedException {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(JSON_strictMode))
+			strictMode = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+	/**
+	 * Returns the current {@link #JSON_strictMode} value.
+	 *
+	 * @return The current {@link #JSON_strictMode} value.
+	 */
+	public boolean isStrictMode() {
+		return strictMode;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Object */
+	public JsonParserProperties clone() {
+		try {
+			return (JsonParserProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.class
new file mode 100755
index 0000000..229102b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.java
new file mode 100755
index 0000000..fa0dae5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSchemaSerializer.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJO metadata to HTTP responses as JSON.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>application/json+schema, text/json+schema</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>application/json</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces(value={"application/json+schema","text/json+schema"},contentType="application/json")
+public final class JsonSchemaSerializer extends JsonSerializer {
+
+	/**
+	 * Constructor.
+	 */
+	public JsonSchemaSerializer() {
+		setProperty(SERIALIZER_detectRecursions, true);
+		setProperty(SERIALIZER_ignoreRecursions, true);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* JsonSerializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		JsonSerializerContext jctx = (JsonSerializerContext)ctx;
+		ObjectMap schema = getSchema(ctx.getBeanContext().getClassMetaForObject(o), jctx, "root", null);
+		serializeAnything(jctx.getWriter(out), schema, null, jctx, "root", null);
+	}
+
+	/*
+	 * Creates a schema representation of the specified class type.
+	 *
+	 * @param eType The class type to get the schema of.
+	 * @param ctx Serialize context used to prevent infinite loops.
+	 * @param attrName The name of the current attribute.
+	 * @return A schema representation of the specified class.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private ObjectMap getSchema(ClassMeta<?> eType, JsonSerializerContext ctx, String attrName, String[] pNames) throws SerializeException {
+		try {
+
+			ObjectMap out = new ObjectMap();
+
+			if (eType == null)
+				eType = object();
+
+			ClassMeta<?> aType;			// The actual type (will be null if recursion occurs)
+			ClassMeta<?> gType;			// The generic type
+
+			aType = ctx.push(attrName, eType, null);
+
+			gType = eType.getFilteredClassMeta();
+			String type = null;
+
+			if (gType.isEnum() || gType.isCharSequence() || gType.isChar())
+				type = "string";
+			else if (gType.isNumber())
+				type = "number";
+			else if (gType.isBoolean())
+				type = "boolean";
+			else if (gType.isBean() || gType.isMap())
+				type = "object";
+			else if (gType.isCollection() || gType.isArray())
+				type = "array";
+			else
+				type = "any";
+
+			out.put("type", type);
+			out.put("description", eType.toString());
+			PojoFilter f = eType.getPojoFilter();
+			if (f != null)
+				out.put("filter", f);
+
+			if (aType != null) {
+				if (gType.isEnum())
+					out.put("enum", getEnumStrings((Class<Enum<?>>)gType.getInnerClass()));
+				else if (gType.isCollection() || gType.isArray()) {
+					ClassMeta componentType = gType.getElementType();
+					if (gType.isCollection() && isParentClass(Set.class, gType.getInnerClass()))
+						out.put("uniqueItems", true);
+					out.put("items", getSchema(componentType, ctx, "items", pNames));
+				} else if (gType.isBean()) {
+					ObjectMap properties = new ObjectMap();
+					BeanMeta bm = ctx.getBeanContext().getBeanMeta(gType.getInnerClass());
+					if (pNames != null)
+						bm = new BeanMetaFiltered(bm, pNames);
+					for (Iterator<BeanPropertyMeta<?>> i = bm.getPropertyMetas().iterator(); i.hasNext();) {
+						BeanPropertyMeta p = i.next();
+						properties.put(p.getName(), getSchema(p.getClassMeta(), ctx, p.getName(), p.getProperties()));
+					}
+					out.put("properties", properties);
+				}
+			}
+			ctx.pop();
+			return out;
+		} catch (StackOverflowError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new SerializeException("Exception occured trying to process object of type ''{0}''", eType).initCause(e);
+		}
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private List<String> getEnumStrings(Class<? extends Enum> c) {
+		List<String> l = new LinkedList<String>();
+		try {
+			for (Object e : EnumSet.allOf(c))
+				l.add(e.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return l;
+	}
+
+
+	@Override /* Lockable */
+	public JsonSchemaSerializer lock() {
+		super.lock();
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Readable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Readable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Readable.class
new file mode 100755
index 0000000..5f79aa1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Readable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Simple.class
new file mode 100755
index 0000000..6ac8d7f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadable.class
new file mode 100755
index 0000000..32b616d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadableSafe.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadableSafe.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadableSafe.class
new file mode 100755
index 0000000..10df6c7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer$SimpleReadableSafe.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.class
new file mode 100755
index 0000000..c912a70
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.java
new file mode 100755
index 0000000..275ea72
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializer.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import static com.ibm.juno.core.json.JsonSerializerProperties.*;
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJO models to JSON.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>application/json, text/json</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>application/json</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	The conversion is as follows...
+ * 	<ul>
+ * 		<li>Maps (e.g. {@link HashMap HashMaps}, {@link TreeMap TreeMaps}) are converted to JSON objects.
+ * 		<li>Collections (e.g. {@link HashSet HashSets}, {@link LinkedList LinkedLists}) and Java arrays are converted to JSON arrays.
+ * 		<li>{@link String Strings} are converted to JSON strings.
+ * 		<li>{@link Number Numbers} (e.g. {@link Integer}, {@link Long}, {@link Double}) are converted to JSON numbers.
+ * 		<li>{@link Boolean Booleans} are converted to JSON booleans.
+ * 		<li>{@code nulls} are converted to JSON nulls.
+ * 		<li>{@code arrays} are converted to JSON arrays.
+ * 		<li>{@code beans} are converted to JSON objects.
+ * 	</ul>
+ * <p>
+ * 	The types above are considered "JSON-primitive" object types.  Any non-JSON-primitive object types are transformed
+ * 		into JSON-primitive object types through {@link com.ibm.juno.core.filter.Filter Filters} associated through the {@link BeanContextFactory#addFilters(Class...)}
+ * 		method.  Several default filters are provided for transforming Dates, Enums, Iterators, etc...
+ * <p>
+ * 	This serializer provides several serialization options.  Typically, one of the predefined DEFAULT serializers will be sufficient.
+ * 	However, custom serializers can be constructed to fine-tune behavior.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link JsonSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for convenience:
+ * <ul>
+ * 	<li>{@link Simple} - Default serializer, single quotes, simple mode.
+ * 	<li>{@link SimpleReadable} - Default serializer, single quotes, simple mode, with whitespace.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Use one of the default serializers to serialize a POJO</jc>
+ * 	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);
+ *
+ * 	<jc>// Create a custom serializer for lax syntax using single quote characters</jc>
+ * 	JsonSerializer serializer = <jk>new</jk> JsonSerializer()
+ * 		.setProperty(JsonSerializerProperties.<jsf>JSON_simpleMode</jsf>, <jk>true</jk>)
+ * 		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+ *
+ * 	<jc>// Clone an existing serializer and modify it to use single-quotes</jc>
+ * 	JsonSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>.clone()
+ * 		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+ *
+ * 	<jc>// Serialize a POJO to JSON</jc>
+ * 	String json = serializer.serialize(someObject);
+ * </p>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces({"application/json","text/json"})
+public class JsonSerializer extends WriterSerializer {
+
+	/** Default serializer, all default settings.*/
+	public static final JsonSerializer DEFAULT = new JsonSerializer().lock();
+
+	/** Default serializer, all default settings.*/
+	public static final JsonSerializer DEFAULT_READABLE = new Readable().lock();
+
+	/** Default serializer, single quotes, simple mode. */
+	public static final JsonSerializer DEFAULT_LAX = new Simple().lock();
+
+	/** Default serializer, single quotes, simple mode, with whitespace. */
+	public static final JsonSerializer DEFAULT_LAX_READABLE = new SimpleReadable().lock();
+
+	/**
+	 * Default serializer, single quotes, simple mode, with whitespace and recursion detection.
+	 * Note that recursion detection introduces a small performance penalty.
+	 */
+	public static final JsonSerializer DEFAULT_LAX_READABLE_SAFE = new SimpleReadableSafe().lock();
+
+	/** Default serializer, with whitespace. */
+	public static class Readable extends JsonSerializer {
+		/** Constructor */
+		public Readable() {
+			setProperty(JSON_useWhitespace, true);
+			setProperty(SERIALIZER_useIndentation, true);
+		}
+	}
+
+	/** Default serializer, single quotes, simple mode. */
+	@Produces(value={"application/json+simple","text/json+simple"},contentType="application/json")
+	public static class Simple extends JsonSerializer {
+		/** Constructor */
+		public Simple() {
+			setProperty(JSON_simpleMode, true);
+			setProperty(SERIALIZER_quoteChar, '\'');
+		}
+	}
+
+	/** Default serializer, single quotes, simple mode, with whitespace. */
+	public static class SimpleReadable extends Simple {
+		/** Constructor */
+		public SimpleReadable() {
+			setProperty(JSON_useWhitespace, true);
+			setProperty(SERIALIZER_useIndentation, true);
+		}
+	}
+
+	/**
+	 * Default serializer, single quotes, simple mode, with whitespace and recursion detection.
+	 * Note that recursion detection introduces a small performance penalty.
+	 */
+	public static class SimpleReadableSafe extends SimpleReadable {
+		/** Constructor */
+		public SimpleReadableSafe() {
+			setProperty(SERIALIZER_detectRecursions, true);
+		}
+	}
+
+	/** JSON serializer properties currently set on this serializer. */
+	protected transient JsonSerializerProperties jsp = new JsonSerializerProperties();
+
+
+	/**
+	 * Workhorse method. Determines the type of object, and then calls the
+	 * appropriate type-specific serialization method.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	SerializerWriter serializeAnything(JsonSerializerWriter out, Object o, ClassMeta<?> eType, JsonSerializerContext ctx, String attrName, BeanPropertyMeta pMeta) throws SerializeException {
+		try {
+			BeanContext bc = ctx.getBeanContext();
+
+			if (o == null) {
+				out.append("null");
+				return out;
+			}
+
+			if (eType == null)
+				eType = object();
+
+			boolean addClassAttr;		// Add "_class" attribute to element?
+			ClassMeta<?> aType;			// The actual type
+			ClassMeta<?> gType;			// The generic type
+
+			aType = ctx.push(attrName, o, eType);
+			boolean isRecursion = aType == null;
+
+			// Handle recursion
+			if (aType == null) {
+				o = null;
+				aType = object();
+			}
+
+			gType = aType.getFilteredClassMeta();
+			addClassAttr = (ctx.isAddClassAttrs() && ! eType.equals(aType));
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();				// The filter
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+
+			String wrapperAttr = gType.getJsonMeta().getWrapperAttr();
+			if (wrapperAttr != null) {
+				out.append('{').cr(ctx.indent).attr(wrapperAttr).append(':').s();
+				ctx.indent++;
+			}
+
+			// '\0' characters are considered null.
+			if (o == null || (gType.isChar() && ((Character)o).charValue() == 0))
+				out.append("null");
+			else if (gType.isNumber() || gType.isBoolean())
+				out.append(o);
+			else if (gType.hasToObjectMapMethod())
+				serializeMap(out, gType.toObjectMap(o), gType, ctx);
+			else if (gType.isBean())
+				serializeBeanMap(out, bc.forBean(o), addClassAttr, ctx);
+			else if (gType.isUri() || (pMeta != null && (pMeta.isUri() || pMeta.isBeanUri())))
+				out.q().appendUri(o).q();
+			else if (gType.isMap()) {
+				if (o instanceof BeanMap)
+					serializeBeanMap(out, (BeanMap)o, addClassAttr, ctx);
+				else
+					serializeMap(out, (Map)o, eType, ctx);
+			}
+			else if (gType.isCollection()) {
+				if (addClassAttr)
+					serializeCollectionMap(out, (Collection)o, gType, ctx);
+				else
+					serializeCollection(out, (Collection) o, eType, ctx);
+			}
+			else if (gType.isArray()) {
+				if (addClassAttr)
+					serializeCollectionMap(out, toList(gType.getInnerClass(), o), gType, ctx);
+				else
+					serializeCollection(out, toList(gType.getInnerClass(), o), eType, ctx);
+			}
+			else
+				out.stringValue(o);
+
+			if (wrapperAttr != null) {
+				ctx.indent--;
+				out.cr(ctx.indent-1).append('}');
+			}
+
+			if (! isRecursion)
+				ctx.pop();
+			return out;
+		} catch (SerializeException e) {
+			throw e;
+		} catch (StackOverflowError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new SerializeException("Exception occured trying to process object of type ''{0}''", (o == null ? null : o.getClass().getName())).initCause(e);
+		}
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private SerializerWriter serializeMap(JsonSerializerWriter out, Map m, ClassMeta<?> type, JsonSerializerContext ctx) throws IOException, SerializeException {
+
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		m = sort(ctx, m);
+
+		int depth = ctx.getIndent();
+		out.append('{');
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		while (mapEntries.hasNext()) {
+			Map.Entry e = (Map.Entry) mapEntries.next();
+			Object value = e.getValue();
+
+			Object key = generalize(ctx, e.getKey(), keyType);
+
+			out.cr(depth).attr(key).append(':').s();
+
+			serializeAnything(out, value, valueType, ctx, (key == null ? null : key.toString()), null);
+
+			if (mapEntries.hasNext())
+				out.append(',').s();
+		}
+
+		out.cr(depth-1).append('}');
+
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private SerializerWriter serializeCollectionMap(JsonSerializerWriter out, Collection o, ClassMeta<?> type, JsonSerializerContext ctx) throws IOException, SerializeException {
+		int i = ctx.getIndent();
+		out.append('{');
+		out.cr(i).attr("_class").append(':').s().q().append(type.getInnerClass().getName()).q().append(',').s();
+		out.cr(i).attr("items").append(':').s();
+		ctx.indent++;
+		serializeCollection(out, o, type, ctx);
+		ctx.indent--;
+		out.cr(i-1).append('}');
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private SerializerWriter serializeBeanMap(JsonSerializerWriter out, BeanMap m, boolean addClassAttr, JsonSerializerContext ctx) throws IOException, SerializeException {
+		int depth = ctx.getIndent();
+		out.append('{');
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		// Print out "_class" attribute on this bean if required.
+		if (addClassAttr) {
+			String attr = "_class";
+			out.cr(depth).attr(attr).append(':').s().q().append(m.getClassMeta().getInnerClass().getName()).q();
+			if (mapEntries.hasNext())
+				out.append(',').s();
+		}
+
+		boolean addComma = false;
+
+		while (mapEntries.hasNext()) {
+			BeanMapEntry p = (BeanMapEntry)mapEntries.next();
+			BeanPropertyMeta pMeta = p.getMeta();
+
+			String key = p.getKey();
+			Object value = null;
+			try {
+				value = p.getValue();
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+
+			if (canIgnoreValue(ctx, pMeta.getClassMeta(), key, value))
+				continue;
+
+			if (addComma)
+				out.append(',').s();
+
+			out.cr(depth).attr(key).append(':').s();
+
+			serializeAnything(out, value, pMeta.getClassMeta(), ctx, key, pMeta);
+
+			addComma = true;
+		}
+		out.cr(depth-1).append('}');
+		return out;
+	}
+
+	@SuppressWarnings({"rawtypes", "unchecked"})
+	private SerializerWriter serializeCollection(JsonSerializerWriter out, Collection c, ClassMeta<?> type, JsonSerializerContext ctx) throws IOException, SerializeException {
+
+		ClassMeta<?> elementType = type.getElementType();
+
+		c = sort(ctx, c);
+
+		out.append('[');
+		int depth = ctx.getIndent();
+
+		for (Iterator i = c.iterator(); i.hasNext();) {
+
+			Object value = i.next();
+
+			out.cr(depth);
+
+			serializeAnything(out, value, elementType, ctx, "<iterator>", null);
+
+			if (i.hasNext())
+				out.append(',').s();
+		}
+		out.cr(depth-1).append(']');
+		return out;
+	}
+
+	/**
+	 * Returns the schema serializer based on the settings of this serializer.
+	 * @return The schema serializer.
+	 */
+	public JsonSchemaSerializer getSchemaSerializer() {
+		JsonSchemaSerializer s = new JsonSchemaSerializer();
+		s.beanContextFactory = this.beanContextFactory;
+		s.sp = this.sp;
+		s.jsp = this.jsp;
+		return s;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	public JsonSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new JsonSerializerContext(getBeanContext(), sp, jsp, properties, javaMethod);
+	}
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		JsonSerializerContext jctx = (JsonSerializerContext)ctx;
+		serializeAnything(jctx.getWriter(out), o, null, jctx, "root", null);
+	}
+
+	@Override /* CoreApi */
+	public JsonSerializer setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! jsp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> JsonSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public JsonSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public JsonSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public JsonSerializer clone() {
+		try {
+			JsonSerializer c = (JsonSerializer)super.clone();
+			c.jsp = jsp.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.class
new file mode 100755
index 0000000..27e8527
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.java
new file mode 100755
index 0000000..0677055
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerContext.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import static com.ibm.juno.core.json.JsonSerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of {@link JsonSerializer} and its subclasses.
+ * <p>
+ * 	See {@link SerializerContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonSerializerContext extends SerializerContext {
+
+	private final boolean simpleMode, useWhitespace, escapeSolidus;
+
+	/**
+	 * Constructor.
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp Default general serializer properties.
+	 * @param jsp Default JSON serializer properties.
+	 * @param op Override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	protected JsonSerializerContext(BeanContext beanContext, SerializerProperties sp, JsonSerializerProperties jsp, ObjectMap op, Method javaMethod) {
+		super(beanContext, sp, op, javaMethod);
+		if (op == null || op.isEmpty()) {
+			simpleMode = jsp.simpleMode;
+			useWhitespace = jsp.useWhitespace;
+			escapeSolidus = jsp.escapeSolidus;
+		} else {
+			simpleMode = op.getBoolean(JSON_simpleMode, jsp.simpleMode);
+			useWhitespace = op.getBoolean(JSON_useWhitespace, jsp.useWhitespace);
+			escapeSolidus = op.getBoolean(JSON_escapeSolidus, jsp.escapeSolidus);
+		}
+	}
+
+	/**
+	 * Returns the {@link JsonSerializerProperties#JSON_simpleMode} setting value in this context.
+	 * @return The {@link JsonSerializerProperties#JSON_simpleMode} setting value in this context.
+	 */
+	public final boolean isSimpleMode() {
+		return simpleMode;
+	}
+
+	/**
+	 * Returns the {@link JsonSerializerProperties#JSON_useWhitespace} setting value in this context.
+	 * @return The {@link JsonSerializerProperties#JSON_useWhitespace} setting value in this context.
+	 */
+	public final boolean isUseWhitespace() {
+		return useWhitespace;
+	}
+
+	/**
+	 * Returns the {@link JsonSerializerProperties#JSON_escapeSolidus} setting value in this context.
+	 * @return The {@link JsonSerializerProperties#JSON_escapeSolidus} setting value in this context.
+	 */
+	public final boolean isEscapeSolidus() {
+		return escapeSolidus;
+	}
+
+	/**
+	 * Wraps the specified writer inside a {@link JsonSerializerWriter}.
+	 *
+	 * @param out The writer being wrapped.
+	 * @return The wrapped writer.
+	 */
+	public JsonSerializerWriter getWriter(Writer out) {
+		if (out instanceof JsonSerializerWriter)
+			return (JsonSerializerWriter)out;
+		return new JsonSerializerWriter(out, isUseIndentation(), isUseWhitespace(), isEscapeSolidus(), getQuoteChar(), isSimpleMode(), getRelativeUriBase(), getAbsolutePathUriBase());
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.class
new file mode 100755
index 0000000..bdc0ee0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.java
new file mode 100755
index 0000000..8c4e8bf
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerProperties.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Configurable properties on the {@link JsonSerializer} class.
+ * <p>
+ * 	Use the {@link JsonSerializer#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link JsonSerializer}.
+ * <ul>
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonSerializerProperties implements Cloneable {
+
+	/**
+	 * Simple JSON mode ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, JSON attribute names will only be quoted when necessary.
+	 * Otherwise, they are always quoted.
+	 */
+	public static final String JSON_simpleMode = "JsonSerializer.simpleMode";
+
+	/**
+	 * Use whitespace in output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
+	 */
+	public static final String JSON_useWhitespace = "JsonSerializer.useWhitespace";
+
+	/**
+	 * Prefix solidus <js>'/'</js> characters with escapes ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, solidus (e.g. slash) characters should be escaped.
+	 * The JSON specification allows for either format.
+	 * However, if you're embedding JSON in an HTML script tag, this setting prevents
+	 * 	confusion when trying to serialize <xt>&lt;\/script&gt;</xt>.
+	 */
+	public static final String JSON_escapeSolidus = "JsonSerializer.escapeSolidus";
+
+	boolean
+		simpleMode = false,
+		useWhitespace = false,
+		escapeSolidus = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(JSON_simpleMode))
+			simpleMode = bc.convertToType(value, Boolean.class);
+		else if (property.equals(JSON_useWhitespace))
+			useWhitespace = bc.convertToType(value, Boolean.class);
+		else if (property.equals(JSON_escapeSolidus))
+			escapeSolidus = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public JsonSerializerProperties clone() {
+		try {
+			return (JsonSerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.class
new file mode 100755
index 0000000..828cea2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.class differ


[04/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.java
new file mode 100755
index 0000000..70807a8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Output stream that can send output to multiple output streams.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class TeeOutputStream extends OutputStream {
+	private OutputStream[] outputStreams = new OutputStream[0];
+	private Map<String,OutputStream> outputStreamMap;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param outputStreams The list of output streams.
+	 */
+	public TeeOutputStream(OutputStream...outputStreams) {
+		this.outputStreams = outputStreams;
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param outputStreams The list of output streams.
+	 */
+	public TeeOutputStream(Collection<OutputStream> outputStreams) {
+		this.outputStreams = outputStreams.toArray(new OutputStream[outputStreams.size()]);
+	}
+
+	/**
+	 * Adds an output stream to this tee output stream.
+	 *
+	 * @param os The output stream to add to this tee output stream.
+	 * @param close If <jk>false</jk>, then calling {@link #close()} on this stream
+	 * 	will not filter to the specified output stream.
+	 * @return This object (for method chaining).
+	 */
+	public TeeOutputStream add(OutputStream os, boolean close) {
+		if (os == null)
+			return this;
+		if (! close)
+			os = new NoCloseOutputStream(os);
+		if (os == this)
+			throw new RuntimeException("Cannot add this output stream to itself.");
+		for (OutputStream os2 : outputStreams)
+			if (os2 == os)
+				throw new RuntimeException("Cannot add this output stream again.");
+		if (os instanceof TeeOutputStream) {
+			for (OutputStream os2 : ((TeeOutputStream)os).outputStreams)
+				add(os2, true);
+		} else {
+			outputStreams = ArrayUtils.append(outputStreams, os);
+		}
+		return this;
+	}
+
+	/**
+	 * Returns the output stream identified through the <code>id</code> parameter
+	 * passed in through the {@link #add(String, OutputStream, boolean)} method.
+	 *
+	 * @param id The ID associated with the output stream.
+	 * @return The output stream, or <jk>null</jk> if no identifier was specified when the output stream was added.
+	 */
+	public OutputStream getOutputStream(String id) {
+		if (outputStreamMap != null)
+			return outputStreamMap.get(id);
+		return null;
+	}
+
+	/**
+	 * Same as {@link #add(OutputStream, boolean)} but associates the stream with an identifier
+	 * so the stream can be retrieved through {@link #getOutputStream(String)}.
+	 *
+	 * @param id The ID to associate the output stream with.
+	 * @param os The output stream to add.
+	 * @param close Close the specified stream afterwards.
+	 * @return This object (for method chaining).
+	 */
+	public TeeOutputStream add(String id, OutputStream os, boolean close) {
+		if (id != null) {
+			if (outputStreamMap == null)
+				outputStreamMap = new TreeMap<String,OutputStream>();
+			outputStreamMap.put(id, os);
+		}
+		return add(os, close);
+	}
+
+	/**
+	 * Returns the number of inner streams in this tee stream.
+	 *
+	 * @return The number of streams in this tee stream.
+	 */
+	public int size() {
+		return outputStreams.length;
+	}
+
+	@Override /* OutputStream */
+	public void write(int b) throws IOException {
+		for (OutputStream os : outputStreams)
+			os.write(b);
+	}
+
+	@Override /* OutputStream */
+	public void write(byte b[], int off, int len) throws IOException {
+		for (OutputStream os : outputStreams)
+			os.write(b, off, len);
+	}
+
+	@Override /* OutputStream */
+	public void flush() throws IOException {
+		for (OutputStream os : outputStreams)
+			os.flush();
+	}
+
+	@Override /* OutputStream */
+	public void close() throws IOException {
+		for (OutputStream os : outputStreams)
+			os.close();
+	}
+
+	private static class NoCloseOutputStream extends OutputStream {
+		private OutputStream os;
+
+		private NoCloseOutputStream(OutputStream os) {
+			this.os = os;
+		}
+
+		@Override /* OutputStream */
+		public void write(int b) throws IOException {
+			os.write(b);
+		}
+
+		@Override /* OutputStream */
+		public void write(byte b[], int off, int len) throws IOException {
+			os.write(b, off, len);
+		}
+
+		@Override /* OutputStream */
+		public void flush() throws IOException {
+			os.flush();
+		}
+
+		@Override /* OutputStream */
+		public void close() throws IOException {
+			// Do nothing.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$1.class
new file mode 100755
index 0000000..caa1961
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$NoCloseWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$NoCloseWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$NoCloseWriter.class
new file mode 100755
index 0000000..fc76e14
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter$NoCloseWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.class
new file mode 100755
index 0000000..b5702ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.java
new file mode 100755
index 0000000..f01c3cd
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeWriter.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.util.*;
+
+
+/**
+ * Writer that can send output to multiple writers.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class TeeWriter extends Writer {
+	private Writer[] writers = new Writer[0];
+	private Map<String,Writer> writerMap;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param writers The list of writers.
+	 */
+	public TeeWriter(Writer...writers) {
+		this.writers = writers;
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param writers The list of writers.
+	 */
+	public TeeWriter(Collection<Writer> writers) {
+		this.writers = writers.toArray(new Writer[writers.size()]);
+	}
+
+	/**
+	 * Adds a writer to this tee writer.
+	 *
+	 * @param w The writer to add to this tee writer.
+	 * @param close If <jk>false</jk>, then calling {@link #close()} on this tee writer
+	 * 	will not filter to the specified writer.
+	 * @return This object (for method chaining).
+	 */
+	public TeeWriter add(Writer w, boolean close) {
+		if (w == null)
+			return this;
+		if (! close)
+			w = new NoCloseWriter(w);
+		if (w == this)
+			throw new RuntimeException("Cannot add this writer to itself.");
+		for (Writer w2 : writers)
+			if (w2 == w)
+				throw new RuntimeException("Cannot add this writer again.");
+		if (w instanceof TeeWriter) {
+			for (Writer w2 : ((TeeWriter)w).writers)
+				add(w2, true);
+		} else {
+			writers = ArrayUtils.append(writers, w);
+		}
+		return this;
+	}
+
+	/**
+	 * Same as {@link #add(Writer, boolean)} but associates the writer with an identifier
+	 * so the writer can be retrieved through {@link #getWriter(String)}.
+	 *
+	 * @param id The ID to associate the writer with.
+	 * @param w The writer to add.
+	 * @param close Close the specified writer afterwards.
+	 * @return This object (for method chaining).
+	 */
+	public TeeWriter add(String id, Writer w, boolean close) {
+		if (id != null) {
+			if (writerMap == null)
+				writerMap = new TreeMap<String,Writer>();
+			writerMap.put(id, w);
+		}
+		return add(w, close);
+	}
+
+	/**
+	 * Returns the number of inner writers in this tee writer.
+	 *
+	 * @return The number of writers.
+	 */
+	public int size() {
+		return writers.length;
+	}
+
+	/**
+	 * Returns the writer identified through the <code>id</code> parameter
+	 * passed in through the {@link #add(String, Writer, boolean)} method.
+	 *
+	 * @param id The ID associated with the writer.
+	 * @return The writer, or <jk>null</jk> if no identifier was specified when the writer was added.
+	 */
+	public Writer getWriter(String id) {
+		if (writerMap != null)
+			return writerMap.get(id);
+		return null;
+	}
+
+	@Override /* Writer */
+	public void write(char[] cbuf, int off, int len) throws IOException {
+		for (Writer w : writers)
+			if (w != null)
+			w.write(cbuf, off, len);
+	}
+
+	@Override /* Writer */
+	public void flush() throws IOException {
+		for (Writer w : writers)
+			if (w != null)
+			w.flush();
+	}
+
+	@Override /* Writer */
+	public void close() throws IOException {
+		IOException e = null;
+		for (Writer w : writers) {
+			if (w != null) {
+				try {
+			w.close();
+				} catch (IOException e2) {
+					e = e2;
+				}
+			}
+		}
+		if (e != null)
+			throw e;
+	}
+
+	private static class NoCloseWriter extends Writer {
+		private Writer writer;
+
+		private NoCloseWriter(Writer writer) {
+			this.writer = writer;
+		}
+
+		@Override /* Writer */
+		public void write(char[] cbuf, int off, int len) throws IOException {
+			writer.write(cbuf, off, len);
+		}
+
+		@Override /* Writer */
+		public void flush() throws IOException {
+			writer.flush();
+		}
+
+		@Override /* Writer */
+		public void close() throws IOException {
+			// Do nothing.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.class
new file mode 100755
index 0000000..55805dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.java
new file mode 100755
index 0000000..d2b25ae
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ThrowableUtils.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.text.*;
+
+/**
+ * Various utility methods for creating and working with throwables.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ThrowableUtils {
+
+	/**
+	 * Throws an {@link IllegalArgumentException} if the specified object is <jk>null</jk>.
+	 *
+	 * @param o The object to check.
+	 * @param msg The message of the IllegalArgumentException.
+	 * @param args {@link MessageFormat}-style arguments in the message.
+	 * @throws IllegalArgumentException
+	 */
+	public static void assertNotNull(Object o, String msg, Object...args) throws IllegalArgumentException {
+		if (o == null)
+			throw new IllegalArgumentException(MessageFormat.format(msg, args));
+	}
+
+	/**
+	 * Throws an {@link IllegalArgumentException} if the specified field is <jk>null</jk>.
+	 *
+	 * @param fieldValue The object to check.
+	 * @param fieldName The name of the field.
+	 * @throws IllegalArgumentException
+	 */
+	public static void assertFieldNotNull(Object fieldValue, String fieldName) throws IllegalArgumentException {
+		if (fieldValue == null)
+			throw new IllegalArgumentException("Field '" + fieldName + "' cannot be null.");
+	}
+
+	/**
+	 * Throws an {@link IllegalArgumentException} if the specified field is <code>&lt;=0</code>.
+	 *
+	 * @param fieldValue The object to check.
+	 * @param fieldName The name of the field.
+	 * @throws IllegalArgumentException
+	 */
+	public static void assertFieldPositive(int fieldValue, String fieldName) throws IllegalArgumentException {
+		if (fieldValue <= 0)
+			throw new IllegalArgumentException("Field '" + fieldName + "' must be a positive integer.");
+	}
+
+	/**
+	 * Shortcut for calling <code><jk>new</jk> IllegalArgumentException(MessageFormat.<jsm>format</jsm>(msg, args));</code>
+	 *
+	 * @param msg The message of the IllegalArgumentException.
+	 * @param args {@link MessageFormat}-style arguments in the message.
+	 * @throws IllegalArgumentException
+	 */
+	public static void illegalArg(String msg, Object...args) throws IllegalArgumentException {
+		throw new IllegalArgumentException(MessageFormat.format(msg, args));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$FileEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$FileEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$FileEntry.class
new file mode 100755
index 0000000..4b11004
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$FileEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$ZipFileEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$ZipFileEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$ZipFileEntry.class
new file mode 100755
index 0000000..bad51b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList$ZipFileEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.class
new file mode 100755
index 0000000..77ab270
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.java
new file mode 100755
index 0000000..1aebf3c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ZipFileList.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:
+ * Use, duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.util.*;
+import java.util.zip.*;
+
+/**
+ * Utility class for representing the contents of a zip file as a list of entries
+ * whose contents don't resolve until serialize time.
+ * <p>
+ * Generally associated with <code>RestServlets</code> using the <code>responseHandlers</code>
+ * 	annotation so that REST methods can easily create ZIP file responses by simply returning instances
+ * 	of this class.
+ */
+@SuppressWarnings("serial")
+public class ZipFileList extends LinkedList<ZipFileList.ZipFileEntry> {
+
+	/**
+	 * The name of the zip file.
+	 */
+	public final String fileName;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param fileName The file name of the zip file to create.
+	 */
+	public ZipFileList(String fileName) {
+		this.fileName = fileName;
+	}
+
+	/**
+	 * Add an entry to this list.
+	 *
+	 * @param e The zip file entry.
+	 * @return This object (for method chaining).
+	 */
+	public ZipFileList append(ZipFileEntry e) {
+		add(e);
+		return this;
+	}
+
+	/**
+	 * Interface for ZipFileList entries.
+	 */
+	public static interface ZipFileEntry {
+		/**
+		 * Write this entry to the specified output stream.
+		 *
+		 * @param zos The output stream to write to.
+		 * @throws IOException
+		 */
+		void write(ZipOutputStream zos) throws IOException;
+	}
+
+	/**
+	 * ZipFileList entry for File entry types.
+	 */
+	public static class FileEntry implements ZipFileEntry {
+
+		/** The root file to base the entry paths on. */
+		protected File root;
+
+		/** The file being zipped. */
+		protected File file;
+
+		/**
+		 * Constructor.
+		 *
+		 * @param root The root file that represents the base path.
+		 * @param file The file to add to the zip file.
+		 */
+		public FileEntry(File root, File file) {
+			this.root = root;
+			this.file = file;
+		}
+
+		/**
+		 * Constructor.
+		 *
+		 * @param file The file to add to the zip file.
+		 */
+		public FileEntry(File file) {
+			this.file = file;
+			this.root = (file.isDirectory() ? file : file.getParentFile());
+		}
+
+		@Override /* ZipFileEntry */
+		public void write(ZipOutputStream zos) throws IOException {
+			addFile(zos, file);
+		}
+
+		/**
+		 * Subclasses can override this method to customize which files get added to a zip file.
+		 *
+		 * @param f The file being added to the zip file.
+		 * @return Always returns <jk>true</jk>.
+		 */
+		public boolean doAdd(File f) {
+			return true;
+		}
+
+		/**
+		 * Adds the specified file to the specified output stream.
+		 *
+		 * @param zos The output stream.
+		 * @param f The file to add.
+		 * @throws IOException
+		 */
+		protected void addFile(ZipOutputStream zos, File f) throws IOException {
+			if (doAdd(f)) {
+				if (f.isDirectory()) {
+					File[] fileList = f.listFiles();
+					if (fileList == null)
+						throw new IOException(f.toString());
+					for (File fc : fileList)
+						addFile(zos, fc);
+				} else if (f.canRead()) {
+					String path = f.getAbsolutePath().substring(root.getAbsolutePath().length() + 1).replace('\\', '/');
+					ZipEntry e = new ZipEntry(path);
+					e.setSize(f.length());
+					zos.putNextEntry(e);
+					IOPipe.create(new FileInputStream(f), zos).run();
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/package.html
new file mode 100755
index 0000000..97bdc68
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/package.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Utility classes</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.class
new file mode 100755
index 0000000..281438e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.java
new file mode 100755
index 0000000..7cb3b54
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/Namespace.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+/**
+ * Represents a simple namespace mapping between a simple name and URI.
+ * <p>
+ * 	In general, the simple name will be used as the XML prefix mapping unless
+ * 	there are conflicts or prefix remappings in the serializer.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class Namespace implements Comparable<Namespace> {
+	final String name, uri;
+	private final int hashCode;
+
+	/**
+	 * Constructor.
+	 * <p>
+	 * 	Use this constructor when the long name and short name are the same value.
+	 *
+	 * @param name The long and short name of this schema.
+	 * @param uri The URI of this schema.
+	 */
+	protected Namespace(String name, String uri) {
+		this.name = name;
+		this.uri = uri;
+		this.hashCode = (name == null ? 0 : name.hashCode()) + uri.hashCode();
+	}
+
+	/**
+	 * Returns the namespace name.
+	 *
+	 * @return The namespace name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Returns the namespace URI.
+	 *
+	 * @return The namespace URI.
+	 */
+	public String getUri() {
+		return uri;
+	}
+
+	@Override /* Comparable */
+	public int compareTo(Namespace o) {
+		int i = name.compareTo(o.name);
+		if (i == 0)
+			i = uri.compareTo(o.uri);
+		return i;
+	}
+
+	/**
+	 * For performance reasons, equality is always based on identity, since
+	 * the {@link NamespaceFactory} class ensures no duplicate name+uri pairs.
+	 */
+	@Override /* Object */
+	public boolean equals(Object o) {
+		return this == o;
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return hashCode;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return "{name='"+name+"',uri:'"+uri+"'}";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.class
new file mode 100755
index 0000000..27b3171
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.java
new file mode 100755
index 0000000..20faa03
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/NamespaceFactory.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.util.*;
+import java.util.concurrent.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Factory class for getting unique instances of {@link Namespace} objects.
+ * <p>
+ * 	For performance reasons, {@link Namespace} objects are stored in {@link IdentityList IdentityLists}.
+ * 	For this to work property, namespaces with the same name and URI must only be represented by a single
+ * 	{@link Namespace} instance.
+ * 	This factory class ensures this identity uniqueness.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class NamespaceFactory {
+
+	private static ConcurrentHashMap<String,Namespace> cache = new ConcurrentHashMap<String,Namespace>();
+
+	/**
+	 * Get the {@link Namespace} with the specified name and URI, and create a new one
+	 * 	if this is the first time it's been encountered.
+	 *
+	 * @param name The namespace name.  See {@link Namespace#getName()}.
+	 * @param uri The namespace URI.  See {@link Namespace#getUri()}.
+	 * @return The namespace object.
+	 */
+	public static Namespace get(String name, String uri) {
+		String key = name + "+" + uri;
+		Namespace n = cache.get(key);
+		if (n == null) {
+			n = new Namespace(name, uri);
+			Namespace n2 = cache.putIfAbsent(key, n);
+			return (n2 == null ? n : n2);
+		}
+		return n;
+	}
+
+	/**
+	 * Converts the specified object into a {@link Namespace} object.
+	 * <p>
+	 * 	Can be any of following types:
+	 * <ul>
+	 * 	<li>A {@link Namespace} object
+	 * 	<li>A JSON string containing a single key/value pair indicating the name/URI mapping.
+	 * 	<li>A <code>Map</code> containing a single key/value pair indicating the name/URI mapping.
+	 * </ul>
+	 *
+	 * @param o The input.
+	 * @return The namespace object, or <jk>null</jk> if the input was <jk>null</jk> or an empty JSON object.
+	 */
+	@SuppressWarnings("rawtypes")
+	public static Namespace parseNamespace(Object o) {
+		if (o == null)
+			return null;
+		if (o instanceof Namespace)
+			return (Namespace)o;
+		try {
+			Map<?,?> m = (o instanceof Map ? (Map)o : new ObjectMap(o.toString()));
+			if (m.size() == 0)
+				return null;
+			if (m.size() > 1)
+				throw new RuntimeException("Too many namespaces specified.  Only one allowed. '"+o+"'");
+			Map.Entry<?,?> e = m.entrySet().iterator().next();
+			return get(e.getKey().toString(), e.getValue().toString());
+		} catch (ParseException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Converts the specified object into an array of {@link Namespace} object.
+	 * <p>
+	 * 	Can be any of following types:
+	 * <ul>
+	 * 	<li>A {@link Namespace} array
+	 * 	<li>A JSON string with key/value pairs indicating name/URI pairs.
+	 * 	<li>A <code>Map</code> with key/value pairs indicating name/URI pairs.
+	 * 	<li>A <code>Collection</code> containing any of object that can be passed to {@link #parseNamespace(Object)}.
+	 * </ul>
+	 *
+	 * @param o The input.
+	 * @return The namespace objects, or <jk>null</jk> if the input was <jk>null</jk> or an empty JSON object.
+	 */
+	@SuppressWarnings("rawtypes")
+	public static Namespace[] parseNamespaces(Object o) {
+		try {
+			if (o instanceof Namespace[])
+				return (Namespace[])o;
+
+			if (o instanceof CharSequence)
+				o = new ObjectMap(o.toString());
+
+			Namespace[] n;
+			int i = 0;
+			if (o instanceof Collection) {
+				Collection c = (Collection)o;
+				n = new Namespace[c.size()];
+				for (Object o2 : c)
+					n[i++] = parseNamespace(o2);
+			} else if (o instanceof Map) {
+				Map<?,?> m = (Map<?,?>)o;
+				n = new Namespace[m.size()];
+				for (Map.Entry e : m.entrySet())
+					n[i++] = get(e.getKey().toString(), e.getValue().toString());
+			} else {
+				throw new RuntimeException("Invalid type passed to NamespaceFactory.listFromObject: '"+o+"'");
+			}
+			return n;
+		} catch (ParseException e) {
+			throw new RuntimeException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.class
new file mode 100755
index 0000000..507530b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.java
new file mode 100755
index 0000000..3ffbe5c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanMeta.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Metadata on beans specific to the XML serializers and parsers pulled from the {@link Xml @Xml} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The bean class type.
+ */
+public class XmlBeanMeta<T> {
+
+	// XML related fields
+	private final Map<String,BeanPropertyMeta<T>> xmlAttrs;                        // Map of bean properties that are represented as XML attributes.
+	private final BeanPropertyMeta<T> xmlContent;                                  // Bean property that is represented as XML content within the bean element.
+	private final XmlContentHandler<T> xmlContentHandler;                          // Class used to convert bean to XML content.
+	private final Map<String,BeanPropertyMeta<T>> childElementProperties;          // Properties defined with @Xml.childName annotation.
+	private final BeanMeta<T> beanMeta;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanMeta The metadata on the bean that this metadata applies to.
+	 * @param pNames Only look at these property names.  If <jk>null</jk>, apply to all bean properties.
+	 */
+	public XmlBeanMeta(BeanMeta<T> beanMeta, String[] pNames) {
+		this.beanMeta = beanMeta;
+		Class<T> c = beanMeta.getClassMeta().getInnerClass();
+
+		Map<String,BeanPropertyMeta<T>> tXmlAttrs = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+		BeanPropertyMeta<T> tXmlContent = null;
+		XmlContentHandler<T> tXmlContentHandler = null;
+		Map<String,BeanPropertyMeta<T>> tChildElementProperties = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+
+		for (BeanPropertyMeta<T> p : beanMeta.getPropertyMetas(pNames)) {
+			XmlFormat xf = p.getXmlMeta().getXmlFormat();
+			if (xf == XmlFormat.ATTR)
+				tXmlAttrs.put(p.getName(), p);
+			else if (xf == XmlFormat.CONTENT) {
+				if (tXmlContent != null)
+					throw new BeanRuntimeException(c, "Multiple instances of CONTENT properties defined on class.  Only one property can be designated as such.");
+				tXmlContent = p;
+				tXmlContentHandler = p.getXmlMeta().getXmlContentHandler();
+			}
+			// Look for any properties that are collections with @Xml.childName specified.
+			String n = p.getXmlMeta().getChildName();
+			if (n != null) {
+				if (tChildElementProperties.containsKey(n))
+					throw new BeanRuntimeException(c, "Multiple properties found with the name ''{0}''.", n);
+				tChildElementProperties.put(n, p);
+			}
+		}
+
+		xmlAttrs = Collections.unmodifiableMap(tXmlAttrs);
+		xmlContent = tXmlContent;
+		xmlContentHandler = tXmlContentHandler;
+		childElementProperties = (tChildElementProperties.isEmpty() ? null : Collections.unmodifiableMap(tChildElementProperties));
+	}
+
+	/**
+	 * Returns the list of properties annotated with an {@link Xml#format()} of {@link XmlFormat#ATTR}.
+	 * In other words, the list of properties that should be rendered as XML attributes instead of child elements.
+	 *
+	 * @return Metadata on the XML attribute properties of the bean.
+	 */
+	protected Map<String,BeanPropertyMeta<T>> getXmlAttrProperties() {
+		return xmlAttrs;
+	}
+
+	/**
+	 * Returns the bean property annotated with an {@link Xml#format()} value of {@link XmlFormat#CONTENT}
+	 *
+	 * @return The bean property, or <jk>null</jk> if annotation is not specified.
+	 */
+	protected BeanPropertyMeta<T> getXmlContentProperty() {
+		return xmlContent;
+	}
+
+	/**
+	 * Return the XML content handler for this bean.
+	 *
+	 * @return The XML content handler for this bean, or <jk>null</jk> if no content handler is defined.
+	 */
+	protected XmlContentHandler<T> getXmlContentHandler() {
+		return xmlContentHandler;
+	}
+
+	/**
+	 * Returns the child element properties for this bean.
+	 * See {@link Xml#childName()}
+	 *
+	 * @return The child element properties for this bean, or <jk>null</jk> if no child element properties are defined.
+	 */
+	protected Map<String,BeanPropertyMeta<T>> getChildElementProperties() {
+		return childElementProperties;
+	}
+
+	/**
+	 * Returns bean property meta with the specified name.
+	 * This is identical to calling {@link BeanMeta#getPropertyMeta(String)} except it first retrieves
+	 * 	the bean property meta based on the child name (e.g. a property whose name is "people", but whose child name is "person").
+	 *
+	 * @param fieldName The bean property name.
+	 * @return The property metadata.
+	 */
+	protected BeanPropertyMeta<T> getPropertyMeta(String fieldName) {
+		if (childElementProperties != null) {
+			BeanPropertyMeta<T> bpm = childElementProperties.get(fieldName);
+			if (bpm != null)
+				return bpm;
+		}
+		return beanMeta.getPropertyMeta(fieldName);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.class
new file mode 100755
index 0000000..f3e5a97
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.java
new file mode 100755
index 0000000..210ae0b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlBeanPropertyMeta.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Metadata on bean properties specific to the XML serializers and parsers pulled from the {@link Xml @Xml} annotation on the bean property.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The bean class.
+ */
+public class XmlBeanPropertyMeta<T> {
+
+	private Namespace namespace = null;
+	private XmlFormat xmlFormat = XmlFormat.NORMAL;
+	private XmlContentHandler<T> xmlContentHandler = null;
+	private String childName;
+	private final BeanPropertyMeta<T> beanPropertyMeta;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanPropertyMeta The metadata of the bean property of this additional metadata.
+	 */
+	public XmlBeanPropertyMeta(BeanPropertyMeta<T> beanPropertyMeta) {
+		this.beanPropertyMeta = beanPropertyMeta;
+
+		if (beanPropertyMeta.getField() != null)
+			findXmlInfo(beanPropertyMeta.getField().getAnnotation(Xml.class));
+		if (beanPropertyMeta.getGetter() != null)
+			findXmlInfo(beanPropertyMeta.getGetter().getAnnotation(Xml.class));
+		if (beanPropertyMeta.getSetter() != null)
+			findXmlInfo(beanPropertyMeta.getSetter().getAnnotation(Xml.class));
+
+		if (namespace == null)
+			namespace = beanPropertyMeta.getBeanMeta().getClassMeta().getXmlMeta().getNamespace();
+
+		if (beanPropertyMeta.isBeanUri() && xmlFormat != XmlFormat.ELEMENT)
+			xmlFormat = XmlFormat.ATTR;
+	}
+
+	/**
+	 * Returns the XML namespace associated with this bean property.
+	 * <p>
+	 * 	Namespace is determined in the following order:
+	 * <ol>
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean property field.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean getter.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean setter.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean package.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean superclasses.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean superclass packages.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean interfaces.
+	 * 	<li>{@link Xml#prefix()} annotation defined on bean interface packages.
+	 * </ol>
+	 *
+	 * @return The namespace associated with this bean property, or <jk>null</jk> if no namespace is
+	 * 	associated with it.
+	 */
+	public Namespace getNamespace() {
+		return namespace;
+	}
+
+	/**
+	 * Returns the XML format of this property from the {@link Xml#format} annotation on this bean property.
+	 *
+	 * @return The XML format, or {@link XmlFormat#NORMAL} if annotation not specified.
+	 */
+	protected XmlFormat getXmlFormat() {
+		return xmlFormat;
+	}
+
+	/**
+	 * Returns the XML content handler of this property from the {@link Xml#contentHandler} annotation on this bean property.
+	 *
+	 * @return The XML content handler, or <jk>null</jk> if annotation not specified.
+	 */
+	protected XmlContentHandler<T> getXmlContentHandler() {
+		return xmlContentHandler;
+	}
+
+	/**
+	 * Returns the child element of this property from the {@link Xml#childName} annotation on this bean property.
+	 *
+	 * @return The child element, or <jk>null</jk> if annotation not specified.
+	 */
+	protected String getChildName() {
+		return childName;
+	}
+
+	/**
+	 * Returns the bean property metadata that this metadata belongs to.
+	 *
+	 * @return The bean property metadata.  Never <jk>null</jk>.
+	 */
+	protected BeanPropertyMeta<T> getBeanPropertyMeta() {
+		return beanPropertyMeta;
+	}
+
+	@SuppressWarnings("unchecked")
+	private void findXmlInfo(Xml xml) {
+		if (xml == null)
+			return;
+		ClassMeta<?> cmProperty = beanPropertyMeta.getClassMeta();
+		ClassMeta<?> cmBean = beanPropertyMeta.getBeanMeta().getClassMeta();
+		String name = beanPropertyMeta.getName();
+		if (! xml.name().isEmpty())
+			throw new BeanRuntimeException(cmBean.getInnerClass(), "Annotation error on property ''{0}''.  Found @Xml.name annotation can only be specified on types.", name);
+
+		List<Xml> xmls = beanPropertyMeta.findAnnotations(Xml.class);
+		List<XmlSchema> schemas = beanPropertyMeta.findAnnotations(XmlSchema.class);
+		namespace = XmlUtils.findNamespace(xmls, schemas);
+
+		if (xmlFormat == XmlFormat.NORMAL)
+			xmlFormat = xml.format();
+
+		boolean isCollection = cmProperty.isCollection() || cmProperty.isArray();
+
+		String cen = xml.childName();
+		if ((! cen.isEmpty()) && (! isCollection))
+			throw new BeanRuntimeException(cmProperty.getInnerClass(), "Annotation error on property ''{0}''.  @Xml.childName can only be specified on collections and arrays.", name);
+
+		if (xmlFormat == XmlFormat.COLLAPSED) {
+			if (isCollection) {
+				if (cen.isEmpty())
+					cen = cmProperty.getXmlMeta().getChildName();
+				if (cen == null || cen.isEmpty())
+					cen = cmProperty.getElementType().getXmlMeta().getElementName();
+				if (cen == null || cen.isEmpty())
+					cen = name;
+			} else {
+				throw new BeanRuntimeException(cmBean.getInnerClass(), "Annotation error on property ''{0}''.  @Xml.format=COLLAPSED can only be specified on collections and arrays.", name);
+			}
+			if (cen.isEmpty() && isCollection)
+				cen = cmProperty.getXmlMeta().getElementName();
+		}
+
+		try {
+			if (xmlFormat == XmlFormat.CONTENT && xml.contentHandler() != XmlContentHandler.NULL.class)
+				xmlContentHandler = (XmlContentHandler<T>) xml.contentHandler().newInstance();
+		} catch (Exception e) {
+			throw new BeanRuntimeException(cmBean.getInnerClass(), "Could not instantiate content handler ''{0}''", xml.contentHandler().getName()).initCause(e);
+		}
+
+		if (! cen.isEmpty())
+			childName = cen;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.class
new file mode 100755
index 0000000..f5ffbb0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.java
new file mode 100755
index 0000000..4252bab
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlClassMeta.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import java.util.*;
+
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+
+/**
+ * Metadata on classes specific to the XML serializers and parsers pulled from the {@link Xml @Xml} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class XmlClassMeta {
+
+	private final Namespace namespace;
+	private final Xml xml;
+	private final XmlFormat format;
+	private final String elementName;
+	private final String childName;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param c The class that this annotation is defined on.
+	 */
+	public XmlClassMeta(Class<?> c) {
+		this.namespace = findNamespace(c);
+		this.xml =  ReflectionUtils.getAnnotation(Xml.class, c);
+		if (xml != null) {
+			this.format = xml.format();
+			this.elementName = StringUtils.nullIfEmpty(xml.name());
+			this.childName = StringUtils.nullIfEmpty(xml.childName());
+
+		} else {
+			this.format = XmlFormat.NORMAL;
+			this.elementName = null;
+			this.childName = null;
+		}
+	}
+
+	/**
+	 * Returns the {@link Xml} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Xml} annotation defined on the class, or <jk>null</jk> if annotation is not specified.
+	 */
+	protected Xml getAnnotation() {
+		return xml;
+	}
+
+	/**
+	 * Returns the {@link Xml#format()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Xml#format()} annotation, or {@link XmlFormat#NORMAL} if not specified.
+	 */
+	protected XmlFormat getFormat() {
+		return format;
+	}
+
+	/**
+	 * Returns the {@link Xml#name()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Xml#name()} annotation, or <jk>null</jk> if not specified.
+	 */
+	protected String getElementName() {
+		return elementName;
+	}
+
+	/**
+	 * Returns the {@link Xml#childName()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link Xml#childName()} annotation, or <jk>null</jk> if not specified.
+	 */
+	protected String getChildName() {
+		return childName;
+	}
+
+	/**
+	 * Returns the XML namespace associated with this class.
+	 * <p>
+	 * 	Namespace is determined in the following order:
+	 * <ol>
+	 * 	<li>{@link Xml#prefix()} annotation defined on class.
+	 * 	<li>{@link Xml#prefix()} annotation defined on package.
+	 * 	<li>{@link Xml#prefix()} annotation defined on superclasses.
+	 * 	<li>{@link Xml#prefix()} annotation defined on superclass packages.
+	 * 	<li>{@link Xml#prefix()} annotation defined on interfaces.
+	 * 	<li>{@link Xml#prefix()} annotation defined on interface packages.
+	 * </ol>
+	 *
+	 * @return The namespace associated with this class, or <jk>null</jk> if no namespace is
+	 * 	associated with it.
+	 */
+	protected Namespace getNamespace() {
+		return namespace;
+	}
+
+	private Namespace findNamespace(Class<?> c) {
+		if (c == null)
+			return null;
+
+		List<Xml> xmls = ReflectionUtils.findAnnotations(Xml.class, c);
+		List<XmlSchema> schemas = ReflectionUtils.findAnnotations(XmlSchema.class, c);
+		return XmlUtils.findNamespace(xmls, schemas);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler$NULL.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler$NULL.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler$NULL.class
new file mode 100755
index 0000000..cd9f86e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler$NULL.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.class
new file mode 100755
index 0000000..b0f1b7a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.java
new file mode 100755
index 0000000..3ebfef3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlContentHandler.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import javax.xml.stream.*;
+
+import com.ibm.juno.core.dto.atom.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Customization class that allows a bean (or parts of a bean) to be serialized as XML text or mixed content.
+ * <p>
+ * 	For example, the ATOM specification allows text elements (e.g. title, subtitle...)
+ * 		to be either plain text or XML depending on the value of a <xa>type</xa> attribute.
+ * 	The behavior of text escaping thus depends on that attribute.
+ *
+ * <p class='bcode'>
+ * 	<xt>&lt;feed</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/2005/Atom"</xs><xt>&gt;</xt>
+ * 		<xt>&lt;title</xt> <xa>type</xa>=<xs>"html"</xs><xt>&gt;</xt>
+ * 			&amp;lt;p&amp;gt;&amp;lt;i&amp;gt;This is the title&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;
+ * 		<xt>&lt;/title&gt;</xt>
+ * 		<xt>&lt;title</xt> <xa>type</xa>=<xs>"xhtml"</xs><xt>&gt;</xt>
+ * 			<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs><xt>&gt;</xt>
+ * 				<xt>&lt;p&gt;&lt;i&gt;</xt>This is the subtitle<xt>&lt;/i&gt;&lt;/p&gt;</xt>
+ * 			<xt>&lt;/div&gt;</xt>
+ * 		<xt>&lt;/title&gt;</xt>
+ * 	<xt>&lt;/feed&gt;</xt>
+ * </p>
+ *
+ * <p>
+ * 	The ATOM {@link Text} class (the implementation for both the <xt>&lt;title&gt;</xt> and <xt>&lt;subtitle&gt;</xt>
+ * 		tags shown above) then associates a content handler through the {@link Xml#contentHandler()} annotation
+ * 		on the bean property containing the text, like so...
+ *
+ * <p class='bcode'>
+ * 	<ja>@Xml</ja>(format=<jsf>ATTR</jsf>)
+ * 	<jk>public</jk> String getType() {
+ * 		<jk>return</jk> <jf>type</jf>;
+ * 	}
+ *
+ * 	<ja>@Xml</ja>(format=<jsf>CONTENT</jsf>, contentHandler=TextContentHandler.<jk>class</jk>)
+ * 	<jk>public</jk> String getText() {
+ * 		<jk>return</jk> <jf>text</jf>;
+ * 	}
+ *
+ * 	<jk>public void</jk> setText(String text) {
+ * 		<jk>this</jk>.<jf>text</jf> = text;
+ * 	}
+ * </p>
+ *
+ * <p>
+ * 	The content handler that transforms the output is shown below...
+ *
+ * <p class='bcode'>
+ * 	<jk>public static class</jk> TextContentHandler <jk>implements</jk> XmlContentHandler&lt;Text&gt; {
+ *
+ * 		<ja>@Override</ja>
+ * 		<jk>public void</jk> parse(XMLStreamReader r, Text text) <jk>throws</jk> Exception {
+ * 			String type = text.<jf>type</jf>;
+ * 			<jk>if</jk> (type != <jk>null</jk> && type.equals(<js>"xhtml"</js>))
+ * 				text.<jf>text</jf> = <jsm>decode</jsm>(readXmlContents(r).trim());
+ * 			<jk>else</jk>
+ * 				text.<jf>text</jf> = <jsm>decode</jsm>(r.getElementText().trim());
+ * 		}
+ *
+ * 		<ja>@Override</ja>
+ * 		<jk>public void</jk> serialize(XmlSerializerWriter w, Text text) <jk>throws</jk> Exception {
+ * 			String type = text.<jf>type</jf>;
+ * 			String content = text.<jf>text</jf>;
+ * 			<jk>if</jk> (type != <jk>null</jk> && type.equals(<js>"xhtml"</js>))
+ * 				w.encodeTextInvalidChars(content);
+ * 			<jk>else</jk>
+ * 				w.encodeText(content);
+ * 		}
+ * 	}
+ * </p>
+ *
+ * <h6 class='topic'>Notes</h6>
+ * <ul>
+ * 	<li>The {@link Xml#contentHandler()} annotation can only be specified on a bean class, or a bean property
+ * 		of format {@link XmlFormat#CONTENT}.
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the bean
+ */
+public interface XmlContentHandler<T> {
+
+	/**
+	 * Represents <jk>null</jk> on the {@link Xml#contentHandler()} annotation.
+	 */
+	public static interface NULL extends XmlContentHandler<Object> {}
+
+	/**
+	 * Reads XML element content the specified reader and sets the appropriate value on the specified bean.
+	 * <p>
+	 * 	When this method is called, the attributes have already been parsed and set on the bean.
+	 * 	Therefore, if the content handling is different based on some XML attribute (e.g.
+	 * 		<code><xa>type</xa>=<xs>"text/xml"</xs></code> vs <code><xa>type</xa>=<xs>"text/plain"</xs></code>)
+	 * 		then that attribute value can be obtained via the set bean property.
+	 *
+	 * @param r The XML stream reader.
+	 * 	When called, the reader is positioned on the element containing the text to read.
+	 * 	For example, calling <code>r.getElementText()</code> can be called immediately
+	 * 	to return the element text if the element contains only characters and whitespace.
+	 * 	However typically, the stream is going to contain XML elements that need to
+	 * 	be handled special (otherwise you wouldn't need to use an <code>XmlContentHandler</code>
+	 * 	to begin with).
+	 * @param bean The bean where the parsed contents are going to be placed.
+	 * 	Subclasses determine how the content maps to values in the bean.
+	 * 	However, typically the contents map to a single property on the bean.
+	 * @throws Exception If any problem occurs.  Causes parse to fail.
+	 */
+	public void parse(XMLStreamReader r, T bean) throws Exception;
+
+	/**
+	 * Writes XML element content from values in the specified bean.
+	 *
+	 * @param w The XML output writer.
+	 * 	When called, the XML element/attributes and
+	 * 		whitespace/indentation (if enabled) have already been written to the stream.
+	 * 	Subclasses must simply write the contents of the element.
+	 * @param bean The bean whose values will be converted to XML content.
+	 * @throws Exception If any problems occur.  Causes serialize to fail.
+	 */
+	public void serialize(XmlSerializerWriter w, T bean) throws Exception;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer$Simple.class
new file mode 100755
index 0000000..876d0e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.class
new file mode 100755
index 0000000..7eef3a8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.java
new file mode 100755
index 0000000..a2d7da0
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlDocSerializer.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.xml.XmlSerializerProperties.*;
+
+import java.io.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJOs to HTTP responses as XML.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/xml</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/xml</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Same as {@link XmlSerializer}, except prepends <code><xt>&lt;?xml</xt> <xa>version</xa>=<xs>'1.0'</xs> <xa>encoding</xa>=<xs>'UTF-8'</xs><xt>?&gt;</xt></code> to the response
+ * 	to make it a valid XML document.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class XmlDocSerializer extends XmlSerializer {
+
+	/** Default serializer without namespaces. */
+	@Produces(value="text/xml+simple",contentType="text/xml")
+	public static class Simple extends XmlDocSerializer {
+		/** Constructor */
+		public Simple() {
+			setProperty(XML_enableNamespaces, false);
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		XmlSerializerContext xctx = (XmlSerializerContext)ctx;
+		XmlSerializerWriter w = xctx.getWriter(out);
+		w.append("<?xml")
+			.attr("version", "1.0")
+			.attr("encoding", "UTF-8")
+			.appendln("?>");
+		super.doSerialize(o, w, ctx);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.class
new file mode 100755
index 0000000..8ef1946
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.java
new file mode 100755
index 0000000..9503b03
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParser.java
@@ -0,0 +1,558 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.xml;
+
+import static com.ibm.juno.core.utils.StringUtils.*;
+import static com.ibm.juno.core.xml.XmlUtils.*;
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+import static javax.xml.stream.XMLStreamConstants.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import javax.xml.stream.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Parses text generated by the {@link XmlSerializer} class back into a POJO model.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Content-Type</code> types: <code>text/xml</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	See the {@link XmlSerializer} class for a description of Juno-generated XML.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link XmlParserProperties}
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Consumes({"text/xml","application/xml"})
+public class XmlParser extends ReaderParser {
+
+	/** Default parser, all default settings.*/
+	public static final XmlParser DEFAULT = new XmlParser().lock();
+
+	private static final int UNKNOWN=0, OBJECT=1, ARRAY=2, STRING=3, NUMBER=4, BOOLEAN=5, NULL=6;
+
+
+	/** XML specific properties currently defined on this class */
+	protected transient XmlParserProperties xpp = new XmlParserProperties();
+
+
+	private <T> T parseAnything(ClassMeta<T> nt, XmlParserContext ctx, String currAttr, XMLStreamReader r, BeanPropertyMeta p, Object outer, boolean isRoot) throws ParseException, IOException {
+
+		try {
+			BeanContext bc = ctx.getBeanContext();
+			if (nt == null)
+				nt = (ClassMeta<T>)object();
+			PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+			ClassMeta<?> ft = nt.getFilteredClassMeta();
+
+			String wrapperAttr = (isRoot && ctx.isPreserveRootElement()) ? r.getName().getLocalPart() : null;
+			String typeAttr = r.getAttributeValue(null, "type");
+			int jsonType = getJsonType(typeAttr);
+			String b = r.getAttributeValue(ctx.getXsiNs(), "nil");
+			if (b == null)
+				b = r.getAttributeValue(null, "nil");
+			boolean isNull = b != null && b.equals("true");
+			if (jsonType == 0) {
+				try {
+					String elementName = decode(r.getLocalName());
+					if (elementName == null || elementName.equals(currAttr))
+						jsonType = UNKNOWN;
+					else
+						jsonType = getJsonType(elementName);
+				} catch (Exception e) {
+					throw e;
+				}
+			}
+			if (! ft.canCreateNewInstance(outer)) {
+				String c = r.getAttributeValue(null, "_class");
+				if (c != null) {
+					ft = nt = (ClassMeta<T>)bc.getClassMetaFromString(c);
+				}
+			}
+			Object o = null;
+
+			if (jsonType == NULL) {
+				r.nextTag();	// Discard end tag
+				return null;
+			}
+			if (isNull) {
+				while (true) {
+					int e = r.next();
+					if (e == END_ELEMENT)
+						return null;
+				}
+			}
+
+			if (ft.isObject()) {
+				if (jsonType == OBJECT) {
+					ObjectMap m = new ObjectMap(bc);
+					parseIntoMap(ctx, r, m, string(), object());
+					if (wrapperAttr != null)
+						m = new ObjectMap(bc).append(wrapperAttr, m);
+					o = m.cast();
+				} else if (jsonType == ARRAY)
+					o = parseIntoCollection(ctx, r, new ObjectList(bc), object());
+				else if (jsonType == STRING) {
+					o = getText(ctx, r);
+					if (ft.isChar())
+						o = o.toString().charAt(0);
+				}
+				else if (jsonType == NUMBER)
+					o = parseNumber(getText(ctx, r), null);
+				else if (jsonType == BOOLEAN)
+					o = Boolean.parseBoolean(getText(ctx, r));
+				else if (jsonType == UNKNOWN)
+					o = getUnknown(ctx, r);
+			} else if (ft.isBoolean()) {
+				o = Boolean.parseBoolean(getText(ctx, r));
+			} else if (ft.isCharSequence()) {
+				o = getText(ctx, r);
+			} else if (ft.isChar()) {
+				o = getText(ctx, r).charAt(0);
+			} else if (ft.isMap()) {
+				Map m = (ft.canCreateNewInstance(outer) ? (Map)ft.newInstance(outer) : new ObjectMap(bc));
+				o = parseIntoMap(ctx, r, m, ft.getKeyType(), ft.getValueType());
+				if (wrapperAttr != null)
+					o = new ObjectMap(bc).append(wrapperAttr, m);
+			} else if (ft.isCollection()) {
+				Collection l = (ft.canCreateNewInstance(outer) ? (Collection)ft.newInstance(outer) : new ObjectList(bc));
+				o = parseIntoCollection(ctx, r, l, ft.getElementType());
+			} else if (ft.isNumber()) {
+				o = parseNumber(getText(ctx, r), (Class<? extends Number>)ft.getInnerClass());
+			} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap(ctx, r, m, string(), object());
+				o = ft.newInstanceFromObjectMap(outer, m);
+			} else if (ft.canCreateNewBean(outer)) {
+				if (ft.getXmlMeta().getFormat() == XmlFormat.COLLAPSED) {
+					String fieldName = r.getLocalName();
+					BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+					BeanPropertyMeta bpm = m.getMeta().getXmlMeta().getPropertyMeta(fieldName);
+					bpm.set(m, parseAnything(m.getMeta().getClassMeta(), ctx, currAttr, r, p, m.getBean(false), false));
+					o = m.getBean();
+				} else {
+					BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+					o = parseIntoBean(ctx, r, m).getBean();
+				}
+			} else if (ft.isArray()) {
+				ArrayList l = (ArrayList)parseIntoCollection(ctx, r, new ArrayList(), ft.getElementType());
+				o = bc.toArray(ft, l);
+			} else if (ft.canCreateNewInstanceFromString(outer)) {
+				o = ft.newInstanceFromString(outer, getText(ctx, r));
+			} else {
+				throw new ParseException("Class ''{0}'' could not be instantiated.  Reason: ''{1}''", ft.getInnerClass().getName(), ft.getNotABeanReason());
+			}
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (currAttr != null)
+				setName(nt, o, currAttr);
+
+			return (T)o;
+		} catch (ParseException e) {
+			throw e;
+		} catch (IOException e) {
+			throw e;
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new ParseException("Error occurred while trying to parse class type ''{0}''", nt).initCause(e);
+		}
+	}
+
+	private <K,V> Map<K,V> parseIntoMap(XmlParserContext ctx, XMLStreamReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws ParseException, IOException {
+		BeanContext bc = ctx.getBeanContext();
+		try {
+			int depth = 0;
+			for (int i = 0; i < r.getAttributeCount(); i++) {
+				String a = r.getAttributeLocalName(i);
+				// TODO - Need better handling of namespaces here.
+				if (! (a.equals("type"))) {
+					K key = convertAttrToType(m, a, keyType);
+					V value = convertAttrToType(m, r.getAttributeValue(i), valueType);
+					m.put(key, value);
+				}
+			}
+			do {
+				int event = r.nextTag();
+				String currAttr;
+				if (event == START_ELEMENT) {
+					depth++;
+					currAttr = decode(r.getLocalName());
+					K key = convertAttrToType(m, currAttr, keyType);
+					V value = parseAnything(valueType, ctx, currAttr, r, null, m, false);
+					if (valueType.isObject() && m.containsKey(key)) {
+						Object o = m.get(key);
+						if (o instanceof List)
+							((List)o).add(value);
+						else
+							m.put(key, (V)new ObjectList(o, value).setBeanContext(bc));
+					} else {
+						m.put(key, value);
+					}
+				} else if (event == END_ELEMENT) {
+					depth--;
+					return m;
+				}
+			} while (depth > 0);
+			return m;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	private <E> Collection<E> parseIntoCollection(XmlParserContext ctx, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType) throws ParseException, IOException {
+		try {
+			int depth = 0;
+			do {
+				int event = r.nextTag();
+				if (event == START_ELEMENT) {
+					depth++;
+					E value = parseAnything(elementType, ctx, null, r, null, l, false);
+					l.add(value);
+				} else if (event == END_ELEMENT) {
+					depth--;
+					return l;
+				}
+			} while (depth > 0);
+			return l;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	private Object[] parseArgs(XmlParserContext ctx, XMLStreamReader r, ClassMeta<?>[] argTypes) throws ParseException, IOException {
+		try {
+			int depth = 0;
+			Object[] o = new Object[argTypes.length];
+			int i = 0;
+			do {
+				int event = r.nextTag();
+				if (event == START_ELEMENT) {
+					depth++;
+					o[i] = parseAnything(argTypes[i], ctx, null, r, null, null, false);
+					i++;
+				} else if (event == END_ELEMENT) {
+					depth--;
+					return o;
+				}
+			} while (depth > 0);
+			return o;
+		} catch (XMLStreamException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	private int getJsonType(String s) {
+		if (s == null)
+			return UNKNOWN;
+		char c = s.charAt(0);
+		switch(c) {
+			case 'o': return (s.equals("object") ? OBJECT : UNKNOWN);
+			case 'a': return (s.equals("array") ? ARRAY : UNKNOWN);
+			case 's': return (s.equals("string") ? STRING : UNKNOWN);
+			case 'b': return (s.equals("boolean") ? BOOLEAN : UNKNOWN);
+			case 'n': {
+				c = s.charAt(2);
+				switch(c) {
+					case 'm': return (s.equals("number") ? NUMBER : UNKNOWN);
+					case 'l': return (s.equals("null") ? NULL : UNKNOWN);
+				}
+				//return NUMBER;
+			}
+		}
+		return UNKNOWN;
+	}
+
+	private <T> BeanMap<T> parseIntoBean(XmlParserContext ctx, XMLStreamReader r, BeanMap<T> m) throws Exception {
+		BeanMeta bMeta = m.getMeta();
+		XmlBeanMeta xmlMeta = bMeta.getXmlMeta();
+
+		for (int i = 0; i < r.getAttributeCount(); i++) {
+			String key = decode(r.getAttributeLocalName(i));
+			String val = r.getAttributeValue(i);
+			BeanPropertyMeta bpm = xmlMeta.getPropertyMeta(key);
+			if (bpm == null) {
+				if (m.getMeta().isSubTyped()) {
+					m.put(key, val);
+				} else {
+					Location l = r.getLocation();
+					onUnknownProperty(ctx, key, m, l.getLineNumber(), l.getColumnNumber());
+				}
+			} else {
+				bpm.set(m, val);
+			}
+		}
+
+		BeanPropertyMeta cp = xmlMeta.getXmlContentProperty();
+		if (cp != null) {
+			XmlContentHandler h = xmlMeta.getXmlContentHandler();
+			if (h != null) {
+				h.parse(r, m.getBean());
+			} else {
+				String text = r.getElementText();
+				cp.set(m, decode(text.trim()));
+			}
+			return m;
+		}
+
+		int depth = 0;
+		do {
+			int event = r.nextTag();
+			String currAttr;
+			if (event == START_ELEMENT) {
+				depth++;
+				currAttr = decode(r.getLocalName());
+				BeanPropertyMeta pMeta = xmlMeta.getPropertyMeta(currAttr);
+				if (pMeta == null) {
+					if (m.getMeta().isSubTyped()) {
+						m.put(currAttr, parseAnything(ctx.getBeanContext().string(), ctx, currAttr, r, null, m.getBean(false), false));
+					} else {
+						Location l = r.getLocation();
+						onUnknownProperty(ctx, currAttr, m, l.getLineNumber(), l.getColumnNumber());
+						skipCurrentTag(r);
+					}
+				} else {
+					XmlFormat xf = pMeta.getXmlMeta().getXmlFormat();
+					if (xf == COLLAPSED) {
+						pMeta.add(m, parseAnything(pMeta.getClassMeta().getElementType(), ctx, currAttr, r, null, m.getBean(false), false));
+					} else if (xf == ATTR)  {
+						pMeta.set(m, decode(r.getAttributeValue(0)));
+						r.nextTag();
+					} else {
+						pMeta.set(m, parseAnything(pMeta.getClassMeta(), ctx, currAttr, r, pMeta, m.getBean(false), false));
+					}
+				}
+			} else if (event == END_ELEMENT) {
+				depth--;
+				return m;
+			}
+		} while (depth > 0);
+		return m;
+	}
+
+	private void skipCurrentTag(XMLStreamReader r) throws XMLStreamException {
+		int depth = 1;
+		do {
+			int event = r.next();
+			if (event == START_ELEMENT)
+				depth++;
+			else if (event == END_ELEMENT)
+				depth--;
+		} while (depth > 0);
+	}
+
+	private String getText(XmlParserContext ctx, XMLStreamReader r) throws Exception {
+		String s = r.getElementText();
+		if (s.length() == 0)
+			return s;
+		if (ctx.isTrimWhitespace() && Character.isWhitespace(s.charAt(0)) || Character.isWhitespace(s.charAt(s.length()-1)))
+			s = s.trim();
+		if (s.indexOf('_') == -1)
+			return s;
+		return decode(s);
+	}
+
+	private Object getUnknown(XmlParserContext ctx, XMLStreamReader r) throws Exception {
+		BeanContext bc = ctx.getBeanContext();
+		if (r.getEventType() != XMLStreamConstants.START_ELEMENT) {
+			throw new XMLStreamException("parser must be on START_ELEMENT to read next text", r.getLocation());
+		}
+		ObjectMap m = null;
+
+		// If this element has attributes, then it's always an ObjectMap.
+		if (r.getAttributeCount() > 0) {
+			m = new ObjectMap(bc);
+			for (int i = 0; i < r.getAttributeCount(); i++) {
+				String key = decode(r.getAttributeLocalName(i));
+				String val = r.getAttributeValue(i);
+				if (! key.equals("type"))
+					m.put(key, val);
+			}
+		}
+		int eventType = r.next();
+		StringBuilder sb = new StringBuilder();
+		while (eventType != XMLStreamConstants.END_ELEMENT) {
+			if (eventType == XMLStreamConstants.CHARACTERS || eventType == XMLStreamConstants.CDATA || eventType == XMLStreamConstants.SPACE || eventType == XMLStreamConstants.ENTITY_REFERENCE) {
+				sb.append(r.getText());
+			} else if (eventType == XMLStreamConstants.PROCESSING_INSTRUCTION || eventType == XMLStreamConstants.COMMENT) {
+				// skipping
+			} else if (eventType == XMLStreamConstants.END_DOCUMENT) {
+				throw new XMLStreamException("Unexpected end of document when reading element text content", r.getLocation());
+			} else if (eventType == XMLStreamConstants.START_ELEMENT) {
+				// Oops...this has an element in it.
+				// Parse it as a map.
+				if (m == null)
+					m = new ObjectMap(bc);
+				int depth = 0;
+				do {
+					int event = (eventType == -1 ? r.nextTag() : eventType);
+					String currAttr;
+					if (event == START_ELEMENT) {
+						depth++;
+						currAttr = decode(r.getLocalName());
+						String key = convertAttrToType(null, currAttr, string());
+						Object value = parseAnything(object(), ctx, currAttr, r, null, null, false);
+						if (m.containsKey(key)) {
+							Object o = m.get(key);
+							if (o instanceof ObjectList)
+								((ObjectList)o).add(value);
+							else
+								m.put(key, new ObjectList(o, value).setBeanContext(bc));
+						} else {
+							m.put(key, value);
+						}
+
+					} else if (event == END_ELEMENT) {
+						depth--;
+						break;
+					}
+					eventType = -1;
+				} while (depth > 0);
+				break;
+			} else {
+				throw new XMLStreamException("Unexpected event type " + eventType, r.getLocation());
+			}
+			eventType = r.next();
+		}
+		String s = sb.toString();
+		if (s.length() > 0) {
+			if (ctx.isTrimWhitespace() && Character.isWhitespace(s.charAt(0)) || Character.isWhitespace(s.charAt(s.length()-1)))
+				s = s.trim();
+			if (s.indexOf('_') != -1)
+				s = decode(s);
+		}
+		if (m != null) {
+			if (! s.isEmpty())
+				m.put("contents", s);
+			return m;
+		}
+		return s;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public XmlParserContext createContext(ObjectMap properties, Method javaMethod, Object outer) {
+		return new XmlParserContext(getBeanContext(), pp, xpp, properties, javaMethod, outer);
+	}
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+		XmlParserContext xctx = (XmlParserContext)ctx;
+		return parseAnything(type, xctx, null, xctx.getReader(in, estimatedSize), null, ctx.getOuter(), true);
+	}
+
+	@Override /* ReaderParser */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		ClassMeta cm = ctx.getBeanContext().getMapClassMeta(m.getClass(), keyType, valueType);
+		XmlParserContext xctx = (XmlParserContext)ctx;
+		return parseIntoMap(xctx, xctx.getReader(in, estimatedSize), m, cm.getKeyType(), cm.getValueType());
+	}
+
+	@Override /* ReaderParser */
+	protected <E> Collection<E> doParseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType, ParserContext ctx) throws ParseException, IOException {
+		ClassMeta cm = ctx.getBeanContext().getCollectionClassMeta(c.getClass(), elementType);
+		XmlParserContext xctx = (XmlParserContext)ctx;
+		return parseIntoCollection(xctx, xctx.getReader(in, estimatedSize), c, cm.getElementType());
+	}
+
+	@Override /* ReaderParser */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		XmlParserContext xctx = (XmlParserContext)ctx;
+		return parseArgs(xctx, xctx.getReader(in, estimatedSize), argTypes);
+	}
+
+	@Override /* CoreApi */
+	public XmlParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! xpp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> XmlParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public XmlParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public XmlParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public XmlParser clone() {
+		try {
+			XmlParser c = (XmlParser)super.clone();
+			c.xpp = xpp.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.class
new file mode 100755
index 0000000..7b0a2a3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/xml/XmlParserContext.class differ


[47/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestClient.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestClient.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestClient.java
new file mode 100755
index 0000000..ffcecbd
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestClient.java
@@ -0,0 +1,1411 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.lang.reflect.Proxy;
+import java.net.*;
+import java.security.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.logging.*;
+import java.util.regex.*;
+
+import javax.net.ssl.*;
+
+import org.apache.http.*;
+import org.apache.http.auth.*;
+import org.apache.http.client.*;
+import org.apache.http.client.CookieStore;
+import org.apache.http.client.config.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.config.*;
+import org.apache.http.conn.*;
+import org.apache.http.conn.routing.*;
+import org.apache.http.conn.socket.*;
+import org.apache.http.conn.ssl.*;
+import org.apache.http.conn.util.*;
+import org.apache.http.cookie.*;
+import org.apache.http.entity.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.impl.conn.*;
+import org.apache.http.protocol.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.urlencoding.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Utility class for interfacing with remote REST interfaces.
+ *
+ *
+ * <h6 class='topic'>Features</h6>
+ * <ul>
+ * 	<li>Convert POJOs directly to HTTP request message bodies using {@link Serializer} class.
+ * 	<li>Convert HTTP response message bodies directly to POJOs using {@link Parser} class.
+ * 	<li>Fluent interface.
+ * 	<li>Thread safe.
+ * 	<li>API for interacting with remoteable services.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <ul>
+ * 	<li><a class='doclink' href='package-summary.html#RestClient'>com.ibm.juno.client &gt; REST client API</a> for more information and code examples.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class RestClient extends CoreApi {
+
+	Map<String,Object> headers = new TreeMap<String,Object>(String.CASE_INSENSITIVE_ORDER);
+	volatile CloseableHttpClient httpClient;
+	HttpClientConnectionManager httpClientConnectionManager;
+	Serializer<?> serializer;
+	UrlEncodingSerializer urlEncodingSerializer = new UrlEncodingSerializer();  // Used for form posts only.
+	Parser<?> parser;
+	String accept, contentType;
+	List<RestCallInterceptor> interceptors = new ArrayList<RestCallInterceptor>();
+	String remoteableServletUri;
+	private Map<Method,String> remoteableServiceUriMap = new ConcurrentHashMap<Method,String>();
+	private String rootUrl;
+	private SSLOpts sslOpts;
+	private boolean pooled;
+	private volatile boolean isClosed = false;
+	private StackTraceElement[] creationStack;
+
+	/**
+	 * The {@link HttpClientBuilder} returned by {@link #createHttpClientBuilder()}.
+	 */
+	protected HttpClientBuilder httpClientBuilder;
+
+	/**
+	 * Create a new client with no serializer, parser, or HTTP client.
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 */
+	public RestClient() {
+		httpClientBuilder = createHttpClientBuilder();
+		if (Boolean.getBoolean("com.ibm.juno.client.RestClient.trackCreation"))
+			creationStack = Thread.currentThread().getStackTrace();
+	}
+
+	/**
+	 * Create a new client with the specified HTTP client.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 */
+	public RestClient(CloseableHttpClient httpClient) {
+		this();
+		setHttpClient(httpClient);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setSerializer(s).setParser(p);
+	 * </p>
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 *
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 */
+	public RestClient(Serializer<?> s, Parser<?> p) {
+		this();
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser instances.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient).setSerializer(s).setParser(p);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 */
+	public RestClient(CloseableHttpClient httpClient, Serializer<?> s, Parser<?> p) {
+		this();
+		setHttpClient(httpClient);
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setSerializer(s).setParser(p);
+	 * </p>
+	 * <p>
+	 * If you do not specify an {@link HttpClient} via the {@link #setHttpClient(CloseableHttpClient)}, one
+	 * 	will be created using the {@link #createHttpClient()} method.
+	 *
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public RestClient(Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException {
+		this();
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Create a new client with the specified serializer and parser classes.
+	 * <p>
+	 * Equivalent to calling the following:
+	 * <p class='bcode'>
+	 * 	RestClient rc = <jk>new</jk> RestClient().setHttpClient(httpClient).setSerializer(s).setParser(p);
+	 * </p>
+	 *
+	 * @param httpClient The HTTP client to use for communicating with remote server.
+	 * @param s The serializer for converting POJOs to HTTP request message body text.
+	 * @param p The parser for converting HTTP response message body text to POJOs.
+	 * @throws InstantiationException If serializer or parser could not be instantiated.
+	 */
+	public RestClient(CloseableHttpClient httpClient, Class<? extends Serializer<?>> s, Class<? extends Parser<?>> p) throws InstantiationException {
+		this();
+		setHttpClient(httpClient);
+		setSerializer(s);
+		setParser(p);
+	}
+
+	/**
+	 * Creates an instance of an {@link HttpClient} to be used to handle all HTTP communications with the target server.
+	 * <p>
+	 * This HTTP client is used when the HTTP client is not specified through one of the constructors or the
+	 * 	{@link #setHttpClient(CloseableHttpClient)} method.
+	 * <p>
+	 * Subclasses can override this method to provide specially-configured HTTP clients to handle
+	 * 	stuff such as SSL/TLS certificate handling, authentication, etc.
+	 * <p>
+	 * The default implementation returns an instance of {@link HttpClient} using the client builder
+	 * 	returned by {@link #createHttpClientBuilder()}.
+	 *
+	 * @return The HTTP client to use.
+	 * @throws Exception
+	 */
+	protected CloseableHttpClient createHttpClient() throws Exception {
+		// Don't call createConnectionManager() if RestClient.setConnectionManager() was called.
+		if (httpClientConnectionManager == null)
+			httpClientBuilder.setConnectionManager(createConnectionManager());
+		return httpClientBuilder.build();
+	}
+
+	/**
+	 * Creates an instance of an {@link HttpClientBuilder} to be used to create
+	 * 	the {@link HttpClient}.
+	 * <p>
+	 * 	Subclasses can override this method to provide their own client builder.
+	 * </p>
+	 * <p>
+	 * 	The predefined method returns an {@link HttpClientBuilder} with the following settings:
+	 * </p>
+	 * <ul>
+	 * 	<li>Lax redirect strategy.
+	 * 	<li>The connection manager returned by {@link #createConnectionManager()}.
+	 * </ul>
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	protected HttpClientBuilder createHttpClientBuilder() {
+		HttpClientBuilder b = HttpClientBuilder.create();
+		b.setRedirectStrategy(new AllowAllRedirects());
+		return b;
+	}
+
+	/**
+	 * Creates the {@link HttpClientConnectionManager} returned by {@link #createConnectionManager()}.
+	 * <p>
+	 * 	Subclasses can override this method to provide their own connection manager.
+	 * </p>
+	 * <p>
+	 * 	The default implementation returns an instance of a {@link PoolingHttpClientConnectionManager}.
+	 * </p>
+	 *
+	 * @return The HTTP client builder to use to create the HTTP client.
+	 */
+	@SuppressWarnings("resource")
+	protected HttpClientConnectionManager createConnectionManager() {
+		if (sslOpts != null) {
+			HostnameVerifier hv = null;
+			switch (sslOpts.getHostVerify()) {
+				case LAX: hv = new NoopHostnameVerifier(); break;
+				case DEFAULT: hv = new DefaultHostnameVerifier(); break;
+			}
+
+			for (String p : StringUtils.split(sslOpts.getProtocols(), ',')) {
+				try {
+					TrustManager tm = new SimpleX509TrustManager(sslOpts.getCertValidate() == SSLOpts.CertValidate.LAX);
+
+					SSLContext ctx = SSLContext.getInstance(p);
+					ctx.init(null, new TrustManager[] { tm }, null);
+
+					// Create a socket to ensure this algorithm is acceptable.
+					// This will correctly disallow certain configurations (such as SSL_TLS under FIPS)
+					ctx.getSocketFactory().createSocket().close();
+					SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(ctx, hv);
+					setSSLSocketFactory(sf);
+
+					Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sf).build();
+
+					return (pooled ? new PoolingHttpClientConnectionManager(r) : new BasicHttpClientConnectionManager(r));
+				} catch (Throwable t) {}
+			}
+		}
+
+			// Using pooling connection so that this client is threadsafe.
+		return (pooled ? new PoolingHttpClientConnectionManager() : new BasicHttpClientConnectionManager());
+	}
+
+	/**
+	 * Set up this client to use BASIC auth.
+	 *
+	 * @param host The auth scope hostname.
+	 * @param port The auth scope port.
+	 * @param user The username.
+	 * @param pw The password.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setBasicAuth(String host, int port, String user, String pw) {
+		AuthScope scope = new AuthScope(host, port);
+		Credentials up = new UsernamePasswordCredentials(user, pw);
+		CredentialsProvider p = new BasicCredentialsProvider();
+		p.setCredentials(scope, up);
+		setDefaultCredentialsProvider(p);
+		return this;
+	}
+
+	/**
+	 * When called, the {@link #createConnectionManager()} method will return a {@link PoolingHttpClientConnectionManager}
+	 * 	instead of a {@link BasicHttpClientConnectionManager}.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setPooled() {
+		this.pooled = true;
+		return this;
+	}
+
+	/**
+	 * Calls {@link CloseableHttpClient#close()} on the underlying {@link CloseableHttpClient}.
+	 * It's good practice to call this method after the client is no longer used.
+	 *
+	 * @throws IOException
+	 */
+	public void close() throws IOException {
+		isClosed = true;
+		if (httpClient != null)
+			httpClient.close();
+	}
+
+	/**
+	 * Same as {@link #close()}, but ignores any exceptions.
+	 */
+	public void closeQuietly() {
+		isClosed = true;
+		try {
+			if (httpClient != null)
+				httpClient.close();
+		} catch (Throwable t) {}
+	}
+
+	/**
+	 * Specifies a request header property to add to all requests created by this client.
+	 *
+	 * @param name The HTTP header name.
+	 * @param value The HTTP header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setHeader(String name, Object value) {
+		this.headers.put(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets the serializer used for serializing POJOs to the HTTP request message body.
+	 *
+	 * @param serializer The serializer.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setSerializer(Serializer<?> serializer) {
+		this.serializer = serializer;
+		return this;
+	}
+
+	/**
+	 * Same as {@link #setSerializer(Serializer)}, except takes in a serializer class that
+	 * 	will be instantiated through a no-arg constructor.
+	 *
+	 * @param c The serializer class.
+	 * @return This object (for method chaining).
+	 * @throws InstantiationException If serializer could not be instantiated.
+	 */
+	public RestClient setSerializer(Class<? extends Serializer<?>> c) throws InstantiationException {
+		try {
+			return setSerializer(c.newInstance());
+		} catch (IllegalAccessException e) {
+			throw new InstantiationException(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Sets the parser used for parsing POJOs from the HTTP response message body.
+	 *
+	 * @param parser The parser.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setParser(Parser<?> parser) {
+		this.parser = parser;
+		this.accept = parser.getMediaTypes()[0];
+		return this;
+	}
+
+	/**
+	 * Same as {@link #setParser(Parser)}, except takes in a parser class that
+	 * 	will be instantiated through a no-arg constructor.
+	 *
+	 * @param c The parser class.
+	 * @return This object (for method chaining).
+	 * @throws InstantiationException If parser could not be instantiated.
+	 */
+	public RestClient setParser(Class<? extends Parser<?>> c) throws InstantiationException {
+		try {
+			return setParser(c.newInstance());
+		} catch (IllegalAccessException e) {
+			throw new InstantiationException(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Sets the internal {@link HttpClient} to use for handling HTTP communications.
+	 *
+	 * @param httpClient The HTTP client.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setHttpClient(CloseableHttpClient httpClient) {
+		this.httpClient = httpClient;
+		return this;
+	}
+
+	/**
+	 * Adds an interceptor that gets called immediately after a connection is made.
+	 *
+	 * @param interceptor The interceptor.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient addInterceptor(RestCallInterceptor interceptor) {
+		interceptors.add(interceptor);
+		return this;
+	}
+
+	/**
+	 * Adds a {@link RestCallLogger} to the list of interceptors on this class.
+	 *
+	 * @param level The log level to log messsages at.
+	 * @param log The logger to log messages to.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient logTo(Level level, Logger log) {
+		addInterceptor(new RestCallLogger(level, log));
+		return this;
+	}
+
+	/**
+	 * Returns the serializer currently associated with this client.
+	 *
+	 * @return The serializer currently associated with this client, or <jk>null</jk> if no serializer is currently associated.
+	 */
+	public Serializer<?> getSerializer() {
+		return serializer;
+	}
+
+	/**
+	 * Returns the parser currently associated with this client.
+	 *
+	 * @return The parser currently associated with this client, or <jk>null</jk> if no parser is currently associated.
+	 */
+	public Parser<?> getParser() {
+		return parser;
+	}
+
+	/**
+	 * Returns the {@link HttpClient} currently associated with this client.
+	 *
+	 * @return The HTTP client currently associated with this client.
+	 * @throws Exception
+	 */
+	public HttpClient getHttpClient() throws Exception {
+		if (httpClient == null)
+			httpClient = createHttpClient();
+		return httpClient;
+	}
+
+	/**
+	 * Execute the specified request.
+	 * Subclasses can override this method to provide specialized handling.
+	 *
+	 * @param req The HTTP request.
+	 * @return The HTTP response.
+	 * @throws Exception
+	 */
+	protected HttpResponse execute(HttpUriRequest req) throws Exception {
+		return getHttpClient().execute(req);
+	}
+
+	/**
+	 * Sets the value for the <code>Accept</code> request header.
+	 * <p>
+	 * 	This overrides the media type specified on the parser, but is overridden by calling <code>setHeader(<js>"Accept"</js>, newvalue);</code>
+	 *
+	 * @param accept The new header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setAccept(String accept) {
+		this.accept = accept;
+		return this;
+	}
+
+	/**
+	 * Sets the value for the <code>Content-Type</code> request header.
+	 * <p>
+	 * 	This overrides the media type specified on the serializer, but is overridden by calling <code>setHeader(<js>"Content-Type"</js>, newvalue);</code>
+	 *
+	 * @param contentType The new header value.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setContentType(String contentType) {
+		this.contentType = contentType;
+		return this;
+	}
+
+	/**
+	 * Sets the URI of the remoteable services REST servlet for invoking remoteable services.
+	 *
+	 * @param remoteableServletUri The URI of the REST resource implementing a remoteable services servlet.
+	 *		(typically an instance of <code>RemoteableServlet</code>).
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setRemoteableServletUri(String remoteableServletUri) {
+		this.remoteableServletUri = remoteableServletUri;
+		return this;
+	}
+
+	/**
+	 * Set a root URL for this client.
+	 * <p>
+	 * When set, URL strings passed in through the various rest call methods (e.g. {@link #doGet(Object)}
+	 * 	will be prefixed with the specified root.
+	 * This root URL is ignored on those methods if you pass in a {@link URL}, {@link URI}, or an absolute URL string.
+	 *
+	 * @param rootUrl The root URL to prefix to relative URL strings.  Trailing slashes are trimmed.
+	 * @return This object (for method chaining).
+	 */
+	public RestClient setRootUrl(String rootUrl) {
+		if (rootUrl.endsWith("/"))
+			rootUrl = rootUrl.replaceAll("\\/$", "");
+		this.rootUrl = rootUrl;
+		return this;
+	}
+
+	/**
+	 * Enable SSL support on this client.
+	 *
+	 * @param opts The SSL configuration options.  See {@link SSLOpts} for details.
+	 * 	This method is a no-op if <code>sslConfig</code> is <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public RestClient enableSSL(SSLOpts opts) throws KeyStoreException, NoSuchAlgorithmException {
+		this.sslOpts = opts;
+		return this;
+	}
+
+	/**
+	 * Enable LAX SSL support.
+	 * <p>
+	 * Certificate chain validation and hostname verification is disabled.
+	 *
+	 * @return This object (for method chaining).
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public RestClient enableLaxSSL() throws KeyStoreException, NoSuchAlgorithmException {
+		return enableSSL(SSLOpts.LAX);
+	}
+
+	/**
+	 * Perform a <code>GET</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doGet(Object url) throws RestCallException {
+		return doCall("GET", url, false);
+	}
+
+	/**
+	 * Perform a <code>PUT</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doPut(Object url, Object o) throws RestCallException {
+		return doCall("PUT", url, true).setInput(o);
+	}
+
+	/**
+	 * Perform a <code>POST</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doPost(Object url, Object o) throws RestCallException {
+		return doCall("POST", url, true).setInput(o);
+	}
+
+	/**
+	 * Perform a <code>DELETE</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doDelete(Object url) throws RestCallException {
+		return doCall("DELETE", url, false);
+	}
+
+	/**
+	 * Perform an <code>OPTIONS</code> request against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doOptions(Object url) throws RestCallException {
+		return doCall("OPTIONS", url, true);
+	}
+
+	/**
+	 * Perform a <code>POST</code> request with a content type of <code>application/x-www-form-urlencoded</code> against the specified URL.
+	 *
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param o The object to serialize and transmit to the URL as the body of the request, serialized as a form post
+	 * 	using the {@link UrlEncodingSerializer#DEFAULT} serializer.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doFormPost(Object url, Object o) throws RestCallException {
+		return doCall("POST", url, true)
+			.setInput(new RestRequestEntity(o, urlEncodingSerializer));
+	}
+
+	/**
+	 * Performs a REST call where the entire call is specified in a simple string.
+	 * <p>
+	 * This method is useful for performing callbacks when the target of a callback is passed in
+	 * on an initial request, for example to signal when a long-running process has completed.
+	 * <p>
+	 * The call string can be any of the following formats:
+	 * <ul>
+	 * 	<li><js>"[method] [url]"</js> - e.g. <js>"GET http://localhost/callback"</js>
+	 * 	<li><js>"[method] [url] [payload]"</js> - e.g. <js>"POST http://localhost/callback some text payload"</js>
+	 * 	<li><js>"[method] [headers] [url] [payload]"</js> - e.g. <js>"POST {'Content-Type':'text/json'} http://localhost/callback {'some':'json'}"</js>
+	 * </ul>
+	 * <p>
+	 * The payload will always be sent using a simple {@link StringEntity}.
+	 *
+	 * @param callString The call string.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException
+	 */
+	public RestCall doCallback(String callString) throws RestCallException {
+		String s = callString;
+		try {
+			RestCall rc = null;
+			String method = null, uri = null, content = null;
+			ObjectMap h = null;
+			int i = s.indexOf(' ');
+			if (i != -1) {
+				method = s.substring(0, i).trim();
+				s = s.substring(i).trim();
+				if (s.length() > 0) {
+					if (s.charAt(0) == '{') {
+						i = s.indexOf('}');
+						if (i != -1) {
+							String json = s.substring(0, i+1);
+							h = JsonParser.DEFAULT.parse(json, ObjectMap.class);
+							s = s.substring(i+1).trim();
+						}
+					}
+					if (s.length() > 0) {
+						i = s.indexOf(' ');
+						if (i == -1)
+							uri = s;
+						else {
+							uri = s.substring(0, i).trim();
+							s = s.substring(i).trim();
+							if (s.length() > 0)
+								content = s;
+						}
+					}
+				}
+			}
+			if (method != null && uri != null) {
+				rc = doCall(method, uri, content != null);
+				if (content != null)
+					rc.setInput(new StringEntity(content));
+				if (h != null)
+					for (Map.Entry<String,Object> e : h.entrySet())
+						rc.setHeader(e.getKey(), e.getValue());
+				return rc;
+			}
+		} catch (Exception e) {
+			throw new RestCallException(e);
+		}
+		throw new RestCallException("Invalid format for call string.");
+	}
+
+	/**
+	 * Perform a generic REST call.
+	 *
+	 * @param method The HTTP method.
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param content The HTTP body content.
+	 * 	Can be of the following types:
+	 * 	<ul>
+	 * 		<li>{@link Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
+	 * 		<li>{@link InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
+	 * 		<li>{@link Object} - POJO to be converted to text using the {@link Serializer} registered with the {@link RestClient}.
+	 * 		<li>{@link HttpEntity} - Bypass Juno serialization and pass HttpEntity directly to HttpClient.
+	 * 	</ul>
+	 * 	This parameter is IGNORED if {@link HttpMethod#hasContent()} is <jk>false</jk>.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doCall(HttpMethod method, Object url, Object content) throws RestCallException {
+		RestCall rc = doCall(method.name(), url, method.hasContent());
+		if (method.hasContent())
+			rc.setInput(content);
+		return rc;
+	}
+
+	/**
+	 * Perform a generic REST call.
+	 *
+	 * @param method The method name (e.g. <js>"GET"</js>, <js>"OPTIONS"</js>).
+	 * @param url The URL of the remote REST resource.  Can be any of the following:  {@link String}, {@link URI}, {@link URL}.
+	 * @param hasContent Boolean flag indicating if the specified request has content associated with it.
+	 * @return A {@link RestCall} object that can be further tailored before executing the request
+	 * 	and getting the response as a parsed object.
+	 * @throws RestCallException If any authentication errors occurred.
+	 */
+	public RestCall doCall(String method, Object url, boolean hasContent) throws RestCallException {
+		HttpRequestBase req = null;
+		RestCall restCall = null;
+		final String methodUC = method.toUpperCase(Locale.ENGLISH);
+		if (hasContent) {
+			req = new HttpEntityEnclosingRequestBase() {
+				@Override /* HttpRequest */
+				public String getMethod() {
+					return methodUC;
+				}
+			};
+			restCall = new RestCall(this, req);
+			if (contentType != null)
+				restCall.setHeader("Content-Type", contentType);
+		} else {
+			req = new HttpRequestBase() {
+				@Override /* HttpRequest */
+				public String getMethod() {
+					return methodUC;
+				}
+			};
+			restCall = new RestCall(this, req);
+		}
+		try {
+			req.setURI(toURI(url));
+		} catch (URISyntaxException e) {
+			throw new RestCallException(e);
+		}
+		if (accept != null)
+			restCall.setHeader("Accept", accept);
+		for (Map.Entry<String,? extends Object> e : headers.entrySet())
+			restCall.setHeader(e.getKey(), e.getValue());
+		return restCall;
+	}
+
+	/**
+	 * Create a new proxy interface for the specified remoteable service interface.
+	 *
+	 * @param interfaceClass The interface to create a proxy for.
+	 * @return The new proxy interface.
+	 * @throws RuntimeException If the Remotable service URI has not been specified on this
+	 * 	client by calling {@link #setRemoteableServletUri(String)}.
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T getRemoteableProxy(final Class<T> interfaceClass) {
+		if (remoteableServletUri == null)
+			throw new RuntimeException("Remoteable service URI has not been specified.");
+		return (T)Proxy.newProxyInstance(
+			interfaceClass.getClassLoader(),
+			new Class[] { interfaceClass },
+			new InvocationHandler() {
+				@Override /* InvocationHandler */
+				public Object invoke(Object proxy, Method method, Object[] args) {
+					try {
+						String uri = remoteableServiceUriMap.get(method);
+						if (uri == null) {
+							// Constructing this string each time can be time consuming, so cache it.
+							uri = remoteableServletUri + '/' + interfaceClass.getName() + '/' + ClassUtils.getMethodSignature(method);
+							remoteableServiceUriMap.put(method, uri);
+						}
+						return doPost(uri, args).getResponse(method.getReturnType());
+					} catch (Exception e) {
+						throw new RuntimeException(e);
+					}
+				}
+		});
+	}
+
+	private Pattern absUrlPattern = Pattern.compile("^\\w+\\:\\/\\/.*");
+
+	private URI toURI(Object url) throws URISyntaxException {
+		assertFieldNotNull(url, "url");
+		if (url instanceof URI)
+			return (URI)url;
+		if (url instanceof URL)
+			((URL)url).toURI();
+		String s = url.toString();
+		if (rootUrl != null && ! absUrlPattern.matcher(s).matches()) {
+			if (s.isEmpty())
+				s = rootUrl;
+			else {
+				StringBuilder sb = new StringBuilder(rootUrl);
+				if (! s.startsWith("/"))
+					sb.append('/');
+				sb.append(s);
+				s = sb.toString();
+			}
+		}
+		return new URI(s);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* CoreAPI */
+	public RestClient setProperty(String property, Object value) throws LockedException {
+		super.setProperty(property, value);
+		if (serializer != null)
+			serializer.setProperty(property, value);
+		if (parser != null)
+			parser.setProperty(property, value);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient setProperties(ObjectMap properties) throws LockedException {
+		super.setProperties(properties);
+		if (serializer != null)
+			serializer.setProperties(properties);
+		if (parser != null)
+			parser.setProperties(properties);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setProperties(properties);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		if (serializer != null)
+			serializer.addNotBeanClasses(classes);
+		if (parser != null)
+			parser.addNotBeanClasses(classes);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		if (serializer != null)
+			serializer.addFilters(classes);
+		if (parser != null)
+			parser.addFilters(classes);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public <T> RestClient addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		if (serializer != null)
+			serializer.addImplClass(interfaceClass, implClass);
+		if (parser != null)
+			parser.addImplClass(interfaceClass, implClass);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreAPI */
+	public RestClient setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		if (serializer != null)
+			serializer.setClassLoader(classLoader);
+		if (parser != null)
+			parser.setClassLoader(classLoader);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.setClassLoader(classLoader);
+		return this;
+	}
+
+
+	//------------------------------------------------------------------------------------------------
+	// Passthrough methods for HttpClientBuilder.
+	//------------------------------------------------------------------------------------------------
+
+	/**
+	 * @param redirectStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRedirectStrategy(RedirectStrategy)
+	 */
+	public RestClient setRedirectStrategy(RedirectStrategy redirectStrategy) {
+		httpClientBuilder.setRedirectStrategy(redirectStrategy);
+		return this;
+	}
+
+	/**
+	 * @param cookieSpecRegistry
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCookieSpecRegistry(Lookup)
+	 */
+	public RestClient setDefaultCookieSpecRegistry(Lookup<CookieSpecProvider> cookieSpecRegistry) {
+		httpClientBuilder.setDefaultCookieSpecRegistry(cookieSpecRegistry);
+		return this;
+	}
+
+	/**
+	 * @param requestExec
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRequestExecutor(HttpRequestExecutor)
+	 */
+	public RestClient setRequestExecutor(HttpRequestExecutor requestExec) {
+		httpClientBuilder.setRequestExecutor(requestExec);
+		return this;
+	}
+
+	/**
+	 * @param hostnameVerifier
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLHostnameVerifier(HostnameVerifier)
+	 */
+	public RestClient setSSLHostnameVerifier(HostnameVerifier hostnameVerifier) {
+		httpClientBuilder.setSSLHostnameVerifier(hostnameVerifier);
+		return this;
+	}
+
+	/**
+	 * @param publicSuffixMatcher
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setPublicSuffixMatcher(PublicSuffixMatcher)
+	 */
+	public RestClient setPublicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) {
+		httpClientBuilder.setPublicSuffixMatcher(publicSuffixMatcher);
+		return this;
+	}
+
+	/**
+	 * @param sslContext
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLContext(SSLContext)
+	 */
+	public RestClient setSSLContext(SSLContext sslContext) {
+		httpClientBuilder.setSSLContext(sslContext);
+		return this;
+	}
+
+	/**
+	 * @param sslSocketFactory
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSSLSocketFactory(LayeredConnectionSocketFactory)
+	 */
+	public RestClient setSSLSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) {
+		httpClientBuilder.setSSLSocketFactory(sslSocketFactory);
+		return this;
+	}
+
+	/**
+	 * @param maxConnTotal
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setMaxConnTotal(int)
+	 */
+	public RestClient setMaxConnTotal(int maxConnTotal) {
+		httpClientBuilder.setMaxConnTotal(maxConnTotal);
+		return this;
+	}
+
+	/**
+	 * @param maxConnPerRoute
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setMaxConnPerRoute(int)
+	 */
+	public RestClient setMaxConnPerRoute(int maxConnPerRoute) {
+		httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultSocketConfig(SocketConfig)
+	 */
+	public RestClient setDefaultSocketConfig(SocketConfig config) {
+		httpClientBuilder.setDefaultSocketConfig(config);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultConnectionConfig(ConnectionConfig)
+	 */
+	public RestClient setDefaultConnectionConfig(ConnectionConfig config) {
+		httpClientBuilder.setDefaultConnectionConfig(config);
+		return this;
+	}
+
+	/**
+	 * @param connTimeToLive
+	 * @param connTimeToLiveTimeUnit
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionTimeToLive(long,TimeUnit)
+	 */
+	public RestClient setConnectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) {
+		httpClientBuilder.setConnectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit);
+		return this;
+	}
+
+	/**
+	 * @param connManager
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionManager(HttpClientConnectionManager)
+	 */
+	public RestClient setConnectionManager(HttpClientConnectionManager connManager) {
+		this.httpClientConnectionManager = connManager;
+		httpClientBuilder.setConnectionManager(connManager);
+		return this;
+	}
+
+	/**
+	 * @param shared
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionManagerShared(boolean)
+	 */
+	public RestClient setConnectionManagerShared(boolean shared) {
+		httpClientBuilder.setConnectionManagerShared(shared);
+		return this;
+	}
+
+	/**
+	 * @param reuseStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionReuseStrategy(ConnectionReuseStrategy)
+	 */
+	public RestClient setConnectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) {
+		httpClientBuilder.setConnectionReuseStrategy(reuseStrategy);
+		return this;
+	}
+
+	/**
+	 * @param keepAliveStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setKeepAliveStrategy(ConnectionKeepAliveStrategy)
+	 */
+	public RestClient setKeepAliveStrategy(ConnectionKeepAliveStrategy keepAliveStrategy) {
+		httpClientBuilder.setKeepAliveStrategy(keepAliveStrategy);
+		return this;
+	}
+
+	/**
+	 * @param targetAuthStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setTargetAuthenticationStrategy(AuthenticationStrategy)
+	 */
+	public RestClient setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy) {
+		httpClientBuilder.setTargetAuthenticationStrategy(targetAuthStrategy);
+		return this;
+	}
+
+	/**
+	 * @param proxyAuthStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setProxyAuthenticationStrategy(AuthenticationStrategy)
+	 */
+	public RestClient setProxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy) {
+		httpClientBuilder.setProxyAuthenticationStrategy(proxyAuthStrategy);
+		return this;
+	}
+
+	/**
+	 * @param userTokenHandler
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setUserTokenHandler(UserTokenHandler)
+	 */
+	public RestClient setUserTokenHandler(UserTokenHandler userTokenHandler) {
+		httpClientBuilder.setUserTokenHandler(userTokenHandler);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableConnectionState()
+	 */
+	public RestClient disableConnectionState() {
+		httpClientBuilder.disableConnectionState();
+		return this;
+	}
+
+	/**
+	 * @param schemePortResolver
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setSchemePortResolver(SchemePortResolver)
+	 */
+	public RestClient setSchemePortResolver(SchemePortResolver schemePortResolver) {
+		httpClientBuilder.setSchemePortResolver(schemePortResolver);
+		return this;
+	}
+
+	/**
+	 * @param userAgent
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setUserAgent(String)
+	 */
+	public RestClient setUserAgent(String userAgent) {
+		httpClientBuilder.setUserAgent(userAgent);
+		return this;
+	}
+
+	/**
+	 * @param defaultHeaders
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultHeaders(Collection)
+	 */
+	public RestClient setDefaultHeaders(Collection<? extends Header> defaultHeaders) {
+		httpClientBuilder.setDefaultHeaders(defaultHeaders);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorFirst(HttpResponseInterceptor)
+	 */
+	public RestClient addInterceptorFirst(HttpResponseInterceptor itcp) {
+		httpClientBuilder.addInterceptorFirst(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorLast(HttpResponseInterceptor)
+	 */
+	public RestClient addInterceptorLast(HttpResponseInterceptor itcp) {
+		httpClientBuilder.addInterceptorLast(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorFirst(HttpRequestInterceptor)
+	 */
+	public RestClient addInterceptorFirst(HttpRequestInterceptor itcp) {
+		httpClientBuilder.addInterceptorFirst(itcp);
+		return this;
+	}
+
+	/**
+	 * @param itcp
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#addInterceptorLast(HttpRequestInterceptor)
+	 */
+	public RestClient addInterceptorLast(HttpRequestInterceptor itcp) {
+		httpClientBuilder.addInterceptorLast(itcp);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableCookieManagement()
+	 */
+	public RestClient disableCookieManagement() {
+		httpClientBuilder.disableCookieManagement();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableContentCompression()
+	 */
+	public RestClient disableContentCompression() {
+		httpClientBuilder.disableContentCompression();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableAuthCaching()
+	 */
+	public RestClient disableAuthCaching() {
+		httpClientBuilder.disableAuthCaching();
+		return this;
+	}
+
+	/**
+	 * @param httpprocessor
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setHttpProcessor(HttpProcessor)
+	 */
+	public RestClient setHttpProcessor(HttpProcessor httpprocessor) {
+		httpClientBuilder.setHttpProcessor(httpprocessor);
+		return this;
+	}
+
+	/**
+	 * @param retryHandler
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRetryHandler(HttpRequestRetryHandler)
+	 */
+	public RestClient setRetryHandler(HttpRequestRetryHandler retryHandler) {
+		httpClientBuilder.setRetryHandler(retryHandler);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableAutomaticRetries()
+	 */
+	public RestClient disableAutomaticRetries() {
+		httpClientBuilder.disableAutomaticRetries();
+		return this;
+	}
+
+	/**
+	 * @param proxy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setProxy(HttpHost)
+	 */
+	public RestClient setProxy(HttpHost proxy) {
+		httpClientBuilder.setProxy(proxy);
+		return this;
+	}
+
+	/**
+	 * @param routePlanner
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setRoutePlanner(HttpRoutePlanner)
+	 */
+	public RestClient setRoutePlanner(HttpRoutePlanner routePlanner) {
+		httpClientBuilder.setRoutePlanner(routePlanner);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#disableRedirectHandling()
+	 */
+	public RestClient disableRedirectHandling() {
+		httpClientBuilder.disableRedirectHandling();
+		return this;
+	}
+
+	/**
+	 * @param connectionBackoffStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setConnectionBackoffStrategy(ConnectionBackoffStrategy)
+	 */
+	public RestClient setConnectionBackoffStrategy(ConnectionBackoffStrategy connectionBackoffStrategy) {
+		httpClientBuilder.setConnectionBackoffStrategy(connectionBackoffStrategy);
+		return this;
+	}
+
+	/**
+	 * @param backoffManager
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setBackoffManager(BackoffManager)
+	 */
+	public RestClient setBackoffManager(BackoffManager backoffManager) {
+		httpClientBuilder.setBackoffManager(backoffManager);
+		return this;
+	}
+
+	/**
+	 * @param serviceUnavailStrategy
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)
+	 */
+	public RestClient setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) {
+		httpClientBuilder.setServiceUnavailableRetryStrategy(serviceUnavailStrategy);
+		return this;
+	}
+
+	/**
+	 * @param cookieStore
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCookieStore(CookieStore)
+	 */
+	public RestClient setDefaultCookieStore(CookieStore cookieStore) {
+		httpClientBuilder.setDefaultCookieStore(cookieStore);
+		return this;
+	}
+
+	/**
+	 * @param credentialsProvider
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultCredentialsProvider(CredentialsProvider)
+	 */
+	public RestClient setDefaultCredentialsProvider(CredentialsProvider credentialsProvider) {
+		httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+		return this;
+	}
+
+	/**
+	 * @param authSchemeRegistry
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultAuthSchemeRegistry(Lookup)
+	 */
+	public RestClient setDefaultAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) {
+		httpClientBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
+		return this;
+	}
+
+	/**
+	 * @param contentDecoderMap
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setContentDecoderRegistry(Map)
+	 */
+	public RestClient setContentDecoderRegistry(Map<String,InputStreamFactory> contentDecoderMap) {
+		httpClientBuilder.setContentDecoderRegistry(contentDecoderMap);
+		return this;
+	}
+
+	/**
+	 * @param config
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#setDefaultRequestConfig(RequestConfig)
+	 */
+	public RestClient setDefaultRequestConfig(RequestConfig config) {
+		httpClientBuilder.setDefaultRequestConfig(config);
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#useSystemProperties()
+	 */
+	public RestClient useSystemProperties() {
+		httpClientBuilder.useSystemProperties();
+		return this;
+	}
+
+	/**
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#evictExpiredConnections()
+	 */
+	public RestClient evictExpiredConnections() {
+		httpClientBuilder.evictExpiredConnections();
+		return this;
+	}
+
+	/**
+	 * @param maxIdleTime
+	 * @param maxIdleTimeUnit
+	 * @return This object (for method chaining).
+	 * @see HttpClientBuilder#evictIdleConnections(long,TimeUnit)
+	 */
+	public RestClient evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) {
+		httpClientBuilder.evictIdleConnections(maxIdleTime, maxIdleTimeUnit);
+		return this;
+	}
+
+	@Override
+	protected void finalize() throws Throwable {
+		if (! isClosed) {
+			System.err.println("WARNING:  RestClient garbage collected before it was finalized.");
+			if (creationStack != null) {
+				System.err.println("Creation Stack:");
+				for (StackTraceElement e : creationStack)
+					System.err.println(e);
+			} else {
+				System.err.println("Creation stack traces can be displayed by setting the system property 'com.ibm.juno.client.RestClient.trackCreation' to true.");
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RestRequestEntity.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RestRequestEntity.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestRequestEntity.java
new file mode 100755
index 0000000..9336c23
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RestRequestEntity.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.io.*;
+
+import org.apache.http.entity.*;
+import org.apache.http.message.*;
+
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * HttpEntity for serializing POJOs as the body of HTTP requests.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RestRequestEntity extends BasicHttpEntity {
+	final Object output;
+	final Serializer<?> serializer;
+	byte[] outputBytes;
+
+	/**
+	 * Constructor.
+	 * @param input The POJO to serialize.  Can also be a {@link Reader} or {@link InputStream}.
+	 * @param serializer The serializer to use to serialize this response.
+	 */
+	public RestRequestEntity(Object input, Serializer<?> serializer) {
+		this.output = input;
+		this.serializer = serializer;
+		if (serializer != null)
+			setContentType(new BasicHeader("Content-Type", serializer.getResponseContentType()));
+	}
+
+	@Override /* BasicHttpEntity */
+	public void writeTo(OutputStream os) throws IOException {
+		if (output instanceof InputStream) {
+			IOPipe.create(output, os).closeOut().run();
+		} else if (output instanceof Reader) {
+			IOPipe.create(output, new OutputStreamWriter(os, IOUtils.UTF8)).closeOut().run();
+		} else {
+			try {
+				if (serializer == null) {
+					// If no serializer specified, just close the stream.
+					os.close();
+				} else if (! serializer.isWriterSerializer()) {
+					OutputStreamSerializer s2 = (OutputStreamSerializer)serializer;
+					s2.serialize(output, os);
+					os.close();
+				} else {
+					Writer w = new OutputStreamWriter(os, IOUtils.UTF8);
+					WriterSerializer s2 = (WriterSerializer)serializer;
+					s2.serialize(output, w);
+					w.close();
+				}
+			} catch (SerializeException e) {
+				throw new com.ibm.juno.client.RestCallException(e);
+			}
+		}
+	}
+
+	@Override /* BasicHttpEntity */
+	public boolean isRepeatable() {
+		return true;
+	}
+
+	@Override /* BasicHttpEntity */
+	public InputStream getContent() {
+		if (outputBytes == null) {
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			try {
+				writeTo(baos);
+				outputBytes = baos.toByteArray();
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return new ByteArrayInputStream(outputBytes);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/RetryOn.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/RetryOn.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/RetryOn.java
new file mode 100755
index 0000000..6b9bf75
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/RetryOn.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+/**
+ * Used to determine whether a request should be retried based on the HTTP response code.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface RetryOn {
+
+	/**
+	 * Default RetryOn that returns <jk>true</jk> of any HTTP response &gt;= 400 is received.
+	 */
+	public static final RetryOn DEFAULT = new RetryOn() {
+		@Override /* RetryOn */
+		public boolean onCode(int httpResponseCode) {
+			return httpResponseCode <= 0 || httpResponseCode >= 400;
+		}
+	};
+
+	/**
+	 * Subclasses should override this method to determine whether the HTTP response is retryable.
+	 *
+	 * @param httpResponseCode The HTTP response code.
+	 * @return <jk>true</jk> if the specified response code is retryable.
+	 */
+	boolean onCode(int httpResponseCode);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/SSLOpts.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/SSLOpts.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/SSLOpts.java
new file mode 100755
index 0000000..2a7ed82
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/SSLOpts.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import com.ibm.juno.core.utils.*;
+
+/**
+ * SSL configuration options that get passed to {@link RestClient#enableSSL(SSLOpts)}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SSLOpts {
+
+	private String protocols = getDefaultProtocols();
+	private CertValidate certValidate = CertValidate.DEFAULT;
+	private HostVerify hostVerify = HostVerify.DEFAULT;
+
+	/**
+	 * Reusable SSL options for lenient SSL (no cert validation or hostname verification).
+	 */
+	public static final SSLOpts LAX = new SSLOpts(null, CertValidate.LAX, HostVerify.LAX);
+
+	/**
+	 * Reusable SSL options for normal SSL (default cert validation and hostname verification).
+	 */
+	public static final SSLOpts DEFAULT = new SSLOpts(null, CertValidate.DEFAULT, HostVerify.DEFAULT);
+
+	/**
+	 * Constructor.
+	 */
+	public SSLOpts() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param protocols A comma-delimited list of supported SSL protocols.
+	 * 	If <jk>null</jk>, uses the value returned by {@link #getDefaultProtocols()}.
+	 * @param certValidate Certificate validation setting.
+	 * @param hostVerify Host verification setting.
+	 */
+	public SSLOpts(String protocols, CertValidate certValidate, HostVerify hostVerify) {
+		if (protocols != null)
+			this.protocols = protocols;
+		this.certValidate = certValidate;
+		this.hostVerify = hostVerify;
+	}
+
+	/**
+	 * Returns the default list of SSL protocols to support when the <code>protocols</code>
+	 * 	parameter on the constructor is <jk>null</jk>.
+	 * <p>
+	 * The default value is <jk>"SSL_TLS,TLS,SSL"</js> unless overridden by one of the following
+	 * 	system properties:
+	 * <ul>
+	 * 	<li><js>"com.ibm.team.repository.transport.client.protocol"</js>
+	 * 	<li><js>"transport.client.protocol"</js>
+	 * </ul>
+	 * <p>
+	 * Subclasses can override this method to provide their own logic for determining default supported protocols.
+	 *
+	 * @return The comma-delimited list of supported protocols.
+	 */
+	protected String getDefaultProtocols() {
+		String sp = System.getProperty("com.ibm.team.repository.transport.client.protocol");
+		if (StringUtils.isEmpty(sp))
+			sp = System.getProperty("transport.client.protocol");
+		if (StringUtils.isEmpty(sp))
+			sp = "SSL_TLS,TLS,SSL";
+		return sp;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>protocols</property>.
+	 *
+	 * @return The value of the <property>protocols</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public String getProtocols() {
+		return protocols;
+	}
+
+	/**
+	 * Bean property setter:  <property>protocols</property>.
+	 *
+	 * @param protocols The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setProtocols(String protocols) {
+		this.protocols = protocols;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>certValidate</property>.
+	 *
+	 * @return The value of the <property>certValidate</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public CertValidate getCertValidate() {
+		return certValidate;
+	}
+
+	/**
+	 * Bean property setter:  <property>certValidate</property>.
+	 *
+	 * @param certValidate The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setCertValidate(CertValidate certValidate) {
+		this.certValidate = certValidate;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>hostVerify</property>.
+	 *
+	 * @return The value of the <property>hostVerify</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	public HostVerify getHostVerify() {
+		return hostVerify;
+	}
+
+	/**
+	 * Bean property setter:  <property>hostVerify</property>.
+	 *
+	 * @param hostVerify The new value for the <property>properties</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public SSLOpts setHostVerify(HostVerify hostVerify) {
+		this.hostVerify = hostVerify;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Enums
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Certificate validation options.
+	 * <p>
+	 * Used as enum for {@link SSLOpts#getCertValidate()} property.
+	 */
+	@SuppressWarnings("hiding")
+	public static enum CertValidate {
+
+		/**
+		 * Verify that the certificate is valid, but allow for self-signed certificates.
+		 */
+		LAX,
+
+		/**
+		 * Do normal certificate chain validation.
+		 */
+		DEFAULT
+	}
+
+	/**
+	 * Certificate host verification options.
+	 * <p>
+	 * Used as enum for {@link SSLOpts#getHostVerify()} property.
+	 */
+	@SuppressWarnings("hiding")
+	public enum HostVerify {
+
+		/**
+		 * Don't verify the hostname in the certificate.
+		 */
+		LAX,
+
+		/**
+		 * Do normal hostname verification.
+		 */
+		DEFAULT
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/SerializedNameValuePair.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/SerializedNameValuePair.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/SerializedNameValuePair.java
new file mode 100755
index 0000000..cdb3b2e
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/SerializedNameValuePair.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import static com.ibm.juno.core.urlencoding.UonSerializerProperties.*;
+
+import org.apache.http.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.urlencoding.*;
+
+/**
+ * Subclass of {@link NameValuePair} for serializing POJOs as URL-encoded form post entries
+ * 	using the {@link UrlEncodingSerializer class}.
+ * <p>
+ * Example:
+ * <p class='bcode'>
+ * 	NameValuePairs params = <jk>new</jk> NameValuePairs()
+ * 		.append(<jk>new</jk> SerializedNameValuePair(<js>"myPojo"</js>, pojo, UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>))
+ * 		.append(<jk>new</jk> BasicNameValuePair(<js>"someOtherParam"</js>, <js>"foobar"</js>));
+ * 	request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SerializedNameValuePair implements NameValuePair {
+	private String name;
+	private Object value;
+	private UrlEncodingSerializer serializer;
+
+	// We must be sure to disable character encoding since it's done in the http client layer.
+	private static final ObjectMap op = new ObjectMap().append(UON_encodeChars, false);
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The parameter name.
+	 * @param value The POJO to serialize to the parameter value.
+	 * @param serializer The serializer to use to convert the value to a string.
+	 */
+	public SerializedNameValuePair(String name, Object value, UrlEncodingSerializer serializer) {
+		this.name = name;
+		this.value = value;
+		this.serializer = serializer;
+	}
+
+	@Override /* NameValuePair */
+	public String getName() {
+		if (name != null && name.length() > 0) {
+			char c = name.charAt(0);
+			if (c == '$' || c == '(') {
+				try {
+					UonSerializerContext ctx = serializer.createContext(op, null);
+					return serializer.serialize(name, ctx);
+				} catch (SerializeException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		}
+		return name;
+	}
+
+	@Override /* NameValuePair */
+	public String getValue() {
+		try {
+			UonSerializerContext ctx = serializer.createContext(op, null);
+			return serializer.serialize(value, ctx);
+		} catch (SerializeException e) {
+			throw new RuntimeException(e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/SimpleX509TrustManager.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/SimpleX509TrustManager.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/SimpleX509TrustManager.java
new file mode 100755
index 0000000..72975cb
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/SimpleX509TrustManager.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client;
+
+import java.security.*;
+import java.security.cert.*;
+
+import javax.net.ssl.*;
+
+/**
+ * A trust manager that optionally allows for self-signed certificates.
+ */
+public final class SimpleX509TrustManager implements X509TrustManager {
+
+	private X509TrustManager baseTrustManager;  // The JRE-provided trust manager used to validate certificates presented by a server.
+
+	/**
+	 * Constructor.
+	 *
+	 * @param lax If <jk>true</jk>, allow self-signed and expired certificates.
+	 * @throws KeyStoreException
+	 * @throws NoSuchAlgorithmException
+	 */
+	public SimpleX509TrustManager(boolean lax) throws KeyStoreException, NoSuchAlgorithmException {
+		if (! lax) {
+			// Find the JRE-provided X509 trust manager.
+			KeyStore ks = KeyStore.getInstance("jks");
+			TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+			factory.init(ks);
+			for (TrustManager tm : factory.getTrustManagers()) {
+				if (tm instanceof X509TrustManager) {
+					baseTrustManager = (X509TrustManager)tm; // Take the first X509TrustManager we find
+					return;
+				}
+			}
+			throw new IllegalStateException("Couldn't find JRE's X509TrustManager"); //$NON-NLS-1$
+		}
+	}
+
+	@Override /* X509TrustManager */
+	public X509Certificate[] getAcceptedIssuers() {
+		return baseTrustManager == null ? new X509Certificate[0] : baseTrustManager.getAcceptedIssuers();
+	}
+
+	@Override /* X509TrustManager */
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		if (baseTrustManager != null)
+			baseTrustManager.checkClientTrusted(chain, authType);
+	}
+
+	@Override /* X509TrustManager */
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		if (baseTrustManager != null)
+			baseTrustManager.checkServerTrusted(chain, authType);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/CertificateStore.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/CertificateStore.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/CertificateStore.java
new file mode 100755
index 0000000..f06eaf5
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/CertificateStore.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+import java.util.*;
+
+/**
+ * Specialized certificate storage based on {@link KeyStore} for managing trusted certificates.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public class CertificateStore {
+
+	private final KeyStore keyStore;
+
+	/**
+	 * Get the underlying KeyStore.
+	 */
+	KeyStore getKeyStore() {
+		return keyStore;
+	}
+
+	/**
+	 * Helper method that creates a {@link KeyStore} by reading it from a file.
+	 */
+	static KeyStore load(File file, String password) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException {
+		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+		try {
+			InputStream input = new FileInputStream(file);
+			try {
+				ks.load(input, password == null ? null : password.toCharArray());
+			} finally {
+				input.close();
+			}
+		} catch (IOException e) {
+			// Return an empty initialized KeyStore
+			ks.load(null, null);
+		}
+		return ks;
+	}
+
+	/**
+	 * Helper method that writes a {@link KeyStore} to a file.
+	 */
+	static void store(KeyStore ks, File file, String password) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
+		OutputStream output = new FileOutputStream(file);
+		try {
+			ks.store(output, password == null ? null : password.toCharArray());
+		} finally {
+			output.close();
+		}
+	}
+
+	/**
+	 * Helper to compute a unique alias within the trust store for a specified certificate.
+	 * @param cert The certificate to compute an alias for.
+	 */
+	static String computeAlias(Certificate cert) {
+		// There appears to be no standard way to construct certificate aliases,
+		// but this class never depends on looking up a certificate by its
+		// computed alias, so just create an alias that's unique and be done.
+		return UUID.randomUUID().toString();
+	}
+
+	/**
+	 * Construct a new TrustStore initially containing no certificates.
+	 */
+	public CertificateStore() throws NoSuchAlgorithmException, CertificateException, IOException {
+		try {
+			keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+		} catch (KeyStoreException e) {
+			// If the code above caused a KeyStoreException, then the JVM classpath is probably messed up.
+			throw new RuntimeException("KeyStoreException: ["+e.getLocalizedMessage()+"]. "
+				+ "Likely cause is that the Java Cryptography Extension libraries are missing from the JRE classpath.  "
+				+ "Make sure %JAVA_HOME%/lib/ext is specified in your JVM's java.ext.dirs system property.");
+		}
+		keyStore.load(null, null);
+	}
+
+	/**
+	 * Does the trust store contain the specified certificate?
+	 */
+	public boolean containsCertificate(Certificate cert) throws KeyStoreException {
+		return (keyStore.getCertificateAlias(cert) != null);
+	}
+
+	/**
+	 * Enter the specified certificate into the trust store.
+	 */
+	public void enterCertificate(Certificate cert) throws KeyStoreException {
+		if (! containsCertificate(cert))
+			keyStore.setCertificateEntry(computeAlias(cert), cert);
+	}
+
+	/*
+	 * Helper to copy all the certificate entries, and none of the other
+	 * entries, from a {@link KeyStore} into the trust store.
+	 */
+	private void enterCertificates(KeyStore ks) throws KeyStoreException {
+		for (Enumeration<String> e = ks.aliases(); e.hasMoreElements();) {
+			String alias = e.nextElement();
+			if (ks.isCertificateEntry(alias)) {
+				Certificate cert = ks.getCertificate(alias);
+				enterCertificate(cert);
+			}
+		}
+	}
+
+	/**
+	 * Load the specified {@link KeyStore} file and copy all of the certificates
+	 * it contains into the trust store. Only certificates, and not any other
+	 * entries, are loaded.
+	 */
+	public void loadCertificates(File file, String password) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException {
+		KeyStore ks = load(file, password);
+		enterCertificates(ks);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ICertificateValidator.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ICertificateValidator.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ICertificateValidator.java
new file mode 100755
index 0000000..0ee07e8
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ICertificateValidator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.security.cert.*;
+
+/**
+ * Validator of certificates presented by a server when establishing an SSL
+ * connection.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public interface ICertificateValidator {
+
+	/** Action to take for a server-supplied certificate. */
+	public enum Trust {
+
+		/** Do not accept the certificate. */
+		REJECT,
+
+		/** Accept the certificate temporarily for the current connection. */
+		ACCEPT_CONNECTION,
+
+		/** Accept the certificate temporarily for the current session. */
+		ACCEPT_SESSION,
+
+		/** Accept the certificate permanently, by saving it in the user's trust store.*/
+		ACCEPT_PERMANENT
+	}
+
+	/**
+	 * There is a problem accepting the server-supplied certificate. What should
+	 * be done?
+	 *
+	 * @param cert The problematic certificate presented by the server
+	 * @param problem The {@link CertificateException} that may indicate the specific
+	 * 	problem with the certificate, e.g. {@link CertificateExpiredException}.
+	 * @return The disposition on the certificate.
+	 */
+	Trust validate(X509Certificate cert, CertificateException problem);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ITrustStoreProvider.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
new file mode 100755
index 0000000..47256a9
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ITrustStoreProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+
+/**
+ * Utility class for handling certificate stores.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public interface ITrustStoreProvider {
+
+	/**
+	 * Returns the store of all certificates trusted for the lifetime
+	 * of this trust provider
+	 */
+	CertificateStore getSessionTrustStore();
+
+	/**
+	 * Returns the store of all permanently trusted certificates.
+	 */
+	CertificateStore getRuntimeTrustStore();
+
+    /**
+     * Install a certificate in the user's application-specific on-disk key
+     * store, if possible.
+     */
+    public void installCertificate(Certificate cert) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/LenientCertificateValidator.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
new file mode 100755
index 0000000..a12ca43
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/LenientCertificateValidator.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.security.cert.*;
+
+/**
+ * Lenient certificate validator that always accepts invalid certificates.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class LenientCertificateValidator implements ICertificateValidator {
+
+	/** Singleton */
+	public static final ICertificateValidator INSTANCE = new LenientCertificateValidator();
+
+	@Override /* ICertificateValidator */
+	public Trust validate(X509Certificate certificate, CertificateException problem) {
+		return Trust.ACCEPT_CONNECTION;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
new file mode 100755
index 0000000..149302d
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+
+/**
+ * Trust store provider with shared static certificate stores.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class SharedTrustStoreProvider implements ITrustStoreProvider {
+
+	// In-memory trust store of all certificates explicitly accepted by the
+	// certificate validator during this session. The validator will not be
+	// called again during this session for any of these certificates. These may
+	// include expired, not yet valid, or otherwise untrusted certificates.
+	// These are kept distinctly, rather than merged into the runtime trust
+	// store, because the base trust manager will never accept expired, etc.
+	// certificates, even if from a trusted source.
+	private static CertificateStore sessionCerts;
+
+	// In-memory trust store of all permanently trusted certificates, assembled
+	// from a number of key store files. These are provided to the base trust
+	// manager as the basis for its decision making.
+	private static CertificateStore runtimeCerts;
+
+	// Location and password of the user's private trust store for this application.
+	private static String userTrustStoreLocation;
+	private static String userTrustStorePassword;
+
+	static {
+		init();
+	}
+
+	private static final void init() {
+		try {
+			String userHome = System.getProperty("user.home");
+			String javaHome = System.getProperty("java.home");
+
+			userTrustStoreLocation = userHome + "/.jazzcerts";
+			userTrustStorePassword = "ibmrationaljazz";
+
+			sessionCerts = new CertificateStore();
+
+			runtimeCerts = new CertificateStore();
+
+			// JRE keystore override
+			String file = System.getProperty("javax.net.ssl.trustStore");
+			String password = System.getProperty("javax.net.ssl.trustStorePassword");
+			addCertificatesFromStore(runtimeCerts, file, password);
+
+			// JRE Signer CA keystore
+			file = javaHome + "/lib/security/cacerts";
+			addCertificatesFromStore(runtimeCerts, file, null);
+
+			// JRE Secure Site CA keystore
+			file =  (javaHome + "/lib/security/jssecacerts");
+			addCertificatesFromStore(runtimeCerts, file, null);
+
+			// Application-specific keystore for the current user
+			addCertificatesFromStore(runtimeCerts, userTrustStoreLocation, userTrustStorePassword);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	private static void addCertificatesFromStore(CertificateStore store, String file, String password) {
+		try {
+			File f = new File(file);
+			if (f.canRead())
+				store.loadCertificates(f, password);
+		} catch (Exception e) {
+			// Discard errors
+		}
+	}
+
+	@Override /* ITrustStoreProvider */
+	public CertificateStore getRuntimeTrustStore() {
+		return runtimeCerts;
+	}
+
+	@Override /* ITrustStoreProvider */
+	public CertificateStore getSessionTrustStore() {
+		return sessionCerts;
+	}
+
+	@Override /* ITrustStoreProvider */
+	public void installCertificate(Certificate cert) throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException {
+		File  f = new File(userTrustStoreLocation);
+		KeyStore ks = CertificateStore.load(f, userTrustStorePassword);
+		ks.setCertificateEntry(CertificateStore.computeAlias(cert), cert);
+		CertificateStore.store(ks, f, userTrustStorePassword);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
new file mode 100755
index 0000000..a7539fe
--- /dev/null
+++ b/com.ibm.team.juno.client/src/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2010, 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.client.deprecated;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.*;
+
+import javax.net.ssl.*;
+
+/**
+ * A trust manager that will call a registered {@link ICertificateValidator} in
+ * the event that a problematic (e.g. expired, not yet valid) or untrusted
+ * certificate is presented by a server, and react appropriately. This trust
+ * manager will rely on multiple key stores, and manage one of its own. The
+ * managed key store and the session-accepted key store are shared by all trust
+ * manager instances.
+ */
+@Deprecated // Use SimpleX509TrustManager
+public final class ValidatingX509TrustManager implements X509TrustManager {
+
+	// The JRE-provided trust manager used to validate certificates presented by a server.
+	private X509TrustManager baseTrustManager;
+
+	// The registered certificate validator, may be null, called when the base
+	// trust manager rejects a certificate presented by a server.
+	private ICertificateValidator validator;
+
+	private ITrustStoreProvider trustStoreProvider;
+
+	/**
+	 * Construct a new ValidatingX509TrustManager.
+	 *
+	 * @param validator Certificate validator to consult regarding problematic
+	 * 	certificates, or <code>null</code> to always reject them.
+	 */
+	public ValidatingX509TrustManager(ICertificateValidator validator) throws KeyStoreException, NoSuchAlgorithmException {
+		this.validator = validator;
+		this.trustStoreProvider = new SharedTrustStoreProvider();
+
+		// Initialize the base X509 trust manager that will be used to evaluate
+		// certificates presented by the server against the runtime trust store.
+		TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+		factory.init(trustStoreProvider.getRuntimeTrustStore().getKeyStore());
+		TrustManager[] managers = factory.getTrustManagers();
+		for (TrustManager manager : managers) {
+			if (manager instanceof X509TrustManager) {
+				baseTrustManager = (X509TrustManager) manager; // Take the first X509TrustManager we find
+				return;
+			}
+		}
+		throw new IllegalStateException("Couldn't find JRE's X509TrustManager"); //$NON-NLS-1$
+	}
+
+	@Override /* X509TrustManager */
+	public X509Certificate[] getAcceptedIssuers() {
+		return baseTrustManager.getAcceptedIssuers();
+	}
+
+	@Override /* X509TrustManager */
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		baseTrustManager.checkClientTrusted(chain, authType);
+	}
+
+	@Override /* X509TrustManager */
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+		X509Certificate cert = chain[0];
+
+		// Has the certificate been OK'd for the session?
+		try {
+			if (trustStoreProvider.getSessionTrustStore().containsCertificate(cert))
+				return;
+		} catch (KeyStoreException e) {
+			// Ignore; proceed to try base trust manager
+		}
+
+		try {
+			// Rely on the base trust manager to check the certificate against the assembled runtime key store
+			baseTrustManager.checkServerTrusted(chain, authType);
+		} catch (CertificateException certEx) {
+
+			// Done if there isn't a validator to consult
+			if (validator == null)
+				throw certEx; // Rejected!
+
+			// Ask the registered certificate validator to rule on the certificate
+			ICertificateValidator.Trust disposition = validator.validate(cert, certEx);
+			switch (disposition) {
+				case REJECT:				throw certEx;
+				case ACCEPT_CONNECTION: break;
+				case ACCEPT_SESSION:		enterCertificate(cert, false); break;
+				case ACCEPT_PERMANENT:	enterCertificate(cert, true); break;
+			}
+		}
+	}
+
+	private void enterCertificate(X509Certificate cert, boolean permanent) throws CertificateException {
+		try {
+			trustStoreProvider.getSessionTrustStore().enterCertificate(cert);
+			if (permanent)
+				trustStoreProvider.installCertificate(cert);
+		} catch (KeyStoreException e) {
+		} catch (NoSuchAlgorithmException e) {
+		} catch (IOException e) {
+		}
+	}
+}


[05/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
new file mode 100755
index 0000000..3050209
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
@@ -0,0 +1,382 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.logging.*;
+
+import com.ibm.juno.core.utils.IOPipe.LineProcessor;
+
+/**
+ * Utility class for running operating system processes.
+ * <p>
+ * Similar to {@link java.lang.ProcessBuilder} but with additional features.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("hiding")
+public class ProcBuilder {
+
+	private java.lang.ProcessBuilder pb = new java.lang.ProcessBuilder();
+	private TeeWriter outWriters = new TeeWriter(), logWriters = new TeeWriter();
+	private LineProcessor lp;
+	private Process p;
+	private int maxExitStatus = 0;
+	private boolean byLines;
+	private String divider = "--------------------------------------------------------------------------------";
+
+	/**
+	 * Creates a process builder with the specified arguments.
+	 * Equivalent to calling <code>ProcessBuilder.create().command(args);</code>
+	 *
+	 * @param args The command-line arguments.
+	 * @return A new process builder.
+	 */
+	public static ProcBuilder create(Object...args) {
+		return new ProcBuilder().command(args);
+	}
+
+	/**
+	 * Creates an empty process builder.
+	 *
+	 * @return A new process builder.
+	 */
+	public static ProcBuilder create() {
+		return new ProcBuilder().command();
+	}
+
+	/**
+	 * Command arguments.
+	 * Arguments can be collections or arrays and will be automatically expanded.
+	 *
+	 * @param args The command-line arguments.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder command(Object...args) {
+		return commandIf(ANY, args);
+	}
+
+	/**
+	 * Command arguments if the specified matcher matches.
+	 * Can be used for specifying os-specific commands.
+	 * Example:
+	 * <p class='bcode'>
+	 * 	ProcessBuilder pb = ProcessBuilder
+	 * 		.create()
+	 * 		.commandIf(<jsf>WINDOWS</jsf>, <js>"cmd /c dir"</js>)
+	 * 		.commandIf(<jsf>UNIX</jsf>, <js>"bash -c ls"</js>)
+	 * 		.merge()
+	 * 		.execute();
+	 * </p>
+	 *
+	 * @param m The matcher.
+	 * @param args The command line arguments if matcher matches.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder commandIf(Matcher m, Object...args) {
+		if (m.matches())
+			pb.command(toList(args));
+		return this;
+	}
+
+	/**
+	 * Append to the command arguments.
+	 * Arguments can be collections or arrays and will be automatically expanded.
+	 *
+	 * @param args The command-line arguments.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder append(Object...args) {
+		return appendIf(ANY, args);
+	}
+
+	/**
+	 * Append to the command arguments if the specified matcher matches.
+	 * Arguments can be collections or arrays and will be automatically expanded.
+	 *
+	 * @param m The matcher.
+	 * @param args The command line arguments if matcher matches.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder appendIf(Matcher m, Object...args) {
+		if (m.matches())
+			pb.command().addAll(toList(args));
+		return this;
+	}
+
+	/**
+	 * Merge STDOUT and STDERR into a single stream.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder merge() {
+		pb.redirectErrorStream(true);
+		return this;
+	}
+
+	/**
+	 * Use by-lines mode.
+	 * Flushes output after every line of input.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder byLines() {
+		this.byLines = true;
+		return this;
+	}
+
+	/**
+	 * Pipe output to the specified writer.
+	 * The method can be called multiple times to write to multiple writers.
+	 *
+	 * @param w The writer to pipe to.
+	 * @param close Close the writer afterwards.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder pipeTo(Writer w, boolean close) {
+		this.outWriters.add(w, close);
+		return this;
+	}
+
+	/**
+	 * Pipe output to the specified writer, but don't close the writer.
+	 *
+	 * @param w The writer to pipe to.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder pipeTo(Writer w) {
+		return pipeTo(w, false);
+	}
+
+	/**
+	 * Pipe output to the specified writer, including the command and return code.
+	 * The method can be called multiple times to write to multiple writers.
+	 *
+	 * @param w The writer to pipe to.
+	 * @param close Close the writer afterwards.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder logTo(Writer w, boolean close) {
+		this.logWriters.add(w, close);
+		this.outWriters.add(w, close);
+		return this;
+	}
+
+	/**
+	 * Pipe output to the specified writer, including the command and return code.
+	 * The method can be called multiple times to write to multiple writers.
+	 * Don't close the writer afterwards.
+	 *
+	 * @param w The writer to pipe to.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder logTo(Writer w) {
+		return logTo(w, false);
+	}
+
+	/**
+	 * Pipe output to the specified writer, including the command and return code.
+	 * The method can be called multiple times to write to multiple writers.
+	 *
+	 * @param level The log level.
+	 * @param logger The logger to log to.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder logTo(final Level level, final Logger logger) {
+		if (logger.isLoggable(level)) {
+			logTo(new StringWriter() {
+				private boolean isClosed;  // Prevents messages from being written twice.
+				@Override /* Writer */
+				public void close() {
+					if (! isClosed)
+						logger.log(level, this.toString());
+					isClosed = true;
+				}
+			}, true);
+		}
+		return this;
+	}
+
+	/**
+	 * Line processor to use to process/convert lines of output returned by the process.
+	 *
+	 * @param lp The new line processor.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder lp(LineProcessor lp) {
+		this.lp = lp;
+		return this;
+	}
+
+	/**
+	 * Append the specified environment variables to the process.
+	 *
+	 * @param env The new set of environment variables.
+	 * @return This object (for method chaining).
+	 */
+	@SuppressWarnings({"rawtypes", "unchecked"})
+	public ProcBuilder env(Map env) {
+		if (env != null)
+		for (Map.Entry e : (Set<Map.Entry>)env.entrySet())
+			environment(e.getKey().toString(), e.getValue() == null ? null : e.getValue().toString());
+		return this;
+	}
+
+	/**
+	 * Append the specified environment variable.
+	 *
+	 * @param key The environment variable name.
+	 * @param val The environment variable value.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder environment(String key, String val) {
+		pb.environment().put(key, val);
+		return this;
+	}
+
+	/**
+	 * Sets the directory where the command will be executed.
+	 *
+	 * @param directory The directory.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder directory(File directory) {
+		pb.directory(directory);
+		return this;
+	}
+
+	/**
+	 * Sets the maximum allowed return code on the process call.
+	 * If the return code exceeds this value, an IOException is returned on the {@link #run()} command.
+	 * The default value is '0'.
+	 *
+	 * @param maxExitStatus The maximum exit status.
+	 * @return This object (for method chaining).
+	 */
+	public ProcBuilder maxExitStatus(int maxExitStatus) {
+		this.maxExitStatus = maxExitStatus;
+		return this;
+	}
+
+	/**
+	 * Run this command and pipes the output to the specified writer or output stream.
+	 *
+	 * @return The exit code from the process.
+	 * @throws IOException
+	 * @throws InterruptedException
+	 */
+	public int run() throws IOException, InterruptedException {
+		if (pb.command().size() == 0)
+			throw new IOException("No command specified in ProcBuilder.");
+		try {
+			logWriters.append(divider).append("\n").flush();
+			logWriters.append(StringUtils.join(pb.command(), " ")).append("\n").flush();
+				p = pb.start();
+			IOPipe.create(p.getInputStream(), outWriters).lineProcessor(lp).byLines(byLines).run();
+			int rc = p.waitFor();
+			logWriters.append("Exit: ").append(String.valueOf(p.exitValue())).append("\n").flush();
+			if (rc > maxExitStatus)
+				throw new IOException("Return code "+rc+" from command " + StringUtils.join(pb.command(), " "));
+			return rc;
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Run this command and returns the output as a simple string.
+	 *
+	 * @return The output from the command.
+	 * @throws IOException
+	 * @throws InterruptedException
+	 */
+	public String getOutput() throws IOException, InterruptedException {
+		StringWriter sw = new StringWriter();
+		pipeTo(sw).run();
+		return sw.toString();
+	}
+
+	/**
+	 * Returns the output from this process as a {@link Scanner}.
+	 *
+	 * @return The output from the process as a Scanner object.
+	 * @throws IOException
+	 * @throws InterruptedException
+	 */
+	public Scanner getScanner() throws IOException, InterruptedException {
+		StringWriter sw = new StringWriter();
+		pipeTo(sw, true);
+		run();
+		return new Scanner(sw.toString());
+	}
+
+	/**
+	 * Destroys the underlying process.
+	 * This method is only needed if the {@link #getScanner()} method was used.
+	 */
+	private void close() {
+		IOUtils.closeQuietly(logWriters, outWriters);
+		if (p != null)
+			p.destroy();
+	}
+
+	/**
+	 * Specifies interface for defining OS-specific commands.
+	 */
+	public abstract static class Matcher {
+		abstract boolean matches();
+	}
+
+	private static String OS = System.getProperty("os.name").toLowerCase();
+
+	/** Operating system matcher: Any operating system. */
+	public final static Matcher ANY = new Matcher() {
+			@Override boolean matches() {
+				return true;
+			}
+	};
+
+	/** Operating system matcher: Any Windows system. */
+	public final static Matcher WINDOWS = new Matcher() {
+			@Override boolean matches() {
+				return OS.indexOf("win") >= 0;
+			}
+	};
+
+	/** Operating system matcher: Any Mac system. */
+	public final static Matcher MAC = new Matcher() {
+			@Override boolean matches() {
+				return OS.indexOf("mac") >= 0;
+			}
+	};
+
+	/** Operating system matcher: Any Unix or Linux system. */
+	public final static Matcher UNIX = new Matcher() {
+			@Override boolean matches() {
+				return OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0;
+			}
+	};
+
+	private static List<String> toList(Object...args) {
+		List<String> l = new LinkedList<String>();
+		for (Object o : args) {
+			if (o.getClass().isArray())
+				for (int i = 0; i < Array.getLength(o); i++)
+					l.add(Array.get(o, i).toString());
+			else if (o instanceof Collection)
+				for (Object o2 : (Collection<?>)o)
+					l.add(o2.toString());
+			else
+				l.add(o.toString());
+		}
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class
new file mode 100755
index 0000000..2088152
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
new file mode 100755
index 0000000..b8ddc56
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.CollectionUtils.*;
+
+import java.io.*;
+import java.lang.annotation.*;
+import java.util.*;
+
+/**
+ * Reflection utilities.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ReflectionUtils {
+
+	/**
+	 * Similar to {@link Class#getAnnotation(Class)} except also searches annotations on interfaces.
+	 *
+	 * @param <T> The annotation class type.
+	 * @param a The annotation class.
+	 * @param c The annotated class.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	public static <T extends Annotation> T getAnnotation(Class<T> a, Class<?> c) {
+		if (c == null)
+			return null;
+
+		T t = getDeclaredAnnotation(a, c);
+		if (t != null)
+			return t;
+
+		t = getAnnotation(a, c.getSuperclass());
+		if (t != null)
+			return t;
+
+		for (Class<?> c2 : c.getInterfaces()) {
+			t = getAnnotation(a, c2);
+			if (t != null)
+				return t;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the specified annotation only if it's been declared on the specified class.
+	 * <p>
+	 * 	More efficient than calling {@link Class#getAnnotation(Class)} since it doesn't
+	 * 	recursively look for the class up the parent chain.
+	 *
+	 * @param <T> The annotation class type.
+	 * @param a The annotation class.
+	 * @param c The annotated class.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T extends Annotation> T getDeclaredAnnotation(Class<T> a, Class<?> c) {
+		for (Annotation a2 : c.getDeclaredAnnotations())
+			if (a2.annotationType() == a)
+				return (T)a2;
+		return null;
+	}
+
+	/**
+	 * Returns all instances of the specified annotation on the specified class.
+	 * <p>
+	 * Searches all superclasses and superinterfaces.
+	 * <p>
+	 * Results are ordered child-to-parent.
+	 *
+	 * @param <T> The annotation class type.
+	 * @param a The annotation class type.
+	 * @param c The class being searched.
+	 * @return The found matches, or an empty array if annotation was not found.
+	 */
+	public static <T extends Annotation> List<T> findAnnotations(Class<T> a, Class<?> c) {
+		List<T> l = new LinkedList<T>();
+		appendAnnotations(a, c, l);
+		return l;
+	}
+
+	/**
+	 * Sames as {@link #findAnnotations(Class, Class)} except returns the annotations as a map
+	 * with the keys being the class on which the annotation was found.
+	 * <p>
+	 * Results are ordered child-to-parent.
+	 *
+	 * @param <T> The annotation class type.
+	 * @param a The annotation class type.
+	 * @param c The class being searched.
+	 * @return The found matches, or an empty array if annotation was not found.
+	 */
+	public static <T extends Annotation> LinkedHashMap<Class<?>,T> findAnnotationsMap(Class<T> a, Class<?> c) {
+		LinkedHashMap<Class<?>,T> m = new LinkedHashMap<Class<?>,T>();
+		findAnnotationsMap(a, c, m);
+		return m;
+	}
+
+	private static <T extends Annotation> void findAnnotationsMap(Class<T> a, Class<?> c, Map<Class<?>,T> m) {
+		if (c == null)
+			return;
+
+		T t = getDeclaredAnnotation(a, c);
+		if (t != null)
+			m.put(c, t);
+
+		findAnnotationsMap(a, c.getSuperclass(), m);
+
+		for (Class<?> c2 : c.getInterfaces())
+			findAnnotationsMap(a, c2, m);
+	}
+
+	/**
+	 * Finds and appends the specified annotation on the specified class and superclasses/interfaces to the specified list.
+	 *
+	 * @param a The annotation.
+	 * @param c The class.
+	 * @param l The list of annotations.
+	 */
+	public static <T extends Annotation> void appendAnnotations(Class<T> a, Class<?> c, List<T> l) {
+		if (c == null)
+			return;
+
+		addIfNotNull(l, getDeclaredAnnotation(a, c));
+
+		if (c.getPackage() != null)
+			addIfNotNull(l, c.getPackage().getAnnotation(a));
+
+		appendAnnotations(a, c.getSuperclass(), l);
+
+		for (Class<?> c2 : c.getInterfaces())
+			appendAnnotations(a, c2, l);
+	}
+
+	/**
+	 * Similar to {@link Class#getResourceAsStream(String)} except looks up the
+	 * parent hierarchy for the existence of the specified resource.
+	 *
+	 * @param c The class to return the resource on.
+	 * @param name The resource name.
+	 * @return An input stream on the specified resource, or <jk>null</jk> if the resource could not be found.
+	 */
+	public static InputStream getResource(Class<?> c, String name) {
+		while (c != null) {
+			InputStream is = c.getResourceAsStream(name);
+			if (is != null)
+				return is;
+			c = c.getSuperclass();
+		}
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class
new file mode 100755
index 0000000..5509806
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
new file mode 100755
index 0000000..a19a76d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.text.*;
+import java.util.*;
+
+/**
+ * Wraps a {@link ResourceBundle} to gracefully handle missing bundles and entries.
+ * <p>
+ * If the bundle isn't found, <code>getString(key)</code> returns <js>"{!!key}"</js>.
+ * <p>
+ * If the key isn't found, <code>getString(key)</code> returns <js>"{!key}"</js>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SafeResourceBundle extends ResourceBundle {
+
+	private ResourceBundle rb;
+	private String className = null;
+	Map<String,String> classPrefixedKeys = new HashMap<String,String>();
+
+	SafeResourceBundle() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rb The resource bundle to wrap.  Can be <jk>null</jk> to indicate a missing bundle.
+	 * @param forClass The class using this resource bundle.
+	 */
+	public SafeResourceBundle(ResourceBundle rb, Class<?> forClass) {
+		this.rb = rb;
+		if (forClass != null)
+			className = forClass.getSimpleName();
+		if (rb != null) {
+			String c = className + '.';
+			for (Enumeration<String> e = getKeys(); e.hasMoreElements();) {
+				String key = e.nextElement();
+				if (key.startsWith(c))
+					classPrefixedKeys.put(key.substring(className.length() + 1), key);
+			}
+		}
+	}
+
+	@Override /* ResourceBundle */
+	public boolean containsKey(String key) {
+		return rb != null && (rb.containsKey(key) || classPrefixedKeys.containsKey(key));
+	}
+
+	/**
+	 * Similar to {@link ResourceBundle#getString(String)} except allows you to pass in {@link MessageFormat} objects.
+	 *
+	 * @param key The resource bundle key.
+	 * @param args Optional variable replacement arguments.
+	 * @return The resolved value.  Never <jk>null</jk>.  <js>"{!!key}"</j> if the bundle is missing.  <js>"{!key}"</j> if the key is missing.
+	 */
+	public String getString(String key, Object...args) {
+		if (rb == null)
+			return "{!!"+key+"}";
+		if (! containsKey(key))
+			return "{!" + key + "}";
+		String val = getString(key);
+		if (args.length > 0)
+			return MessageFormat.format(val, args);
+		return val;
+	}
+
+	/**
+	 * Looks for all the specified keys in the resource bundle and returns the first value that exists.
+	 *
+	 * @param keys
+	 * @return The resolved value, or <jk>null</jk> if no value is found or the resource bundle is missing.
+	 */
+	public String findFirstString(String...keys) {
+		if (rb == null)
+			return null;
+		for (String k : keys) {
+			if (containsKey(k))
+				return getString(k);
+		}
+		return null;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* ResourceBundle */
+	public Set<String> keySet() {
+		if (rb == null)
+			return Collections.emptySet();
+		return new MultiSet<String>(rb.keySet(), classPrefixedKeys.keySet()) ;
+	}
+
+	/**
+	 * Returns all keys in this resource bundle with the specified prefix.
+	 *
+	 * @param prefix The prefix.
+	 * @return The set of all keys in the resource bundle with the prefix.
+	 */
+	public Set<String> keySet(String prefix) {
+		Set<String> set = new HashSet<String>();
+		for (String s : keySet()) {
+			if (s.equals(prefix) || (s.startsWith(prefix) && s.charAt(prefix.length()) == '.'))
+				set.add(s);
+		}
+		return set;
+	}
+
+	@Override /* ResourceBundle */
+	public Enumeration<String> getKeys() {
+		if (rb == null)
+			return new Vector<String>(0).elements();
+		return rb.getKeys();
+	}
+
+	@Override /* ResourceBundle */
+	protected Object handleGetObject(String key) {
+		if (rb == null)
+			return "{!!"+key+"}";
+		try {
+			if (classPrefixedKeys.containsKey(key))
+				key = classPrefixedKeys.get(key);
+			return rb.getObject(key);
+		} catch (Exception e) {
+			return "{!"+key+"}";
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class
new file mode 100755
index 0000000..5e239a4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
new file mode 100755
index 0000000..fcf4ccc
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+/**
+ * A collection of {@link SafeResourceBundle} objects.
+ * Allows servlets to define resource bundles for different classes in the class hierarchy.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SafeResourceMultiBundle extends SafeResourceBundle {
+
+	private List<SafeResourceBundle> bundles = new ArrayList<SafeResourceBundle>();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param bundles The resource bundles to wrap.  Can be <jk>null</jk> to indicate a missing bundle.
+	 */
+	public SafeResourceMultiBundle(Collection<SafeResourceBundle> bundles) {
+		this.bundles.addAll(bundles);
+ 	}
+
+	@Override /* SafeResourceBundle */
+	public String findFirstString(String...keys) {
+		for (String key : keys)
+			for (SafeResourceBundle srb : bundles)
+				if (srb.containsKey(key))
+					return srb.getString(key);
+		return null;
+	}
+
+	@Override /* ResourceBundle */
+	public boolean containsKey(String key) {
+		for (SafeResourceBundle srb : bundles)
+			if (srb.containsKey(key))
+				return true;
+		return false;
+	}
+
+	@Override /* SafeResourceBundle */
+	public String getString(String key, Object...args) {
+		for (SafeResourceBundle srb : bundles)
+			if (srb.containsKey(key))
+				return srb.getString(key, args);
+		return "{!" + key + "}";
+	}
+
+	@Override /* ResourceBundle */
+	@SuppressWarnings("unchecked")
+	public Set<String> keySet() {
+		MultiSet<String> s = new MultiSet<String>();
+		for (SafeResourceBundle rb : bundles)
+			s.append(rb.keySet());
+		return s;
+	}
+
+	@Override /* ResourceBundle */
+	@SuppressWarnings("unchecked")
+	public Enumeration<String> getKeys() {
+		MultiSet<String> s = new MultiSet<String>();
+		for (SafeResourceBundle rb : bundles)
+			s.append(rb.keySet());
+		return s.enumerator();
+	}
+
+	@Override /* ResourceBundle */
+	protected Object handleGetObject(String key) {
+		for (SafeResourceBundle srb : bundles)
+			if (srb.containsKey(key))
+				return srb.handleGetObject(key);
+		return "{!"+key+"}";
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class
new file mode 100755
index 0000000..e935d78
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class
new file mode 100755
index 0000000..c515bc1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class
new file mode 100755
index 0000000..03c32ce
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
new file mode 100755
index 0000000..21bd047
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ArrayUtils.*;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.text.*;
+import java.util.*;
+
+/**
+ * An instance of a <code>Map</code> where the keys and values
+ * 	are simple <code>String[]</code> and <code>Object[]</code> arrays.
+ * <p>
+ * 	Typically more efficient than <code>HashMaps</code> for small maps (e.g. &lt;10 entries).
+ * <p>
+ * 	Does not support adding or removing entries.
+ * <p>
+ * 	Setting values overwrites the value on the underlying value array.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SimpleMap extends AbstractMap<String,Object> {
+
+	private final String[] keys;
+	private final Object[] values;
+	private final Map.Entry<String,Object>[] entries;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param keys The map keys.  Must not be <jk>null</jk>.
+	 * @param values The map values.  Must not be <jk>null</jk>.
+	 */
+	public SimpleMap(String[] keys, Object[] values) {
+		assertFieldNotNull(keys, "keys");
+		assertFieldNotNull(values, "values");
+		if (keys.length != values.length)
+			illegalArg("keys ''{0}'' and values ''{1}'' array lengths differ", keys.length, values.length);
+
+		this.keys = keys;
+		this.values = values;
+		entries = new SimpleMapEntry[keys.length];
+		for (int i = 0; i < keys.length; i++) {
+			if (keys[i] == null)
+				illegalArg("Keys array cannot contain a null value.");
+			entries[i] = new SimpleMapEntry(i);
+	}
+	}
+
+	@Override /* Map */
+	public Set<Map.Entry<String,Object>> entrySet() {
+		return asSet(entries);
+	}
+
+	@Override /* Map */
+	public Object get(Object key) {
+		for (int i = 0; i < keys.length; i++)
+			if (keys[i].equals(key))
+				return values[i];
+		return null;
+	}
+
+	@Override /* Map */
+	public Set<String> keySet() {
+		return asSet(keys);
+	}
+
+	@Override /* Map */
+	public Object put(String key, Object value) {
+		for (int i = 0; i < keys.length; i++) {
+			if (keys[i].equals(key)) {
+				Object v = values[i];
+				values[i] = value;
+				return v;
+			}
+		}
+		throw new IllegalArgumentException(MessageFormat.format("No key ''{0}'' defined in map", key));
+	}
+
+	private class SimpleMapEntry implements Map.Entry<String,Object> {
+
+		private int index;
+
+		private SimpleMapEntry(int index) {
+			this.index = index;
+		}
+
+		@Override /* Map.Entry */
+		public String getKey() {
+			return keys[index];
+		}
+
+		@Override /* Map.Entry */
+		public Object getValue() {
+			return values[index];
+		}
+
+		@Override /* Map.Entry */
+		public Object setValue(Object val) {
+			Object v = values[index];
+			values[index] = val;
+			return v;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class
new file mode 100755
index 0000000..c1f9118
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
new file mode 100755
index 0000000..8fffbdb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.io.*;
+
+/**
+ * Similar to {@link StringWriter}, but uses a {@link StringBuilder} instead to avoid synchronization overhead.
+ * <p>
+ * Note that this class is NOT thread safe.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class StringBuilderWriter extends Writer {
+
+	private StringBuilder sb;
+
+	/**
+	 * Create a new string writer using the default initial string-builder size.
+	 */
+	public StringBuilderWriter() {
+		sb = new StringBuilder();
+		lock = null;
+	}
+
+	/**
+	 * Create a new string writer using the specified initial string-builder size.
+	 *
+	 * @param initialSize The number of <tt>char</tt> values that will fit into this buffer before it is automatically expanded
+	 * @throws IllegalArgumentException If <tt>initialSize</tt> is negative
+	 */
+	public StringBuilderWriter(int initialSize) {
+		sb = new StringBuilder(initialSize);
+		lock = null;
+	}
+
+	@Override /* Writer */
+	public void write(int c) {
+		sb.append((char) c);
+	}
+
+	@Override /* Writer */
+	public void write(char cbuf[], int start, int length) {
+		sb.append(cbuf, start, length);
+	}
+
+	@Override /* Writer */
+	public void write(String str) {
+		sb.append(str);
+	}
+
+	@Override /* Writer */
+	public void write(String str, int off, int len) {
+		sb.append(str.substring(off, off + len));
+	}
+
+	@Override /* Writer */
+	public StringBuilderWriter append(CharSequence csq) {
+		if (csq == null)
+			write("null");
+		else
+			write(csq.toString());
+		return this;
+	}
+
+	@Override /* Writer */
+	public StringBuilderWriter append(CharSequence csq, int start, int end) {
+		CharSequence cs = (csq == null ? "null" : csq);
+		write(cs.subSequence(start, end).toString());
+		return this;
+	}
+
+	@Override /* Writer */
+	public StringBuilderWriter append(char c) {
+		write(c);
+		return this;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return sb.toString();
+	}
+
+	@Override /* Writer */
+	public void flush() {}
+
+	@Override /* Writer */
+	public void close() throws IOException {}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class
new file mode 100755
index 0000000..82ed33f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
new file mode 100755
index 0000000..4621af4
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
@@ -0,0 +1,873 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.math.*;
+import java.util.*;
+import java.util.concurrent.atomic.*;
+import java.util.regex.*;
+
+import javax.xml.bind.*;
+
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Reusable string utility methods.
+ */
+public final class StringUtils {
+
+	private static final AsciiSet numberChars = new AsciiSet("-xX.+-#pP0123456789abcdefABCDEF");
+	private static final AsciiSet firstNumberChars = new AsciiSet("+-.#0123456789");
+	private static final AsciiSet octChars = new AsciiSet("01234567");
+	private static final AsciiSet decChars = new AsciiSet("0123456789");
+	private static final AsciiSet hexChars = new AsciiSet("0123456789abcdefABCDEF");
+
+	// Maps 6-bit nibbles to BASE64 characters.
+	private static final char[] base64m1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
+
+	// Maps BASE64 characters to 6-bit nibbles.
+	private static final byte[] base64m2 = new byte[128];
+	static {
+		for (int i = 0; i < 64; i++)
+			base64m2[base64m1[i]] = (byte)i;
+	}
+
+	/**
+	 * Parses a number from the specified reader stream.
+	 *
+	 * @param r The reader to parse the string from.
+	 * @param type The number type to created. <br>
+	 * 	Can be any of the following:
+	 * 	<ul>
+	 * 		<li> Integer
+	 * 		<li> Double
+	 * 		<li> Float
+	 * 		<li> Long
+	 * 		<li> Short
+	 * 		<li> Byte
+	 * 		<li> BigInteger
+	 * 		<li> BigDecimal
+	 * 	</ul>
+	 * 	If <jk>null</jk>, uses the best guess.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 * @return The parsed number.
+	 * @throws ParseException
+	 */
+	public static Number parseNumber(ParserReader r, Class<? extends Number> type) throws IOException, ParseException {
+		return parseNumber(parseNumberString(r), type);
+	}
+
+	/**
+	 * Reads a numeric string from the specified reader.
+	 *
+	 * @param r The reader to read form.
+	 * @return The parsed number string.
+	 * @throws IOException
+	 */
+	public static String parseNumberString(ParserReader r) throws IOException {
+		r.mark();
+		int c = 0;
+		while (true) {
+			c = r.read();
+			if (c == -1)
+				break;
+			if (! numberChars.contains((char)c)) {
+				r.unread();
+				break;
+			}
+		}
+		return r.getMarked();
+	}
+
+	/**
+	 * Parses a number from the specified string.
+	 *
+	 * @param s The string to parse the number from.
+	 * @param type The number type to created. <br>
+	 * 	Can be any of the following:
+	 * 	<ul>
+	 * 		<li> Integer
+	 * 		<li> Double
+	 * 		<li> Float
+	 * 		<li> Long
+	 * 		<li> Short
+	 * 		<li> Byte
+	 * 		<li> BigInteger
+	 * 		<li> BigDecimal
+	 * 	</ul>
+	 * 	If <jk>null</jk>, uses the best guess.
+	 * @return The parsed number.
+	 * @throws ParseException
+	 */
+	public static Number parseNumber(String s, Class<? extends Number> type) throws ParseException {
+
+		if (s.isEmpty())
+			s = "0";
+		if (type == null)
+			type = Number.class;
+
+		try {
+			// Determine the data type if it wasn't specified.
+			boolean isAutoDetect = (type == Number.class);
+			boolean isDecimal = false;
+			if (isAutoDetect) {
+				// If we're auto-detecting, then we use either an Integer, Long, or Double depending on how
+				// long the string is.
+				// An integer range is -2,147,483,648 to 2,147,483,647
+				// An long range is -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807
+				isDecimal = isDecimal(s);
+				if (isDecimal) {
+					if (s.length() > 20)
+						type = Double.class;
+					else if (s.length() >= 10)
+					type = Long.class;
+					else
+						type = Integer.class;
+				}
+				else if (isFloat(s))
+					type = Double.class;
+				else
+					throw new NumberFormatException(s);
+			}
+
+			if (type == Double.class || type == Double.TYPE) {
+				Double d = Double.valueOf(s);
+				if (isAutoDetect && (! isDecimal) && d >= -Float.MAX_VALUE && d <= Float.MAX_VALUE)
+					return d.floatValue();
+				return d;
+			}
+			if (type == Float.class || type == Float.TYPE)
+				return Float.valueOf(s);
+			if (type == BigDecimal.class)
+				return new BigDecimal(s);
+			if (type == Long.class || type == Long.TYPE || type == AtomicLong.class) {
+				try {
+				Long l = Long.decode(s);
+					if (type == AtomicLong.class)
+						return new AtomicLong(l);
+					if (isAutoDetect && l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
+						// This occurs if the string is 10 characters long but is still a valid integer value.
+					return l.intValue();
+					}
+				return l;
+				} catch (NumberFormatException e) {
+					if (isAutoDetect) {
+						// This occurs if the string is 20 characters long but still falls outside the range of a valid long.
+						return Double.valueOf(s);
+					}
+					throw e;
+				}
+			}
+			if (type == Integer.class || type == Integer.TYPE)
+				return Integer.decode(s);
+			if (type == Short.class || type == Short.TYPE)
+				return Short.decode(s);
+			if (type == Byte.class || type == Byte.TYPE)
+				return Byte.decode(s);
+			if (type == BigInteger.class)
+				return new BigInteger(s);
+			if (type == AtomicInteger.class)
+				return new AtomicInteger(Integer.decode(s));
+			throw new ParseException("Unsupported Number type: {0}", type.getName());
+		} catch (NumberFormatException e) {
+			throw new ParseException("Could not convert string ''{0}'' to class ''{1}''", s, type.getName()).initCause(e);
+		}
+	}
+
+   private final static Pattern fpRegex = Pattern.compile(
+      "[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*"
+   );
+
+	/**
+	 * Returns <jk>true</jk> if this string can be parsed by {@link #parseNumber(String, Class)}.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true</jk> if this string can be parsed without causing an exception.
+	 */
+	public static boolean isNumeric(String s) {
+		if (s == null || s.isEmpty())
+			return false;
+		if (! firstNumberChars.contains(s.charAt(0)))
+			return false;
+		return isDecimal(s) || isFloat(s);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified string is a floating point number.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true</jk> if the specified string is a floating point number.
+	 */
+	public static boolean isFloat(String s) {
+		if (s == null || s.isEmpty())
+			return false;
+		if (! firstNumberChars.contains(s.charAt(0)))
+			return (s.equals("NaN") || s.equals("Infinity"));
+		int i = 0;
+		int length = s.length();
+		char c = s.charAt(0);
+		if (c == '+' || c == '-')
+			i++;
+		if (i == length)
+			return false;
+		c = s.charAt(i++);
+		if (c == '.' || decChars.contains(c)) {
+			return fpRegex.matcher(s).matches();
+		}
+		return false;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified string is numeric.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true</jk> if the specified string is numeric.
+	 */
+	public static boolean isDecimal(String s) {
+		if (s == null || s.isEmpty())
+			return false;
+		if (! firstNumberChars.contains(s.charAt(0)))
+			return false;
+		int i = 0;
+		int length = s.length();
+		char c = s.charAt(0);
+		boolean isPrefixed = false;
+		if (c == '+' || c == '-') {
+			isPrefixed = true;
+			i++;
+		}
+		if (i == length)
+			return false;
+		c = s.charAt(i++);
+		if (c == '0' && length > (isPrefixed ? 2 : 1)) {
+			c = s.charAt(i++);
+			if (c == 'x' || c == 'X') {
+				for (int j = i; j < length; j++) {
+					if (! hexChars.contains(s.charAt(j)))
+						return false;
+				}
+			} else if (octChars.contains(c)) {
+				for (int j = i; j < length; j++)
+					if (! octChars.contains(s.charAt(j)))
+						return false;
+			} else {
+				return false;
+			}
+		} else if (c == '#') {
+			for (int j = i; j < length; j++) {
+				if (! hexChars.contains(s.charAt(j)))
+					return false;
+			}
+		} else if (decChars.contains(c)) {
+			for (int j = i; j < length; j++)
+				if (! decChars.contains(s.charAt(j)))
+					return false;
+		} else {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Convenience method for getting a stack trace as a string.
+	 *
+	 * @param t The throwable to get the stack trace from.
+	 * @return The same content that would normally be rendered via <code>t.printStackTrace()</code>
+	 */
+	public static String getStackTrace(Throwable t) {
+		StringWriter sw = new StringWriter();
+		PrintWriter pw = new PrintWriter(sw);
+		t.printStackTrace(pw);
+		pw.flush();
+		pw.close();
+		return sw.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param separator The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(Object[] tokens, String separator) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < tokens.length; i++) {
+			if (i > 0)
+				sb.append(separator);
+			sb.append(tokens[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param d The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(int[] tokens, String d) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < tokens.length; i++) {
+			if (i > 0)
+				sb.append(d);
+			sb.append(tokens[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param d The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(Collection<?> tokens, String d) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (Iterator<?> iter = tokens.iterator(); iter.hasNext();) {
+			sb.append(iter.next());
+			if (iter.hasNext())
+				sb.append(d);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param d The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(Object[] tokens, char d) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < tokens.length; i++) {
+			if (i > 0)
+				sb.append(d);
+			sb.append(tokens[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param d The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(int[] tokens, char d) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < tokens.length; i++) {
+			if (i > 0)
+				sb.append(d);
+			sb.append(tokens[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Join the specified tokens into a delimited string.
+	 *
+	 * @param tokens The tokens to join.
+	 * @param d The delimiter.
+	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
+	 */
+	public static String join(Collection<?> tokens, char d) {
+		if (tokens == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (Iterator<?> iter = tokens.iterator(); iter.hasNext();) {
+			sb.append(iter.next());
+			if (iter.hasNext())
+				sb.append(d);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Splits a character-delimited string into a string array.
+	 * Does not split on escaped-delimiters (e.g. "\,");
+	 * Resulting tokens are trimmed of whitespace.
+	 * NOTE:  This behavior is different than the Jakarta equivalent.
+	 * split("a,b,c",',') -> {"a","b","c"}
+	 * split("a, b ,c ",',') -> {"a","b","c"}
+	 * split("a,,c",',') -> {"a","","c"}
+	 * split(",,",',') -> {"","",""}
+	 * split("",',') -> {}
+	 * split(null,',') -> null
+	 * split("a,b\,c,d", ',', false) -> {"a","b\,c","d"}
+	 * split("a,b\\,c,d", ',', false) -> {"a","b\","c","d"}
+	 * split("a,b\,c,d", ',', true) -> {"a","b,c","d"}
+	 *
+	 * @param s The string to split.  Can be <jk>null</jk>.
+	 * @param c The character to split on.
+	 * @return The tokens.
+	 */
+	public static String[] split(String s, char c) {
+
+		char[] unEscapeChars = new char[]{'\\', c};
+
+		if (s == null)
+			return null;
+		if (isEmpty(s))
+			return new String[0];
+
+		List<String> l = new LinkedList<String>();
+		char[] sArray = s.toCharArray();
+		int x1 = 0, escapeCount = 0;
+		for (int i = 0; i < sArray.length; i++) {
+			if (sArray[i] == '\\') escapeCount++;
+			else if (sArray[i]==c && escapeCount % 2 == 0) {
+				String s2 = new String(sArray, x1, i-x1);
+				String s3 = unEscapeChars(s2, unEscapeChars);
+				l.add(s3.trim());
+				x1 = i+1;
+			}
+			if (sArray[i] != '\\') escapeCount = 0;
+		}
+		String s2 = new String(sArray, x1, sArray.length-x1);
+		String s3 = unEscapeChars(s2, unEscapeChars);
+		l.add(s3.trim());
+
+		return l.toArray(new String[l.size()]);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if specified string is <jk>null</jk> or empty.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true</jk> if specified string is <jk>null</jk> or empty.
+	 */
+	public static boolean isEmpty(String s) {
+		return s == null || s.isEmpty();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if specified string is <jk>null</jk> or it's {@link #toString()} method returns an empty string.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>true</jk> if specified string is <jk>null</jk> or it's {@link #toString()} method returns an empty string.
+	 */
+	public static boolean isEmpty(Object s) {
+		return s == null || s.toString().isEmpty();
+	}
+
+	/**
+	 * Returns <jk>null</jk> if the specified string is <jk>null</jk> or empty.
+	 *
+	 * @param s The string to check.
+	 * @return <jk>null</jk> if the specified string is <jk>null</jk> or empty, or the same string if not.
+	 */
+	public static String nullIfEmpty(String s) {
+		if (s == null || s.isEmpty())
+			return null;
+		return s;
+	}
+
+	/**
+	 * Removes escape characters (\) from the specified characters.
+	 *
+	 * @param s The string to remove escape characters from.
+	 * @param toEscape The characters escaped.
+	 * @return A new string if characters were removed, or the same string if not or if the input was <jk>null</jk>.
+	 */
+	public static String unEscapeChars(String s, char[] toEscape) {
+		return unEscapeChars(s, toEscape, '\\');
+	}
+
+	/**
+	 * Removes escape characters (specified by escapeChar) from the specified characters.
+	 *
+	 * @param s The string to remove escape characters from.
+	 * @param toEscape The characters escaped.
+	 * @param escapeChar The escape character.
+	 * @return A new string if characters were removed, or the same string if not or if the input was <jk>null</jk>.
+	 */
+	public static String unEscapeChars(String s, char[] toEscape, char escapeChar) {
+		if (s == null) return null;
+		if (s.length() == 0 || toEscape == null || toEscape.length == 0 || escapeChar == 0) return s;
+		StringBuffer sb = new StringBuffer(s.length());
+		char[] sArray = s.toCharArray();
+		for (int i = 0; i < sArray.length; i++) {
+			char c = sArray[i];
+
+			if (c == escapeChar) {
+				if (i+1 != sArray.length) {
+					char c2 = sArray[i+1];
+					boolean isOneOf = false;
+					for (int j = 0; j < toEscape.length && ! isOneOf; j++)
+						isOneOf = (c2 == toEscape[j]);
+					if (isOneOf) {
+						i++;
+					} else if (c2 == escapeChar) {
+						sb.append(escapeChar);
+						i++;
+					}
+				}
+			}
+			sb.append(sArray[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Debug method for rendering non-ASCII character sequences.
+	 *
+	 * @param s The string to decode.
+	 * @return A string with non-ASCII characters converted to <js>"[hex]"</js> sequences.
+	 */
+	public static String decodeHex(String s) {
+		if (s == null)
+			return null;
+		StringBuilder sb = new StringBuilder();
+		for (char c : s.toCharArray()) {
+			if (c < ' ' || c > '~')
+				sb.append("["+Integer.toHexString(c)+"]");
+			else
+				sb.append(c);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * An efficient method for checking if a string starts with a character.
+	 *
+	 * @param s The string to check.  Can be <jk>null</jk>.
+	 * @param c The character to check for.
+	 * @return <jk>true</jk> if the specified string is not <jk>null</jk> and starts with the specified character.
+	 */
+	public static boolean startsWith(String s, char c) {
+		if (s != null) {
+			int i = s.length();
+			if (i > 0)
+				return s.charAt(0) == c;
+		}
+		return false;
+	}
+
+	/**
+	 * An efficient method for checking if a string ends with a character.
+	 *
+	 * @param s The string to check.  Can be <jk>null</jk>.
+	 * @param c The character to check for.
+	 * @return <jk>true</jk> if the specified string is not <jk>null</jk> and ends with the specified character.
+	 */
+	public static boolean endsWith(String s, char c) {
+		if (s != null) {
+			int i = s.length();
+			if (i > 0)
+				return s.charAt(i-1) == c;
+		}
+		return false;
+	}
+
+	/**
+	 * Tests two strings for equality, but gracefully handles nulls.
+	 *
+	 * @param s1 String 1.
+	 * @param s2 String 2.
+	 * @return <jk>true</jk> if the strings are equal.
+	 */
+	public static boolean isEquals(String s1, String s2) {
+		if (s1 == null)
+			return s2 == null;
+		if (s2 == null)
+			return false;
+		return s1.equals(s2);
+	}
+
+	/**
+	 * Shortcut for calling <code>base64Encode(in.getBytes(<js>"UTF-8"</js>))</code>
+	 *
+	 * @param in The input string to convert.
+	 * @return The string converted to BASE-64 encoding.
+	 */
+	public static String base64EncodeToString(String in) {
+		if (in == null)
+			return null;
+		return base64Encode(in.getBytes(IOUtils.UTF8));
+	}
+
+	/**
+	 * BASE64-encodes the specified byte array.
+	 *
+	 * @param in The input byte array to convert.
+	 * @return The byte array converted to a BASE-64 encoded string.
+	 */
+	public static String base64Encode(byte[] in) {
+		int outLength = (in.length * 4 + 2) / 3;   // Output length without padding
+		char[] out = new char[((in.length + 2) / 3) * 4];  // Length includes padding.
+		int iIn = 0;
+		int iOut = 0;
+		while (iIn < in.length) {
+			int i0 = in[iIn++] & 0xff;
+			int i1 = iIn < in.length ? in[iIn++] & 0xff : 0;
+			int i2 = iIn < in.length ? in[iIn++] & 0xff : 0;
+			int o0 = i0 >>> 2;
+			int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
+			int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
+			int o3 = i2 & 0x3F;
+			out[iOut++] = base64m1[o0];
+			out[iOut++] = base64m1[o1];
+			out[iOut] = iOut < outLength ? base64m1[o2] : '=';
+			iOut++;
+			out[iOut] = iOut < outLength ? base64m1[o3] : '=';
+			iOut++;
+		}
+		return new String(out);
+	}
+
+	/**
+	 * Shortcut for calling <code>base64Decode(String)</code> and converting the
+	 * 	result to a UTF-8 encoded string.
+	 *
+	 * @param in The BASE-64 encoded string to decode.
+	 * @return The decoded string.
+	 */
+	public static String base64DecodeToString(String in) {
+		byte[] b = base64Decode(in);
+		if (b == null)
+			return null;
+		return new String(b, IOUtils.UTF8);
+	}
+
+	/**
+	 * BASE64-decodes the specified string.
+	 *
+	 * @param in The BASE-64 encoded string.
+	 * @return The decoded byte array.
+	 */
+	public static byte[] base64Decode(String in) {
+		if (in == null)
+			return null;
+
+		byte bIn[] = in.getBytes(IOUtils.UTF8);
+
+		if (bIn.length % 4 != 0)
+			illegalArg("Invalid BASE64 string length.  Must be multiple of 4.");
+
+		// Strip out any trailing '=' filler characters.
+		int inLength = bIn.length;
+		while (inLength > 0 && bIn[inLength - 1] == '=')
+			inLength--;
+
+		int outLength = (inLength * 3) / 4;
+		byte[] out = new byte[outLength];
+		int iIn = 0;
+		int iOut = 0;
+		while (iIn < inLength) {
+			int i0 = bIn[iIn++];
+			int i1 = bIn[iIn++];
+			int i2 = iIn < inLength ? bIn[iIn++] : 'A';
+			int i3 = iIn < inLength ? bIn[iIn++] : 'A';
+			int b0 = base64m2[i0];
+			int b1 = base64m2[i1];
+			int b2 = base64m2[i2];
+			int b3 = base64m2[i3];
+			int o0 = (b0 << 2) | (b1 >>> 4);
+			int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
+			int o2 = ((b2 & 3) << 6) | b3;
+			out[iOut++] = (byte)o0;
+			if (iOut < outLength)
+				out[iOut++] = (byte)o1;
+			if (iOut < outLength)
+				out[iOut++] = (byte)o2;
+		}
+		return out;
+	}
+
+	/**
+	 * Generated a random UUID with the specified number of characters.
+	 * Characters are composed of lower-case ASCII letters and numbers only.
+	 * This method conforms to the restrictions for hostnames as specified in <a href='https://tools.ietf.org/html/rfc952'>RFC 952</a>
+	 * Since each character has 36 possible values, the square approximation formula for
+	 * 	the number of generated IDs that would produce a 50% chance of collision is:
+	 * <code>sqrt(36^N)</code>.
+	 * Dividing this number by 10 gives you an approximation of the number of generated IDs
+	 * 	needed to produce a <1% chance of collision.
+	 * For example, given 5 characters, the number of generated IDs need to produce a <1% chance of
+	 * 	collision would be:
+	 * <code>sqrt(36^5)/10=777</code>
+	 *
+	 * @param numchars The number of characters in the generated UUID.
+	 * @return A new random UUID.
+	 */
+	public static String generateUUID(int numchars) {
+		Random r = new Random();
+		StringBuilder sb = new StringBuilder(numchars);
+		for (int i = 0; i < numchars; i++) {
+			int c = r.nextInt(36) + 97;
+			if (c > 'z')
+				c -= ('z'-'0'+1);
+			sb.append((char)c);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Same as {@link String#trim()} but prevents <code>NullPointerExceptions</code>.
+	 *
+	 * @param s The string to trim.
+	 * @return The trimmed string, or <jk>null</jk> if the string was <jk>null</jk>.
+	 */
+	public static String trim(String s) {
+		if (s == null)
+			return null;
+		return s.trim();
+	}
+
+	/**
+	 * Parses an ISO8601 string into a date.
+	 *
+	 * @param date The date string.
+	 * @return The parsed date.
+	 * @throws IllegalArgumentException
+	 */
+	@SuppressWarnings("nls")
+	public static Date parseISO8601Date(String date) throws IllegalArgumentException {
+		if (isEmpty(date))
+			return null;
+		date = date.trim().replace(' ', 'T');  // Convert to 'standard' ISO8601
+		if (date.indexOf(',') != -1)  // Trim milliseconds
+			date = date.substring(0, date.indexOf(','));
+		if (date.matches("\\d{4}"))
+			date += "-01-01T00:00:00";
+		else if (date.matches("\\d{4}\\-\\d{2}"))
+			date += "-01T00:00:00";
+		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}"))
+			date += "T00:00:00";
+		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}T\\d{2}"))
+			date += ":00:00";
+		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}T\\d{2}\\:\\d{2}"))
+			date += ":00";
+		return DatatypeConverter.parseDateTime(date).getTime();
+	}
+
+	/**
+	 * Simple utility for replacing variables of the form <js>"{key}"</js> with values
+	 * 	in the specified map.
+	 * <p>
+	 * Nested variables are supported in both the input string and map values.
+	 * <p>
+	 * If the map does not contain the specified value, the variable is not replaced.
+	 *	<p>
+	 *	<jk>null</jk> values in the map are treated as blank strings.
+	 *
+	 * @param s The string containing variables to replace.
+	 * @param m The map containing the variable values.
+	 * @return The new string with variables replaced, or the original string if it didn't have variables in it.
+	 */
+	public static String replaceVars(String s, Map<String,Object> m) {
+
+		if (s.indexOf('{') == -1)
+			return s;
+
+		int S1 = 1;	   // Not in variable, looking for {
+		int S2 = 2;    // Found {, Looking for }
+
+		int state = S1;
+		boolean hasInternalVar = false;
+		int x = 0;
+		int depth = 0;
+		int length = s.length();
+		StringBuilder out = new StringBuilder();
+		for (int i = 0; i < length; i++) {
+			char c = s.charAt(i);
+			if (state == S1) {
+				if (c == '{') {
+					state = S2;
+					x = i;
+				} else {
+					out.append(c);
+				}
+			} else /* state == S2 */ {
+				if (c == '{') {
+					depth++;
+					hasInternalVar = true;
+				} else if (c == '}') {
+					if (depth > 0) {
+						depth--;
+					} else {
+						String key = s.substring(x+1, i);
+						key = (hasInternalVar ? replaceVars(key, m) : key);
+						hasInternalVar = false;
+						if (! m.containsKey(key))
+							out.append('{').append(key).append('}');
+						else {
+							Object val = m.get(key);
+							if (val == null)
+								val = "";
+							String v = val.toString();
+							// If the replacement also contains variables, replace them now.
+							if (v.indexOf('{') != -1)
+								v = replaceVars(v, m);
+							out.append(v);
+						}
+						state = 1;
+					}
+				}
+			}
+		}
+		return out.toString();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified path string is prefixed with the specified prefix.
+	 * <p>
+	 * Examples:
+	 * <p class='bcode'>
+	 * 	pathStartsWith(<js>"foo"</js>, <js>"foo"</js>);  <jc>// true</jc>
+	 * 	pathStartsWith(<js>"foo/bar"</js>, <js>"foo"</js>);  <jc>// true</jc>
+	 * 	pathStartsWith(<js>"foo2"</js>, <js>"foo"</js>);  <jc>// false</jc>
+	 * 	pathStartsWith(<js>"foo2"</js>, <js>""</js>);  <jc>// false</jc>
+	 * </p>
+	 *
+	 * @param path The path to check.
+	 * @param pathPrefix The prefix.
+	 * @return <jk>true</jk> if the specified path string is prefixed with the specified prefix.
+	 */
+	public static boolean pathStartsWith(String path, String pathPrefix) {
+		if (path == null || pathPrefix == null)
+			return false;
+		if (path.startsWith(pathPrefix))
+			return path.length() == pathPrefix.length() || path.charAt(pathPrefix.length()) == '/';
+		return false;
+	}
+
+	/**
+	 * Same as {@link #pathStartsWith(String, String)} but returns <jk>true</jk> if at least one prefix matches.
+	 * <p>
+	 *
+	 * @param path The path to check.
+	 * @param pathPrefixes The prefixes.
+	 * @return <jk>true</jk> if the specified path string is prefixed with any of the specified prefixes.
+	 */
+	public static boolean pathStartsWith(String path, String[] pathPrefixes) {
+		for (String p : pathPrefixes)
+			if (pathStartsWith(path, p))
+				return true;
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class
new file mode 100755
index 0000000..3aa5049
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
new file mode 100755
index 0000000..c09e88b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+/**
+ * Interface for the resolution of string variables using the {@link StringVarResolver} API.
+ *
+ * @author jbognar
+ */
+public abstract class StringVar {
+
+	/**
+	 * The method called from {@link StringVarResolver}.
+	 * Can be overridden to intercept the request and do special handling.
+	 * Default implementation simply calls resolve(String).
+	 *
+	 * @param arg The inside argument of the variable.
+	 * @return The resolved value.
+	 */
+	protected String doResolve(String arg) {
+		return resolve(arg);
+	}
+
+	/**
+	 * The interface that needs to be implemented for string vars.
+	 *
+	 * @param arg The inside argument of the variable.
+	 * @return The resolved value.
+	 */
+	public abstract String resolve(String arg);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class
new file mode 100755
index 0000000..3d6cef6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
new file mode 100755
index 0000000..5f9b8be
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+
+/**
+ * Interface for the resolution of string vars that consist of a comma-delimited list.
+ * <p>
+ * (e.g. <js>"$X{foo, bar, baz}"</js>)
+ */
+public abstract class StringVarMultipart extends StringVar {
+
+	/**
+	 * The interface that needs to be implemented for this interface.
+	 *
+	 * @param args The arguments inside the variable.
+	 * @return The resolved variable.
+	 */
+	public abstract String resolve(String[] args);
+
+	@Override /* StringVar*/
+	public String resolve(String s) {
+		String[] s2 = s.indexOf(',') == -1 ? new String[]{s} : StringUtils.split(s, ',');
+		return resolve(s2);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class
new file mode 100755
index 0000000..91f4947
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class
new file mode 100755
index 0000000..18f9577
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class
new file mode 100755
index 0000000..f65f3b7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
new file mode 100755
index 0000000..5abffd7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
@@ -0,0 +1,357 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.StringUtils.*;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Utility class for resolving  variables of the form <code>$X{key}</code> in strings.
+ * <p>
+ * This class implements the following two methods for resolving variables in strings:
+ * <ul>
+ * 	<li>{@link #resolve(String)} - Returns a new string with variables replaced.
+ * 	<li>{@link #writeTo(String,Writer)} - Resolves variables in the string and sends the result to the writer.
+ * </ul>
+ * <p>
+ * Variables are of the form <code>$X{key}</code>, where <code>X</code> can consist of zero or more ASCII characters.<br>
+ * The variable key can contain anything, even nested variables that get recursively resolved.
+ * <p>
+ * Variable types are defined through the {@link #addVar(String, StringVar)} method.
+ * <p>
+ * The {@link StringVar} interface defines a simple method for replacing a variable key with a value.
+ * <p>
+ * <h6 class='topic'>Example:</h6>
+ * <p class='bcode'>
+ * 	<jc>// Create a variable resolver that resolves system properties (e.g. "$S{java.home}")</jc>
+ * 	StringVarResolver r = <jk>new</jk> StringVarResolver()
+ * 		.addVar(<js>"S"</js>, <jk>new</jk> StringVar() {
+ * 			<ja>@Override</ja>
+ * 			<jk>public</jk> String resolve(String varVal) {
+ * 				<jk>return</jk> System.<jsm>getProperty</jsm>(varVal);
+ * 			}
+ * 		});
+ *
+ * 	System.<jsf>out</jsf>.println(r.resolve(<js>"java.home is set to $S{java.home}"</js>));
+ * </p>
+ * <p>
+ * Subclasses of {@link StringVar} are provided for special purposes:
+ * <ul>
+ * 	<li>{@link StringVarMultipart} - Interface for the resolution of vars that consist of a comma-delimited list (e.g. <js>"$X{foo, bar, baz}"</js>)
+ * 	<li>{@link StringVarWithDefault} - Interface for the resolution of vars with a default value if the <code>resolve(String)</code> method returns <jk>null</jk> (e.g. <js>"$S{myProperty,not found}"</js>).
+ * </ul>
+ *	<p>
+ *	The {@link #DEFAULT} instance is a reusable variable resolver that includes support for system properties and environment variables.
+ * <p>
+ * <code>StringVarResolvers</code> can be extended by using the {@link #StringVarResolver(StringVarResolver)} constructor.
+ * <p>
+ * <h6 class='topic'>Example:</h6>
+ * <p class='bcode'>
+ * 	<jc>// Create a var resolver that extends the default resolver and appends our own "$URLEncode{...}" variable</jc>
+ * 	StringVarResolver r = <jk>new</jk> StringVarResolver(StringVarResolver.<jsf>DEFAULT</jsf>)
+ * 		.addVar(<js>"URLEncode"</js>, <jk>new</jk> StringVar() {
+ * 			<ja>@Override</ja>
+ * 			<jk>public</jk> String resolve(String varVal) {
+ * 				<jk>return</jk> URLEncoder.<jsm>encode</jsm>(varVal, <js>"UTF-8"</js>);
+ * 			}
+ * 		});
+ *
+ * 	<jc>// Retrieve a system property and URL-encode it if necessary.</jc>
+ * 	String myProperty = r.resolve(<js>"$URLEncode{$S{my.property}}"</js>);
+ * <p>
+ * Variables can be nested arbitrarily deep.
+ * <p>
+ * <h6 class='topic'>Example:</h6>
+ * <p class='bcode'>
+ * 	<jc>// Look up a property in the following order:
+ * 	// 1) MYPROPERTY environment variable.
+ * 	// 2) 'my.property' system property if environment variable not found.
+ * 	// 3) 'not found' string if system property not found.</jc>
+ * 	String myproperty = StringVarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"$E{MYPROPERTY,$S{my.property,not found}}"</js>);
+ * </p>
+ * <p>
+ * Resolved variables can also contain variables.
+ * <p class='bcode'>
+ * 	<jc>// If MYPROPERTY is "$S{my.property}", and the system property "my.property" is "foo",
+ * 	// then the following resolves to "foo".</jc>
+ * 	String myproperty = StringVarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"$E{MYPROPERTY}"</js>);
+ * </p>
+ * <p>
+ * <h6 class='topic'>Other notes:</h6>
+ * <ul class='spaced-list'>
+ * 	<li>The escape character <js>'\'</js> can be used when necessary to escape the following characters: <code>$ , { }</code>
+ * 	<li><b>WARNING:</b>  It is possible to cause {@link StackOverflowError StackOverflowErrors} if your nested variables result in
+ * 		a recursive loop (e.g. the environment variable <code>'MYPROPERTY'</code> has the value <code>'$E{MYPROPERTY}'</code>).
+ * 		So don't do that!
+ * 	<li>As a general rule, this class tries to be as efficient as possible by not creating new strings when not needed.<br>
+ * 		For example, calling the resolve method on a string that doesn't contain variables (e.g. <code>resolver.resolve(<js>"foobar"</js>)</code>)
+ * 		will simply be a no-op and return the same string.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class StringVarResolver {
+
+	/**
+	 * Default string variable resolver with support for system properties and environment variables:
+	 * <p>
+	 * <ul>
+	 * 	<li><code>$S{key}</code>,<code>$S{key,default}</code> - System properties.
+	 * 	<li><code>$E{key}</code>,<code>$E{key,default}</code> - Environment variables.
+	 * </ul>
+	 */
+	public static final StringVarResolver DEFAULT = new StringVarResolver()
+		// System properties.
+		.addVar("S", new StringVarWithDefault() {
+			@Override /* StringVar */
+			public String resolve(String varVal) {
+				return System.getProperty(varVal);
+			}
+		})
+		// Environment variables.
+		.addVar("E", new StringVarWithDefault() {
+			@Override /* StringVar */
+			public String resolve(String varVal) {
+				return System.getenv(varVal);
+			}
+		})
+	;
+
+	// Map of Vars added through addVar() method.
+	private Map<String,StringVar> varMap = new TreeMap<String,StringVar>();
+
+	private StringVarResolver parent;
+
+	/**
+	 * Construct an empty var resolver.
+	 */
+	public StringVarResolver() {}
+
+	/**
+	 * Construct an empty var resolver with the specified parent.
+	 *
+	 * @param parent The parent string variable resolver.  Can be <jk>null</jk>.
+	 */
+	public StringVarResolver(StringVarResolver parent) {
+		this.parent = parent;
+	}
+
+	/**
+	 * Register a new variable with this resolver.
+	 *
+	 * @param varName The variable name (e.g. <js>"X"</js> resolves <js>"$X{...}"</js> variables).
+	 * @param v The variable resolver.
+	 * @return This object (for method chaining).
+	 */
+	public StringVarResolver addVar(String varName, StringVar v) {
+		assertFieldNotNull(v, "v");
+
+		// Need to make sure only ASCII characters are used.
+		for (int i = 0; i < varName.length(); i++) {
+			char c = varName.charAt(i);
+			if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a'))
+				illegalArg("Invalid var name.  Must consist of only uppercase and lowercase ASCII letters.");
+		}
+		varMap.put(varName, v);
+		return this;
+	}
+
+	/**
+	 * Resolve all variables in the specified string.
+	 *
+	 * @param s The string to resolve variables in.
+	 * @return The new string with all variables resolved, or the same string if no variables were found.
+	 * 	Null input results in a blank string.
+	 */
+	public String resolve(String s) {
+
+		if (s == null)
+			return "";
+		if (s.indexOf('$') == -1 && s.indexOf('\\') == -1)
+			return s;
+
+		// Special case where value consists of a single variable with no embedded variables (e.g. "$X{...}").
+		// This is a common case, so we want an optimized solution that doesn't involve string builders.
+		if (isSimpleVar(s)) {
+			String var = s.substring(1, s.indexOf('{'));
+			String val = s.substring(s.indexOf('{')+1, s.length()-1);
+			StringVar v = getVar(var);
+			if (v != null) {
+				s = v.doResolve(val);
+				return resolve(s);
+			}
+			return s;
+		}
+
+		try {
+			return writeTo(s, new StringWriter()).toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e); // Never happens.
+		}
+	}
+
+	/**
+	 * Checks to see if string is of the simple form "$X{...}" with no embedded variables.
+	 * This is a common case, and we can avoid using StringWriters.
+	 */
+	private boolean isSimpleVar(String s) {
+		int S1 = 1;	   // Not in variable, looking for $
+		int S2 = 2;    // Found $, Looking for {
+		int S3 = 3;    // Found {, Looking for }
+		int S4 = 4;    // Found }
+
+		int length = s.length();
+		int state = S1;
+		for (int i = 0; i < length; i++) {
+			char c = s.charAt(i);
+			if (state == S1) {
+				if (c == '$') {
+					state = S2;
+				} else {
+					return false;
+				}
+			} else if (state == S2) {
+				if (c == '{') {
+					state = S3;
+				} else if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a')) {   // False trigger "$X "
+					return false;
+				}
+			} else if (state == S3) {
+				if (c == '}')
+					state = S4;
+				else if (c == '{' || c == '$')
+					return false;
+			} else if (state == S4) {
+				return false;
+			}
+		}
+		return state == S4;
+	}
+
+	/**
+	 * Resolves variables in the specified string and sends the output to the specified writer.
+	 * More efficient than first parsing to a string and then serializing to the writer since this
+	 * method doesn't need to construct a large string.
+	 *
+	 * @param s The string to resolve variables in.
+	 * @param out The writer to write to.
+	 * @return The same writer.
+	 * @throws IOException
+	 */
+	public Writer writeTo(String s, Writer out) throws IOException {
+
+		int S1 = 1;	   // Not in variable, looking for $
+		int S2 = 2;    // Found $, Looking for {
+		int S3 = 3;    // Found {, Looking for }
+
+		int state = S1;
+		boolean isInEscape = false;
+		boolean hasInternalVar = false;
+		boolean hasInnerEscapes = false;
+		String varType = null;
+		String varVal = null;
+		int x = 0, x2 = 0;
+		int depth = 0;
+		int length = s.length();
+		for (int i = 0; i < length; i++) {
+			char c = s.charAt(i);
+			if (state == S1) {
+				if (isInEscape) {
+					if (c == '\\' || c == '$') {
+						out.append(c);
+					} else {
+						out.append('\\').append(c);
+					}
+					isInEscape = false;
+				} else if (c == '\\') {
+					isInEscape = true;
+				} else if (c == '$') {
+					x = i;
+					x2 = i;
+					state = S2;
+				} else {
+					out.append(c);
+				}
+			} else if (state == S2) {
+				if (isInEscape) {
+					isInEscape = false;
+				} else if (c == '\\') {
+					hasInnerEscapes = true;
+					isInEscape = true;
+				} else if (c == '{') {
+					varType = s.substring(x+1, i);
+					x = i;
+					state = S3;
+				} else if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a')) {  // False trigger "$X "
+					if (hasInnerEscapes)
+						out.append(unEscapeChars(s.substring(x, i+1), new char[]{'\\','{'}));
+					else
+						out.append(s, x, i+1);
+					x = i + 1;
+					state = S1;
+					hasInnerEscapes = false;
+				}
+			} else if (state == S3) {
+				if (isInEscape) {
+					isInEscape = false;
+				} else if (c == '\\') {
+					isInEscape = true;
+					hasInnerEscapes = true;
+				} else if (c == '{') {
+					depth++;
+					hasInternalVar = true;
+				} else if (c == '}') {
+					if (depth > 0) {
+						depth--;
+					} else {
+						varVal = s.substring(x+1, i);
+						varVal = (hasInternalVar ? resolve(varVal) : varVal);
+						StringVar r = getVar(varType);
+						if (r == null) {
+							if (hasInnerEscapes)
+								out.append(unEscapeChars(s.substring(x2, i+1), new char[]{'\\','$','{','}'}));
+							else
+								out.append(s, x2, i+1);
+							x = i+1;
+						} else {
+							String replacement = r.doResolve(varVal);
+							if (replacement == null)
+								replacement = "";
+							// If the replacement also contains variables, replace them now.
+							if (replacement.indexOf('$') != -1)
+								replacement = resolve(replacement);
+							out.append(replacement);
+							x = i+1;
+						}
+						state = 1;
+						hasInnerEscapes = false;
+					}
+				}
+			}
+		}
+		if (isInEscape)
+			out.append("\\");
+		else if (state == S2)
+			out.append("$").append(unEscapeChars(s.substring(x+1), new char[]{'{', '\\'}));
+		else if (state == S3)
+			out.append("$").append(varType).append('{').append(unEscapeChars(s.substring(x+1), new char[]{'\\','$','{','}'}));
+		return out;
+	}
+
+	private StringVar getVar(String varType) {
+		StringVar v = varMap.get(varType);
+		if (v == null && parent != null)
+			v = parent.getVar(varType);
+		return v;
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class
new file mode 100755
index 0000000..901efeb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
new file mode 100755
index 0000000..e1f63eb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+
+/**
+ * Interface for the resolution of string vars with a default value if the <code>resolve(String)</code> method returns <jk>null</jk>.
+ * <p>
+ * For example, to resolve the system property <js>"myProperty"</js> but resolve to <js>"not found"</js> if the property doesn't exist:
+ * <js>"$S{myProperty,not found}"</js>
+ */
+public abstract class StringVarWithDefault extends StringVar {
+
+	@Override /* StringVar*/
+	public String doResolve(String s) {
+		int i = s.indexOf(',');
+		if (i == -1)
+			return resolve(s);
+		String[] s2 = StringUtils.split(s, ',');
+		String v = resolve(s2[0]);
+		if (v == null)
+			v = s2[1];
+		return v;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class
new file mode 100755
index 0000000..6ca8b6e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class
new file mode 100755
index 0000000..d759a42
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class
new file mode 100755
index 0000000..edffdca
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class differ


[09/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.java
new file mode 100755
index 0000000..e4894df
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.java
@@ -0,0 +1,515 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.urlencoding.UonSerializerProperties.*;
+import static com.ibm.juno.core.urlencoding.UrlEncodingProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.net.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Serializes POJO models to URL-encoded notation with UON-encoded values (a notation for URL-encoded query paramter values).
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>application/x-www-form-urlencoded</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>application/x-www-form-urlencoded</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This serializer provides several serialization options.  Typically, one of the predefined DEFAULT serializers will be sufficient.
+ * 	However, custom serializers can be constructed to fine-tune behavior.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link UonSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ * <p>
+ * 	The following shows a sample object defined in Javascript:
+ * </p>
+ * <p class='bcode'>
+ * 	{
+ * 		id: 1,
+ * 		name: <js>'John Smith'</js>,
+ * 		uri: <js>'http://sample/addressBook/person/1'</js>,
+ * 		addressBookUri: <js>'http://sample/addressBook'</js>,
+ * 		birthDate: <js>'1946-08-12T00:00:00Z'</js>,
+ * 		otherIds: <jk>null</jk>,
+ * 		addresses: [
+ * 			{
+ * 				uri: <js>'http://sample/addressBook/address/1'</js>,
+ * 				personUri: <js>'http://sample/addressBook/person/1'</js>,
+ * 				id: 1,
+ * 				street: <js>'100 Main Street'</js>,
+ * 				city: <js>'Anywhereville'</js>,
+ * 				state: <js>'NY'</js>,
+ * 				zip: 12345,
+ * 				isCurrent: <jk>true</jk>,
+ * 			}
+ * 		]
+ * 	}
+ * </p>
+ * <p>
+ * 	Using the "strict" syntax defined in this document, the equivalent
+ * 		URL-encoded notation would be as follows:
+ * </p>
+ * <p class='bcode'>
+ * 	<xa>id</xa>=$n(<xs>1</xs>)
+ * 	&amp;<xa>name</xa>=<xs>John+Smith</xs>,
+ * 	&amp;<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 	&amp;<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+ * 	&amp;<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+ * 	&amp;<xa>otherIds</xa>=<xs>%00</xs>,
+ * 	&amp;<xa>addresses</xa>=$a(
+ * 		$o(
+ * 			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
+ * 			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 			<xa>id</xa>=$n(<xs>1</xs>),
+ * 			<xa>street</xa>=<xs>100+Main+Street</xs>,
+ * 			<xa>city</xa>=<xs>Anywhereville</xs>,
+ * 			<xa>state</xa>=<xs>NY</xs>,
+ * 			<xa>zip</xa>=$n(<xs>12345</xs>),
+ * 			<xa>isCurrent</xa>=$b(<xs>true</xs>)
+ * 		)
+ * 	)
+ * </p>
+ * <p>
+ * 	A secondary "lax" syntax is available when the data type of the
+ * 		values are already known on the receiving end of the transmission:
+ * </p>
+ * <p class='bcode'>
+ * 	<xa>id</xa>=<xs>1</xs>,
+ * 	&amp;<xa>name</xa>=<xs>John+Smith</xs>,
+ * 	&amp;<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 	&amp;<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+ * 	&amp;<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+ * 	&amp;<xa>otherIds</xa>=<xs>%00</xs>,
+ * 	&amp;<xa>addresses</xa>=(
+ * 		(
+ * 			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
+ * 			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 			<xa>id</xa>=<xs>1</xs>,
+ * 			<xa>street</xa>=<xs>100+Main+Street</xs>,
+ * 			<xa>city</xa>=<xs>Anywhereville</xs>,
+ * 			<xa>state</xa>=<xs>NY</xs>,
+ * 			<xa>zip</xa>=<xs>12345</xs>,
+ * 			<xa>isCurrent</xa>=<xs>true</xs>
+ * 		)
+ * 	)
+ * </p>
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Serialize a Map</jc>
+ * 	Map m = <jk>new</jk> ObjectMap(<js>"{a:'b',c:1,d:false,e:['f',1,false],g:{h:'i'}}"</js>);
+ *
+ * 	<jc>// Serialize to value equivalent to JSON.</jc>
+ * 	<jc>// Produces "a=b&amp;c=$n(1)&amp;d=$b(false)&amp;e=$a(f,$n(1),$b(false))&amp;g=$o(h=i)"</jc>
+ * 	String s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(s);
+ *
+ * 	<jc>// Serialize to simplified value (for when data type is already known by receiver).</jc>
+ * 	<jc>// Produces "a=b&amp;c=1&amp;d=false&amp;e=(f,1,false)&amp;g=(h=i))"</jc>
+ * 	String s = UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
+ *
+ * 	<jc>// Serialize a bean</jc>
+ * 	<jk>public class</jk> Person {
+ * 		<jk>public</jk> Person(String s);
+ * 		<jk>public</jk> String getName();
+ * 		<jk>public int</jk> getAge();
+ * 		<jk>public</jk> Address getAddress();
+ * 		<jk>public boolean</jk> deceased;
+ * 	}
+ *
+ * 	<jk>public class</jk> Address {
+ * 		<jk>public</jk> String getStreet();
+ * 		<jk>public</jk> String getCity();
+ * 		<jk>public</jk> String getState();
+ * 		<jk>public int</jk> getZip();
+ * 	}
+ *
+ * 	Person p = <jk>new</jk> Person(<js>"John Doe"</js>, 23, <js>"123 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12345, <jk>false</jk>);
+ *
+ * 	<jc>// Produces "name=John+Doe&amp;age=23&amp;address=$o(street=123+Main+St,city=Anywhere,state=NY,zip=$n(12345))&amp;deceased=$b(false)"</jc>
+ * 	String s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(s);
+ *
+ * 	<jc>// Produces "name=John+Doe&amp;age=23&amp;address=(street=123+Main+St,city=Anywhere,state=NY,zip=12345)&amp;deceased=false)"</jc>
+ * 	String s = UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("application/x-www-form-urlencoded")
+@SuppressWarnings("hiding")
+public class UrlEncodingSerializer extends UonSerializer {
+
+	/** Reusable instance of {@link UrlEncodingSerializer}, all default settings. */
+	public static final UrlEncodingSerializer DEFAULT = new UrlEncodingSerializer().lock();
+
+	/** Reusable instance of {@link UrlEncodingSerializer.Simple}. */
+	public static final UrlEncodingSerializer DEFAULT_SIMPLE = new Simple().lock();
+
+	/** Reusable instance of {@link UrlEncodingSerializer.SimpleExpanded}. */
+	public static final UrlEncodingSerializer DEFAULT_SIMPLE_EXPANDED = new SimpleExpanded().lock();
+
+	/** Reusable instance of {@link UrlEncodingSerializer.Readable}. */
+	public static final UrlEncodingSerializer DEFAULT_READABLE = new Readable().lock();
+
+	/**
+	 * Constructor.
+	 */
+	public UrlEncodingSerializer() {
+		setProperty(UON_encodeChars, true);
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UrlEncodingSerializer().setProperty(UonSerializerProperties.<jsf>UON_simpleMode</jsf>,<jk>true</jk>);</code>.
+	 */
+	@Produces(value={"application/x-www-form-urlencoded-simple"},contentType="application/x-www-form-urlencoded")
+	public static class Simple extends UrlEncodingSerializer {
+		/** Constructor */
+		public Simple() {
+			setProperty(UON_simpleMode, true);
+		}
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UrlEncodingSerializer().setProperty(UonSerializerProperties.<jsf>UON_simpleMode</jsf>,<jk>true</jk>).setProperty(UonSerializerProperties.<jsf>URLENC_expandedParams</jsf>,<jk>true</jk>);</code>.
+	 */
+	@Produces(value={"application/x-www-form-urlencoded-simple"},contentType="application/x-www-form-urlencoded")
+	public static class SimpleExpanded extends Simple {
+		/** Constructor */
+		public SimpleExpanded() {
+			setProperty(URLENC_expandedParams, true);
+		}
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UrlEncodingSerializer().setProperty(UonSerializerProperties.<jsf>UON_useWhitespace</jsf>,<jk>true</jk>);</code>.
+	 */
+	public static class Readable extends UrlEncodingSerializer {
+		/** Constructor */
+		public Readable() {
+			setProperty(UON_useWhitespace, true);
+		}
+	}
+
+	/**
+	 * Workhorse method. Determines the type of object, and then calls the
+	 * appropriate type-specific serialization method.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private SerializerWriter serializeAnything(UonSerializerWriter out, Object o, UonSerializerContext ctx) throws SerializeException {
+		try {
+
+			BeanContext bc = ctx.getBeanContext();
+
+			boolean addClassAttr;		// Add "_class" attribute to element?
+			ClassMeta<?> aType;			// The actual type
+			ClassMeta<?> gType;			// The generic type
+
+			aType = ctx.push("root", o, object());
+			ctx.indent--;
+			if (aType == null)
+				aType = object();
+
+			gType = aType.getFilteredClassMeta();
+			addClassAttr = (ctx.isAddClassAttrs());
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();				// The filter
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+
+			if (gType.isMap()) {
+				if (o instanceof BeanMap)
+					serializeBeanMap(out, (BeanMap)o, addClassAttr, ctx);
+				else
+					serializeMap(out, (Map)o, gType, ctx);
+			} else if (gType.hasToObjectMapMethod()) {
+				serializeMap(out, gType.toObjectMap(o), gType, ctx);
+			} else if (gType.isBean()) {
+				serializeBeanMap(out, bc.forBean(o), addClassAttr, ctx);
+			} else if (gType.isCollection()) {
+				serializeMap(out, getCollectionMap((Collection)o), bc.getMapClassMeta(Map.class, Integer.class, gType.getElementType()), ctx);
+			} else {
+				// All other types can't be serialized as key/value pairs, so we create a
+				// mock key/value pair with a "_value" key.
+				out.append("_value=");
+				super.serializeAnything(out, o, null, ctx, null, null, false, true);
+			}
+
+			ctx.pop();
+			return out;
+		} catch (SerializeException e) {
+			throw e;
+		} catch (StackOverflowError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new SerializeException("Exception occurred trying to process object of type ''{0}''", (o == null ? null : o.getClass().getName())).initCause(e);
+		}
+	}
+
+	private Map<Integer,Object> getCollectionMap(Collection<?> c) {
+		Map<Integer,Object> m = new TreeMap<Integer,Object>();
+		int i = 0;
+		for (Object o : c)
+			m.put(i++, o);
+		return m;
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private SerializerWriter serializeMap(UonSerializerWriter out, Map m, ClassMeta<?> type, UonSerializerContext ctx) throws IOException, SerializeException {
+
+		m = sort(ctx, m);
+
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		int depth = ctx.getIndent();
+		boolean addAmp = false;
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		while (mapEntries.hasNext()) {
+			Map.Entry e = (Map.Entry) mapEntries.next();
+			Object value = e.getValue();
+			Object key = generalize(ctx, e.getKey(), keyType);
+
+
+			if (shouldUseExpandedParams(value, ctx)) {
+				Iterator i = value instanceof Collection ? ((Collection)value).iterator() : ArrayUtils.iterator(value);
+				while (i.hasNext()) {
+					if (addAmp)
+						out.cr(depth).append('&');
+					out.appendObject(key, false, true, true).append('=');
+					super.serializeAnything(out, i.next(), null, ctx, (key == null ? null : key.toString()), null, false, true);
+					addAmp = true;
+				}
+			} else {
+				if (addAmp)
+					out.cr(depth).append('&');
+			out.appendObject(key, false, true, true).append('=');
+			super.serializeAnything(out, value, valueType, ctx, (key == null ? null : key.toString()), null, false, true);
+				addAmp = true;
+			}
+		}
+
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private SerializerWriter serializeBeanMap(UonSerializerWriter out, BeanMap m, boolean addClassAttr, UonSerializerContext ctx) throws IOException, SerializeException {
+		int depth = ctx.getIndent();
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		// Print out "_class" attribute on this bean if required.
+		if (addClassAttr) {
+			String attr = "_class";
+			out.appendObject(attr, false, false, true).append('=').append(m.getClassMeta().getInnerClass().getName());
+			if (mapEntries.hasNext())
+				out.cr(depth).append('&');
+		}
+
+		boolean addAmp = false;
+
+		while (mapEntries.hasNext()) {
+			BeanMapEntry p = (BeanMapEntry)mapEntries.next();
+			BeanPropertyMeta pMeta = p.getMeta();
+
+			String key = p.getKey();
+			Object value = null;
+			try {
+				value = p.getValue();
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+
+			if (canIgnoreValue(ctx, pMeta.getClassMeta(), key, value))
+				continue;
+
+			if (value != null && shouldUseExpandedParams(pMeta, ctx)) {
+				ClassMeta cm = pMeta.getClassMeta();
+				// Filtered object array bean properties may be filtered resulting in ArrayLists,
+				// so we need to check type if we think it's an array.
+				Iterator i = (cm.isCollection() || value instanceof Collection) ? ((Collection)value).iterator() : ArrayUtils.iterator(value);
+				while (i.hasNext()) {
+					if (addAmp)
+						out.cr(depth).append('&');
+
+					out.appendObject(key, false, true, true).append('=');
+
+					super.serializeAnything(out, i.next(), pMeta.getClassMeta().getElementType(), ctx, key, pMeta, false, true);
+
+					addAmp = true;
+				}
+			} else {
+				if (addAmp)
+					out.cr(depth).append('&');
+
+				out.appendObject(key, false, true, true).append('=');
+
+				super.serializeAnything(out, value, pMeta.getClassMeta(), ctx, key, pMeta, false, true);
+
+				addAmp = true;
+			}
+
+		}
+		return out;
+	}
+
+	/**
+	 * Returns true if the specified bean property should be expanded as multiple key-value pairs.
+	 */
+	private final boolean shouldUseExpandedParams(BeanPropertyMeta<?> pMeta, UonSerializerContext ctx) {
+		ClassMeta<?> cm = pMeta.getClassMeta();
+		if (cm.isArray() || cm.isCollection()) {
+			if (ctx.isExpandedParams())
+				return true;
+			if (pMeta.getBeanMeta().getClassMeta().getUrlEncodingMeta().isExpandedParams())
+				return true;
+		}
+		return false;
+	}
+
+	private final boolean shouldUseExpandedParams(Object value, UonSerializerContext ctx) {
+		if (value == null)
+			return false;
+		ClassMeta<?> cm = ctx.getBeanContext().getClassMetaForObject(value).getFilteredClassMeta();
+		if (cm.isArray() || cm.isCollection()) {
+			if (ctx.isExpandedParams())
+				return true;
+		}
+		return false;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Methods for constructing individual parameter values.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Converts the specified object to a string using this serializers {@link BeanContext#convertToType(Object, Class)} method
+	 * 	and runs {@link URLEncoder#encode(String,String)} against the results.
+	 * Useful for constructing URL parts.
+	 *
+	 * @param o The object to serialize.
+	 * @return The serialized object.
+	 */
+	public String serializeUrlPart(Object o) {
+		try {
+			// Shortcut for simple types.
+			ClassMeta<?> cm = getBeanContext().getClassMetaForObject(o);
+			if (cm != null)
+				if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
+					return o.toString();
+
+			UonSerializerContext uctx = createContext(null, null);
+			StringWriter w = new StringWriter();
+			super.doSerialize(o, w, uctx);
+			return w.toString();
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	public UonSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new UonSerializerContext(getBeanContext(), sp, usp, uep, properties, javaMethod);
+	}
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		UonSerializerContext uctx = (UonSerializerContext)ctx;
+		serializeAnything(uctx.getWriter(out), o, uctx);
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingSerializer setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! usp.setProperty(property, value))
+			if (! uep.setProperty(property, value))
+				super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> UrlEncodingSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UrlEncodingSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UrlEncodingSerializer clone() {
+		UrlEncodingSerializer c = (UrlEncodingSerializer)super.clone();
+		c.usp = usp.clone();
+		c.uep = uep.clone();
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.class
new file mode 100755
index 0000000..84e2638
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.java
new file mode 100755
index 0000000..d0870ad
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/UrlEncoding.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.urlencoding.*;
+
+/**
+ * Annotation that can be applied to classes, fields, and methods to tweak how
+ * they are handled by {@link UrlEncodingSerializer} and {@link UrlEncodingParser}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface UrlEncoding {
+
+	/**
+	 * When true, bean properties of type array or Collection will be expanded into multiple key=value pairings.
+	 * <p>
+	 * This annotation is identical in behavior to using the {@link UrlEncodingProperties#URLENC_expandedParams} 
+	 * property, but applies to only instances of this bean.  
+	 */
+	boolean expandedParams() default false;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/package.html
new file mode 100755
index 0000000..806eadb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2015 All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>URL-Encoding annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_HTML.png
new file mode 100755
index 0000000..ab74763
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_UrlEncoding.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_UrlEncoding.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_UrlEncoding.png
new file mode 100755
index 0000000..34de8a7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/Example_UrlEncoding.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/rfc_uon.txt
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/rfc_uon.txt b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/rfc_uon.txt
new file mode 100755
index 0000000..c79c9c5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/doc-files/rfc_uon.txt
@@ -0,0 +1,352 @@
+Network Working Group                                          J. Bognar
+Request for Comments: 9999                                     C. Chaney  
+Category: Informational                                              IBM
+                                                                Jan 2014
+
+                            ***DRAFT***
+               URI Object Notation (UON): Generic Syntax
+
+
+About this document
+
+   This memo provides information for the Internet community.  It does
+   not specify an Internet standard of any kind.  Distribution of this
+   memo is unlimited.
+
+Copyright Notice
+
+   Copyright (C) IBM Corp. 2014.  All Rights Reserved.
+
+Abstract
+
+   This document describes a grammar that builds upon RFC2396
+   (Uniform Resource Identifiers).  Its purpose is to define a 
+   generalized object notation for URI query parameter values similar in 
+   concept to Javascript Object Notation (RFC4627).  The goal is a 
+   syntax such that any data structure defined in JSON can be losslessly 
+   defined in an equivalent URI-based grammar, yet be fully compliant 
+   with the RFC2396 specification. 
+
+   This grammar provides the ability to construct the following data 
+   structures in URL parameter values: 
+	
+      OBJECT
+      ARRAY
+      NUMBER
+      BOOLEAN
+      STRING
+      NULL
+
+   Example:
+
+      The following shows a sample object defined in Javascript:
+
+         var x = { 
+            id: 1, 
+            name: 'John Smith', 
+            uri: 'http://sample/addressBook/person/1', 
+            addressBookUri: 'http://sample/addressBook', 
+            birthDate: '1946-08-12T00:00:00Z', 
+            otherIds: null,
+            addresses: [ 
+               { 
+                  uri: 'http://sample/addressBook/address/1', 
+                  personUri: 'http://sample/addressBook/person/1', 
+                  id: 1, 
+                  street: '100 Main Street', 
+                  city: 'Anywhereville', 
+                  state: 'NY', 
+                  zip: 12345, 
+                  isCurrent: true,
+               } 
+            ] 
+         } 
+
+      Using the "strict" syntax defined in this document, the equivalent 
+      UON notation would be as follows:
+
+         x=$o(id=$n(1),name=John+Smith,uri=http://sample/
+         addressBook/person/1,addressBookUri=http://sample/
+         addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=%00,
+         addresses=$a($o(uri=http://sample/addressBook/
+         address/1,personUri=http://sample/addressBook/
+         person/1,id=$n(1),street=100+Main+Street,city=
+         Anywhereville,state=NY,zip=$n(12345),isCurrent=$b(true)))) 
+
+      A secondary "lax" syntax is available when the data type of the
+      values are already known on the receiving end of the transmission:
+
+         x=(id=1,name=John+Smith,uri=http://sample/
+         addressBook/person/1,addressBookUri=http://sample/
+         addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=%00,
+         addresses=((uri=http://sample/addressBook/
+         address/1,personUri=http://sample/addressBook/
+         person/1,id=1,street=100+Main+Street,city=
+         Anywhereville,state=NY,zip=12345,isCurrent=true))) 
+
+      Values represented in strict mode can be losslessly converted
+      back and forth into a JSON model without any additional
+      information.  Values represented in lax mode cannot.
+
+1. Language constraints
+
+   The grammar syntax is constrained to usage of characters allowed by 
+      URI notation:
+
+      uric       = reserved | unreserved | escaped
+      reserved   = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
+                   "$" | ","
+      unreserved = alphanum | mark
+      mark       = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
+
+   In particular, the URI specification disallows the following 
+   characters in unencoded form:
+
+      unwise     = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
+      delims     = "<" | ">" | "#" | "%" | <">
+
+   The exclusion of {} and [] characters eliminates the possibility of 
+   using JSON as parameter values.
+
+
+2. Grammar constructs
+
+   The grammar consists of the following language constructs:
+   
+      Objects - Values consisting of one or more child name/value pairs.
+      Arrays - Values consisting of zero or more child values.
+      Booleans - Values consisting of true/false values.
+      Numbers - Decimal and floating point values.
+      Strings - Everything else.
+
+2.1. Objects 
+
+   Objects are values consisting of one or more child name/value pairs.
+   The $o() construct is used to define an object.
+
+   Example:  A simple map with two key/value pairs:
+
+      a1=$o(b1=x1,b2=x2)
+
+   Example:  A nested map:
+   
+      a1=$o(b1=$o(c1=x1,c2=x2))
+
+   When the data type is already known to be an object on the receiving 
+   end, then the type flag can be removed from the construct to produce
+   a simplified value. 
+
+   Example:  A nested map using "lax" syntax:
+
+     a1=(b1=(c1=x1,c2=x2))
+
+2.2. Arrays
+
+   Arrays are values consisting of zero or more child values.
+   The $a() construct is used to define an array.
+
+   Example:  An array of two string values:
+
+      a1=$a(x1,x2)
+
+   Example:  A 2-dimensional array:
+
+      a1=$a($a(x1,x2),$a(x3,x4))
+
+   Example:  An array of objects:
+
+      a1=$a($o(b1=x1,b2=x2),$o(c1=x1,c2=x2))
+
+   When the data type is already known to be an array on the receiving 
+   end, then the type flag can be removed from the construct to produce
+   a simplified value. 
+   
+   Example:  An array of objects using "lax" syntax:
+
+      a1=((b1=x1,b2=x2),(c1=x1,c2=x2))
+
+2.3. Booleans
+
+   Booleans are values that can only take on values "true" or "false".  
+   The $b() construct is used to define a boolean.
+   
+   Example:  Two boolean values:
+
+      a1=$b(true)&a2=$b(false)
+   
+   When the data type is already known to be a boolean on the receiving 
+   end, then the type flag and parentheses can be removed from the 
+   construct to produce a simplified value. 
+
+   Example:  Two boolean values using "lax" syntax:
+
+      a1=true&a2=false
+
+2.4. Numbers
+
+   The $n() construct is used to define a number.
+   Both decimal and float numbers are supported.
+   
+   Example:  Two numerical values, one decimal and one float:
+
+      a1=$n(123)&a2=$n(1.23e1)
+
+   When the data type is already known to be a number on the receiving 
+   end, then the type flag and parentheses can be removed from the 
+   construct to produce a simplified value. 
+   
+   Example:  Two numerical values using "lax" syntax:
+
+      a1=123&a2=1.23e1
+
+2.5. Strings
+
+   Anything not conforming to one of the constructs described above 
+   are treated as simple strings.  
+   
+   Example:  A simple string value:
+
+      a1=foobar
+   
+   The tilde character (~) is used for escaping characters to prevent 
+   them from being confused with syntax characters.  
+
+   The following characters must be escaped in string literals:  
+
+      $ , ( ) ~ =
+   
+   For example, the string literal "$o(b1=x)" should be 
+   represented as follows:
+
+      a1=~$o~(b1~=x~)
+   
+   In addition, strings can optionally be enclosed in parentheses
+   when needed to handle ambiguous cases.
+   
+   The following two values are equivalent:
+   
+      a1=foobar
+      a1=(foobar)
+      
+   Using parentheses, the following construct can be used to represent
+   an empty string:
+   
+      a1=()
+   
+   The purpose for this is to handle a potential ambiguity in the 
+   representation of an empty array ([]) vs. an array containing one
+   empty string ([""]).  An array containing one empty string is 
+   represented as follows:
+
+      a1=$a(())
+
+   Without this construct, there would not be a way to tell the 
+   difference between an empty array and an array containing an empty    
+   string:
+
+      a1=$a()
+
+   Note that an array consisting of two empty strings does not suffer 
+   from this ambiguity, and the use of parenthesis is optional in 
+   this case: 
+
+      a1=$a(,)
+
+2.7. Null values
+
+   Nulls are represented by ASCII '0' as an escaped hex sequence:
+
+      a1=%00
+
+   Note that a string consisting of a single null character can be 
+   represented with the following construct:
+
+      a1=(%00)
+
+2.8. Top-level attribute names
+
+   Top-level attribute names (e.g. "a1" in "&a1=foobar") are treated
+   as strings but for one exception.  The '=' character must be
+   encoded so as not to be confused as a key/value separator.
+   Note that the '=' character must also be escaped per the UON
+   notation.
+   
+   For example, the UON equivalent of {"a=b":"a=b"} constructed as
+   a top-level query parameter string would be as follows:
+   
+      a~%3Db=a~=b
+      
+   Note that the '=' character is encoded in the attribute name,
+   but it is not necessary to have it encoded in the attribute value.
+
+2.9. URL-encoded characters
+
+   UON notation allows for any character, even UON grammar
+   characters, to be URL-encoded.
+   
+   The following query strings are fully equivalent in structure:
+   
+     a1=$o(b1=x1,b2=x2)
+     %61%31=%24%6F%28%62%31%3D%78%31%2C%62%32%3D%78%32%29
+
+
+3. BNF
+
+   The following BNF describes the syntax for top-level URI query 
+   parameter values (e.g. ?<attrname>=<value>).
+
+   attrname    = (string | null)
+   value       = (var | string | null)
+
+   string      = ("(" litchar* ")") | litchar*
+   null        = "%00"
+   
+   var         = ovar | avar | nvar | bvar
+   ovar        = ovar_strict | ovar_lax
+   avar        = avar_strict | avar_lax
+   nvar        = nvar_strict | nvar_lax
+   bvar        = bvar_strict | bvar_lax
+   ovar_strict = "$o(" [pairs] ")"
+   ovar_lax    =   "(" [pairs] ")"
+   avar_strict = "$a(" [values] ")"
+   avar_lax    =   "(" [values] ")"
+   nvar_strict = "$n(" number ")"
+   nvar_lax    =       number
+   bvar_strict = "$b(" boolean ")" 
+   bvar_lax    =       boolean
+
+   pairs       = pair ["," pairs]
+   pair        = key "=" value	
+   values      = value ["," values]
+   key         = (string | null)
+   boolean     = "true" | "false"
+
+   escape_seq  = "~" escaped
+   encode_seq  = "%" digithex digithex
+
+   number      = [-] (decimal | float) [exp]
+   decimal     = "0" | (digit19 digit*)
+   float       = decimal "." digit+
+   exp         = "e" [("+" | "-")] digit+
+
+   litchar     = unencoded | encode_seq | escape_seq
+   escaped     = "$" | "," | "(" | ")" | "~" | "=" 
+   unencoded   = alpha | digit | 
+                 ";" | "/" | "?" | ":" | "@" |
+                 "-" | "_" | "." | "!" | "*" | "'" 
+   alpha       = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
+                 "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
+                 "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" |
+                 "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |             
+                 "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
+                 "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
+   digit       = "0" | digit19
+   digit19     = "1" | "2" | "3" | "4" | "5" | "6" | "7" |
+                 "8" | "9"
+   digithex    = digit | 
+                 "A" | "B" | "C" | "D" | "E" | "F" |
+                 "a" | "b" | "c" | "d" | "e" | "f"
+
+
+
+


[33/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils.class
new file mode 100755
index 0000000..6a953e5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IdentityList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IdentityList.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IdentityList.class
new file mode 100755
index 0000000..3331e29
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IdentityList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_KeywordStore.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_KeywordStore.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_KeywordStore.class
new file mode 100755
index 0000000..58f45a5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_KeywordStore.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiIterable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiIterable.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiIterable.class
new file mode 100755
index 0000000..f21bb91
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiIterable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiSet.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiSet.class
new file mode 100755
index 0000000..6da79a2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_MultiSet.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ParserReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ParserReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ParserReader.class
new file mode 100755
index 0000000..4fece88
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ParserReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoIntrospector.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoIntrospector.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoIntrospector.class
new file mode 100755
index 0000000..163bbc1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoIntrospector.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$1.class
new file mode 100755
index 0000000..4a096a0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$2.class
new file mode 100755
index 0000000..6e724f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$3.class
new file mode 100755
index 0000000..7389626
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$4.class
new file mode 100755
index 0000000..332e19d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$5.class
new file mode 100755
index 0000000..ae69b4f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$A.class
new file mode 100755
index 0000000..4c62a2d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$B.class
new file mode 100755
index 0000000..c9fb6fb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$C.class
new file mode 100755
index 0000000..1a0c754
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D1.class
new file mode 100755
index 0000000..ecda42e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D2.class
new file mode 100755
index 0000000..082d3d1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$E.class
new file mode 100755
index 0000000..c0f2b25
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1$1.class
new file mode 100755
index 0000000..079b6f1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1.class
new file mode 100755
index 0000000..f17cd3c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F2.class
new file mode 100755
index 0000000..343670c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$F2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$G.class
new file mode 100755
index 0000000..7e055aa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1$1.class
new file mode 100755
index 0000000..e12a858
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1.class
new file mode 100755
index 0000000..1b77067
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H2.class
new file mode 100755
index 0000000..ff370a1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$H2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$I.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$I.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$I.class
new file mode 100755
index 0000000..66a48bd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery$I.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery.class
new file mode 100755
index 0000000..61a4b4b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoQuery.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$A.class
new file mode 100755
index 0000000..a8215d9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Address.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Address.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Address.class
new file mode 100755
index 0000000..029e833
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Address.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$AddressBook.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$AddressBook.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$AddressBook.class
new file mode 100755
index 0000000..1e8337e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$AddressBook.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Person.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Person.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Person.class
new file mode 100755
index 0000000..53cb624
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest$Person.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest.class
new file mode 100755
index 0000000..5143ee6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_PojoRest.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_SimpleMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_SimpleMap.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_SimpleMap.class
new file mode 100755
index 0000000..602bf08
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_SimpleMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringBuilderWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringBuilderWriter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringBuilderWriter.class
new file mode 100755
index 0000000..515fc0d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringBuilderWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils$BadNumber.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils$BadNumber.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils$BadNumber.class
new file mode 100755
index 0000000..22ca4dc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils$BadNumber.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils.class
new file mode 100755
index 0000000..b0529e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$1.class
new file mode 100755
index 0000000..c0cd5e8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$2.class
new file mode 100755
index 0000000..08b6887
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$3.class
new file mode 100755
index 0000000..d831904
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$4.class
new file mode 100755
index 0000000..9e5207b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$5.class
new file mode 100755
index 0000000..32ac1f6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$6.class
new file mode 100755
index 0000000..fa9ef98
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$7.class
new file mode 100755
index 0000000..50b0947
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver.class
new file mode 100755
index 0000000..de2f3dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_StringVarResolver.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$A.class
new file mode 100755
index 0000000..d702cb0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B$1.class
new file mode 100755
index 0000000..fc6d71f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B.class
new file mode 100755
index 0000000..c6a2a8f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C$1.class
new file mode 100755
index 0000000..3e0a3cc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C.class
new file mode 100755
index 0000000..b62f0bc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$D.class
new file mode 100755
index 0000000..7d4afb6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$1.class
new file mode 100755
index 0000000..ffcf0de
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$2.class
new file mode 100755
index 0000000..a222302
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$3.class
new file mode 100755
index 0000000..16752c0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1.class
new file mode 100755
index 0000000..3e60f72
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E2.class
new file mode 100755
index 0000000..d6d5eb7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$G.class
new file mode 100755
index 0000000..c1bf740
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R1.class
new file mode 100755
index 0000000..0ae5a77
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R2.class
new file mode 100755
index 0000000..757053a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R3.class
new file mode 100755
index 0000000..2497aab
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$Test7b.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$Test7b.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$Test7b.class
new file mode 100755
index 0000000..baa2bc1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common$Test7b.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common.class
new file mode 100755
index 0000000..a53da87
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Common.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$1.class
new file mode 100755
index 0000000..92429cc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A1.class
new file mode 100755
index 0000000..13dc0d5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A2.class
new file mode 100755
index 0000000..887c78c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A3.class
new file mode 100755
index 0000000..3df8c04
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$B.class
new file mode 100755
index 0000000..4904bf4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$C.class
new file mode 100755
index 0000000..205b827
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser.class
new file mode 100755
index 0000000..a45713f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$A.class
new file mode 100755
index 0000000..d8c9285
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$B.class
new file mode 100755
index 0000000..29d0fa2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml.class
new file mode 100755
index 0000000..7b29dfa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_CommonXml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$A.class
new file mode 100755
index 0000000..a4238cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B1.class
new file mode 100755
index 0000000..a091a86
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B2.class
new file mode 100755
index 0000000..231475b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C1.class
new file mode 100755
index 0000000..68a47e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C2.class
new file mode 100755
index 0000000..043533c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C3.class
new file mode 100755
index 0000000..5af0eef
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$C3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$D.class
new file mode 100755
index 0000000..f267633
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$E.class
new file mode 100755
index 0000000..572b2f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$F.class
new file mode 100755
index 0000000..249d75b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$G.class
new file mode 100755
index 0000000..6f87bcf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$H.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$H.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$H.class
new file mode 100755
index 0000000..3fb184e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$H.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$I.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$I.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$I.class
new file mode 100755
index 0000000..013f3ec
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$I.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1$1.class
new file mode 100755
index 0000000..e81e27f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1.class
new file mode 100755
index 0000000..adf16ed
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J2.class
new file mode 100755
index 0000000..08a3f09
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$J2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$K.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$K.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$K.class
new file mode 100755
index 0000000..617caf5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$K.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$L.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$L.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$L.class
new file mode 100755
index 0000000..623b9e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$L.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$M.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$M.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$M.class
new file mode 100755
index 0000000..e748e99
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$M.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$N.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$N.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$N.class
new file mode 100755
index 0000000..238c95e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$N.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$O.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$O.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$O.class
new file mode 100755
index 0000000..a8ae766
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$O.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$P.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$P.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$P.class
new file mode 100755
index 0000000..fc55372
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$P.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Person1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Person1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Person1.class
new file mode 100755
index 0000000..b5e8d45
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Person1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Q.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Q.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Q.class
new file mode 100755
index 0000000..733dc9e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml$Q.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml.class
new file mode 100755
index 0000000..904411b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_Xml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$1.class
new file mode 100755
index 0000000..5d73997
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$10.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$10.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$10.class
new file mode 100755
index 0000000..014ad2a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$10.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$2.class
new file mode 100755
index 0000000..e97362a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$3.class
new file mode 100755
index 0000000..d0c6a67
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$4.class
new file mode 100755
index 0000000..1fcb6c8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$5.class
new file mode 100755
index 0000000..d931e84
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$6.class
new file mode 100755
index 0000000..883af5e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$7.class
new file mode 100755
index 0000000..1a1b88c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$8.class
new file mode 100755
index 0000000..5c79269
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$9.class
new file mode 100755
index 0000000..df52594
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$A.class
new file mode 100755
index 0000000..64d924e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$B.class
new file mode 100755
index 0000000..341411f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$1.class
new file mode 100755
index 0000000..1d90d20
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$2.class
new file mode 100755
index 0000000..efeff5e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C.class
new file mode 100755
index 0000000..a117118
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$D.class
new file mode 100755
index 0000000..099214d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$E.class
new file mode 100755
index 0000000..c2877fa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$F1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$F1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$F1.class
new file mode 100755
index 0000000..18c3194
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$F1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FA.class
new file mode 100755
index 0000000..ad88049
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FB.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FB.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FB.class
new file mode 100755
index 0000000..65c7e89
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FB.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FC.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FC.class
new file mode 100755
index 0000000..8a7b113
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$FC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$G.class
new file mode 100755
index 0000000..e8cde32
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H.class
new file mode 100755
index 0000000..55d6433
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H1.class
new file mode 100755
index 0000000..4181fdf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$H1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$I.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$I.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$I.class
new file mode 100755
index 0000000..7add567
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed$I.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed.class
new file mode 100755
index 0000000..8192881
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlCollapsed.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$A.class
new file mode 100755
index 0000000..ee0c3f8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$B.class
new file mode 100755
index 0000000..c8a81e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$BContentHandler.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$BContentHandler.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$BContentHandler.class
new file mode 100755
index 0000000..aa57e27
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$BContentHandler.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$C1.class
new file mode 100755
index 0000000..0db8e1b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent.class
new file mode 100755
index 0000000..39eae36
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlContent.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlParser.class
new file mode 100755
index 0000000..61cfcd6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/CT_XmlParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.json
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.json b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.json
new file mode 100755
index 0000000..00e9d68
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.json
@@ -0,0 +1,17 @@
+{
+	name: "John Smith", 
+	address: {
+		streetAddress: "21 2nd Street", 
+		city: "New York", 
+		state: "NY", 
+		postalCode: 10021
+	}, 
+	phoneNumbers: [
+		"212 555-1111", 
+		"212 555-2222"
+	], 
+	additionalInfo: null, 
+	remote: false, 
+	height: 62.4, 
+	"fico score": " > 640"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.xml b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.xml
new file mode 100755
index 0000000..8e6c8f7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testComparisonWithJson.xml
@@ -0,0 +1,17 @@
+<object>
+	<name>John Smith</name>
+	<address type='object'>
+		<streetAddress>21 2nd Street</streetAddress>
+		<city>New York</city>
+		<state>NY</state>
+		<postalCode type='number'>10021</postalCode>
+	</address>
+	<phoneNumbers type='array'>
+		<string>212 555-1111</string>
+		<string>212 555-2222</string>
+	</phoneNumbers>
+	<additionalInfo nil='true'/>
+	<remote type='boolean'>false</remote>
+	<height type='number'>62.4</height>
+	<fico_x0020_score>_x0020_&gt; 640</fico_x0020_score>
+</object>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testNamespaces.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testNamespaces.xml b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testNamespaces.xml
new file mode 100755
index 0000000..fcf6d39
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/testNamespaces.xml
@@ -0,0 +1,17 @@
+<object xmlns='http://www.ibm.com' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
+	<name>John Smith</name>
+	<address type='object'>
+		<streetAddress>21 2nd Street</streetAddress>
+		<city>New York</city>
+		<state>NY</state>
+		<postalCode type='number'>10021</postalCode>
+	</address>
+	<phoneNumbers type='array'>
+		<string>212 555-1111</string>
+		<string>212 555-2222</string>
+	</phoneNumbers>
+	<additionalInfo xsi:nil='true'/>
+	<remote type='boolean'>false</remote>
+	<height type='number'>62.4</height>
+	<fico_x0020_score>_x0020_&gt; 640</fico_x0020_score>
+</object>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T1.class
new file mode 100755
index 0000000..daff426
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T2.class
new file mode 100755
index 0000000..c3dd7ae
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1a/T2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T3.class
new file mode 100755
index 0000000..cd52456
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T4.class
new file mode 100755
index 0000000..f29e24d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T5.class
new file mode 100755
index 0000000..b371d38
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T6.class
new file mode 100755
index 0000000..2b22e0e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T7.class
new file mode 100755
index 0000000..1957824
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/T7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/package-info.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/package-info.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/package-info.class
new file mode 100755
index 0000000..3e95108
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1b/package-info.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T8.class
new file mode 100755
index 0000000..cf6d4e4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T9.class
new file mode 100755
index 0000000..8bf5c8e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/T9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/package-info.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/package-info.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/package-info.class
new file mode 100755
index 0000000..663992d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/xml/xml1c/package-info.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$1.class
new file mode 100755
index 0000000..4391005
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$2.class
new file mode 100755
index 0000000..8bd5f27
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean.class
new file mode 100755
index 0000000..115831e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveAtomicObjectsBean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$1.class
new file mode 100755
index 0000000..f0adea4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$10.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$10.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$10.class
new file mode 100755
index 0000000..f2ad8fa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$10.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$11.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$11.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$11.class
new file mode 100755
index 0000000..c3bc746
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$11.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$2.class
new file mode 100755
index 0000000..bd2d802
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class
new file mode 100755
index 0000000..83e5d83
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class
new file mode 100755
index 0000000..df35a60
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class differ



[31/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java
new file mode 100755
index 0000000..e69a32b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java
@@ -0,0 +1,454 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.BeanContextProperties.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.locks.*;
+
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.ClassUtils.ClassComparator;
+
+/**
+ * Factory class for creating instances of {@link BeanContext}.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class BeanContextFactory extends Lockable {
+
+	//--------------------------------------------------------------------------------
+	// Static constants
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * The default package pattern exclusion list.
+	 * Any beans in packages in this list will not be considered beans.
+	 */
+	private static final String DEFAULT_NOTBEAN_PACKAGES =
+		"java.lang,java.lang.annotation,java.lang.ref,java.lang.reflect,java.io,java.net,java.nio.*,java.util.*";
+
+	/**
+	 * The default bean class exclusion list.
+	 * Anything in this list will not be considered beans.
+	 */
+	private static final Class<?>[] DEFAULT_NOTBEAN_CLASSES = {
+		Map.class,
+		Collection.class,
+		Reader.class,
+		Writer.class,
+		InputStream.class,
+		OutputStream.class,
+		Throwable.class
+	};
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	boolean
+		beansRequireDefaultConstructor = false,
+		beansRequireSerializable = false,
+		beansRequireSettersForGetters = false,
+		beansRequireSomeProperties = true,
+		beanMapPutReturnsOldValue = false,
+		useInterfaceProxies = true,
+		ignoreUnknownBeanProperties = false,
+		ignoreUnknownNullBeanProperties = true,
+		ignorePropertiesWithoutSetters = true,
+		ignoreInvocationExceptionsOnGetters = false,
+		ignoreInvocationExceptionsOnSetters = false,
+		useJavaBeanIntrospector = false;
+
+	Set<String> notBeanPackages = new TreeSet<String>();
+	Set<Class<?>> notBeanClasses = newClassTreeSet();
+	Map<Class<?>,Class<?>> implClasses = newClassTreeMap();
+	Map<String,String> uriVars = new TreeMap<String,String>();
+	LinkedList<Class<?>> filters = new LinkedList<Class<?>>();
+	ClassLoader classLoader = null;
+
+	Visibility
+		beanConstructorVisibility = Visibility.PUBLIC,
+		beanClassVisibility = Visibility.PUBLIC,
+		beanFieldVisibility = Visibility.PUBLIC,
+		beanMethodVisibility = Visibility.PUBLIC;
+
+	// Optional default parser set by setDefaultParser().
+	ReaderParser defaultParser = null;
+
+	// Read-write lock for preventing acess to the getBeanContext() method while this factory is being modified.
+	private ReadWriteLock lock = new ReentrantReadWriteLock();
+
+	// Current BeanContext instance.
+	private BeanContext beanContext;
+
+	//--------------------------------------------------------------------------------
+	// Methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Default constructor.
+	 */
+	public BeanContextFactory() {
+		addNotBeanClasses(DEFAULT_NOTBEAN_CLASSES);
+		setProperty(BEAN_addNotBeanPackages, DEFAULT_NOTBEAN_PACKAGES);
+	}
+
+	/**
+	 * Creates and returns a {@link BeanContext} with settings currently specified on this factory class.
+	 * This method will return the same object until the factory settings are modified at which point
+	 * a new {@link BeanContext} will be constructed.
+	 *
+	 * @return The bean context object.
+	 */
+	public BeanContext getBeanContext() {
+		readLock();
+		try {
+			if (beanContext == null)
+				beanContext = new BeanContext(this);
+			return beanContext;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	/**
+	 * Sets the default parser for this bean context.
+	 * <p>
+	 * The default parser is used in the following methods:
+	 * <ul>
+	 * 	<code>beanContext.newBeanMap(Bean.<jk>class</jk>).load(String)</code> - Used for parsing init properties.
+	 * 	<li>{@link BeanContext#convertToType(Object, ClassMeta)} - Used for converting strings to beans.
+	 * </ul>
+	 *
+	 * @param defaultParser The new default parser.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory setDefaultParser(ReaderParser defaultParser) {
+		writeLock();
+		try {
+			this.defaultParser = defaultParser;
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Configuration property methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Sets a property on this context.
+	 * <p>
+	 * 	Refer to {@link BeanContextProperties} for a description of available properties.
+	 *
+	 * @param property The property whose value is getting changed.
+	 * @param value The new value.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory setProperty(String property, Object value) throws LockedException {
+		writeLock();
+		try {
+			// Note:  Have to use the default bean context to set these properties since calling
+			// convertToType will cause the cache object to be initialized.
+			BeanContext bc = BeanContext.DEFAULT;
+
+			if (property.equals(BEAN_beansRequireDefaultConstructor))
+				beansRequireDefaultConstructor = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_beansRequireSerializable))
+				beansRequireSerializable = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_beansRequireSettersForGetters))
+				beansRequireSettersForGetters = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_beansRequireSomeProperties))
+				beansRequireSomeProperties = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_beanMapPutReturnsOldValue))
+				beanMapPutReturnsOldValue = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_beanConstructorVisibility))
+				beanConstructorVisibility = Visibility.valueOf(value.toString());
+			else if (property.equals(BEAN_beanClassVisibility))
+				beanClassVisibility = Visibility.valueOf(value.toString());
+			else if (property.equals(BEAN_beanFieldVisibility))
+				beanFieldVisibility = Visibility.valueOf(value.toString());
+			else if (property.equals(BEAN_methodVisibility))
+				beanMethodVisibility = Visibility.valueOf(value.toString());
+			else if (property.equals(BEAN_useJavaBeanIntrospector))
+				useJavaBeanIntrospector = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_useInterfaceProxies))
+				useInterfaceProxies = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_ignoreUnknownBeanProperties))
+				ignoreUnknownBeanProperties = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_ignoreUnknownNullBeanProperties))
+				ignoreUnknownNullBeanProperties = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_ignorePropertiesWithoutSetters))
+				ignorePropertiesWithoutSetters = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_ignoreInvocationExceptionsOnGetters))
+				ignoreInvocationExceptionsOnGetters = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_ignoreInvocationExceptionsOnSetters))
+				ignoreInvocationExceptionsOnSetters = bc.convertToType(value, Boolean.class);
+			else if (property.equals(BEAN_addNotBeanPackages)) {
+				Set<String> set = new TreeSet<String>(notBeanPackages);
+				for (String s : value.toString().split(","))
+					set.add(s.trim());
+				notBeanPackages = set;
+			} else if (property.equals(BEAN_removeNotBeanPackages)) {
+				Set<String> set = new TreeSet<String>(notBeanPackages);
+				for (String s : value.toString().split(","))
+					set.remove(s.trim());
+				notBeanPackages = set;
+			}
+		} finally {
+			writeUnlock();
+		}
+		return this;
+	}
+
+	/**
+	 * Sets multiple properties on this context.
+	 * <p>
+	 * 	Refer to {@link BeanContextProperties} for a description of available properties.
+	 *
+	 * @param properties The properties to set.  Ignored if <jk>null</jk>.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory setProperties(ObjectMap properties) throws LockedException {
+		writeLock();
+		try {
+			if (properties != null)
+				for (Map.Entry<String,Object> e : properties.entrySet())
+					setProperty(e.getKey(), e.getValue());
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Adds an explicit list of Java classes to be excluded from consideration as being beans.
+	 *
+	 * @param classes One or more fully-qualified Java class names.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory addNotBeanClasses(Class<?>...classes) {
+		writeLock();
+		try {
+			this.notBeanClasses.addAll(Arrays.asList(classes));
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Add filters to this context.
+	 * <p>
+	 * 	There are two category of classes that can be passed in through this method:
+	 * <ul>
+	 * 	<li>Subclasses of {@link PojoFilter} and {@link BeanFilter}.
+	 * 	<li>Any other class.
+	 * </ul>
+	 * <p>
+	 * 	When <code>IFilter</code> classes are specified, they identify objects that need to be
+	 * 		transformed into some other type during serialization (and optionally the reverse during parsing).
+	 * <p>
+	 * 	When non-<code>IFilter</code> classes are specified, they are wrapped inside {@link BeanFilter BeanFilters}.
+	 * 	For example, if you have an interface <code>IFoo</code> and a subclass <code>Foo</code>, and you
+	 * 		only want properties defined on <code>IFoo</code> to be visible as bean properties for <code>Foo</code> objects,
+	 * 		you can simply pass in <code>IFoo.<jk>class</jk></code> to this method.
+	 * <p>
+	 * 	The following code shows the order in which filters are applied:
+	 * <p class='bcode'>
+	 * 	<jc>// F3,F4,F1,F2</jc>
+	 * 	beanContext.addFilters(F1.<jk>class</jk>,F2.<jk>class</jk>);
+	 * 	beanContext.addFilters(F3.<jk>class</jk>,F4.<jk>class</jk>);
+	 * </p>
+	 *
+	 * @param classes One or more classes to add as filters to this context.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory addFilters(Class<?>...classes) throws LockedException {
+		writeLock();
+		try {
+			classes = Arrays.copyOf(classes, classes.length); // Copy array to prevent modification!
+			Collections.reverse(Arrays.asList(classes));
+			for (Class<?> c : classes)
+				filters.addFirst(c);
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Specifies an implementation class for an interface or abstract class.
+	 * <p>
+	 * 	For interfaces and abstract classes this method can be used to specify an implementation
+	 * 	class for the interface/abstract class so that instances of the implementation
+	 * 	class are used when instantiated (e.g. during a parse).
+	 *
+	 * @param <T> The interface class.
+	 * @param interfaceClass The interface class.
+	 * @param implClass The implementation of the interface class.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public <T> BeanContextFactory addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		writeLock();
+		try {
+			this.implClasses.put(interfaceClass, implClass);
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	/**
+	 * Specifies the classloader to use when resolving classes, usually <js>"_class"</js> attributes.
+	 * <p>
+	 * 	Can be used for resolving class names when the classes being created are in a different
+	 * 	classloader from the Juno code.
+	 * <p>
+	 * 	If <jk>null</jk>, <code>Class.forName(String)</code> will be used to resolve classes.
+	 *
+	 * @param classLoader The new classloader.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public BeanContextFactory setClassLoader(ClassLoader classLoader) throws LockedException {
+		writeLock();
+		try {
+			this.classLoader = classLoader;
+			return this;
+		} finally {
+			writeUnlock();
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods on Lockable
+	//--------------------------------------------------------------------------------
+
+	@Override /* Lockable */
+	public BeanContextFactory lock() {
+		if (! isLocked()) {
+			writeLock();
+			super.lock();
+			try {
+				notBeanPackages = Collections.unmodifiableSet(notBeanPackages);
+				notBeanClasses = Collections.unmodifiableSet(notBeanClasses);
+				implClasses = Collections.unmodifiableMap(implClasses);
+				uriVars = Collections.unmodifiableMap(uriVars);
+			} finally {
+				writeUnlock();
+			}
+		}
+		return this;
+	}
+
+	private void writeLock() {
+		checkLock();
+		lock.writeLock().lock();
+		beanContext = null;
+	}
+
+	private void writeUnlock() {
+		lock.writeLock().unlock();
+	}
+
+	private void readLock() {
+		lock.readLock().lock();
+	}
+
+	private void readUnlock() {
+		lock.readLock().unlock();
+	}
+
+	@Override /* Lockable */
+	public synchronized BeanContextFactory clone() {
+		try {
+			return (BeanContextFactory)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+
+	@Override /* Lockable */
+	public void onUnclone() {
+		readLock();
+		try {
+			notBeanPackages = new LinkedHashSet<String>(notBeanPackages);
+			filters = new LinkedList<Class<?>>(filters);
+			notBeanClasses = newClassTreeSet(notBeanClasses);
+			implClasses = newClassTreeMap(implClasses);
+			uriVars = new TreeMap<String,String>(uriVars);
+			beanContext = null;
+		} finally {
+			readUnlock();
+		}
+	}
+
+	@Override /* Object */
+	public String toString() {
+		readLock();
+		try {
+			ObjectMap m = new ObjectMap()
+				.append("id", System.identityHashCode(this))
+				.append("beansRequireDefaultConstructor", beansRequireDefaultConstructor)
+				.append("beansRequireSerializable", beansRequireSerializable)
+				.append("beansRequireSettersForGetters", beansRequireSettersForGetters)
+				.append("beansRequireSomeProperties", beansRequireSomeProperties)
+				.append("beanMapPutReturnsOldValue", beanMapPutReturnsOldValue)
+				.append("useInterfaceProxies", useInterfaceProxies)
+				.append("ignoreUnknownBeanProperties", ignoreUnknownBeanProperties)
+				.append("ignoreUnknownNullBeanProperties", ignoreUnknownNullBeanProperties)
+				.append("ignorePropertiesWithoutSetters", ignorePropertiesWithoutSetters)
+				.append("ignoreInvocationExceptionsOnGetters", ignoreInvocationExceptionsOnGetters)
+				.append("ignoreInvocationExceptionsOnSetters", ignoreInvocationExceptionsOnSetters)
+				.append("useJavaBeanIntrospector", useJavaBeanIntrospector)
+				.append("filters", filters)
+				.append("notBeanPackages", notBeanPackages)
+				.append("notBeanClasses", notBeanClasses)
+				.append("implClasses", implClasses)
+				.append("uriVars", uriVars);
+			return m.toString(JsonSerializer.DEFAULT_LAX_READABLE);
+		} catch (SerializeException e) {
+			return e.getLocalizedMessage();
+		} finally {
+			readUnlock();
+		}
+	}
+
+	private TreeMap<Class<?>,Class<?>> newClassTreeMap(Map<Class<?>,Class<?>> m) {
+		TreeMap<Class<?>,Class<?>> tm = newClassTreeMap();
+		tm.putAll(m);
+		return tm;
+	}
+
+	private TreeMap<Class<?>,Class<?>> newClassTreeMap() {
+		return new TreeMap<Class<?>,Class<?>>(new ClassComparator());
+	}
+
+	private TreeSet<Class<?>> newClassTreeSet(Set<Class<?>> s) {
+		TreeSet<Class<?>> ts = newClassTreeSet();
+		ts.addAll(s);
+		return ts;
+	}
+
+	private TreeSet<Class<?>> newClassTreeSet() {
+		return new TreeSet<Class<?>>(new ClassComparator());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class
new file mode 100755
index 0000000..652c6b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java
new file mode 100755
index 0000000..4edaf17
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.beans.*;
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Configurable properties on the {@link BeanContextFactory} class.
+ * <p>
+ * 	Use the {@link BeanContextFactory#setProperty(String, Object)} method to set properties on
+ * 	bean contexts.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class BeanContextProperties {
+
+	/**
+	 * Require no-arg constructor ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, a Java class must implement a default no-arg constructor to be considered a bean.
+	 * <p>
+	 * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>.
+	 */
+	public static final String BEAN_beansRequireDefaultConstructor = "BeanContext.beansRequireDefaultConstructor";
+
+	/**
+	 * Require {@link Serializable} interface ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, a Java class must implement the {@link Serializable} interface to be considered a bean.
+	 * <p>
+	 * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>.
+	 */
+	public static final String BEAN_beansRequireSerializable = "BeanContext.beansRequireSerializable";
+
+	/**
+	 * Require setters for getters ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, only getters that have equivalent setters will be considered as properties on a bean.
+	 * Otherwise, they will be ignored.
+	 */
+	public static final String BEAN_beansRequireSettersForGetters = "BeanContext.beansRequireSettersForGetters";
+
+	/**
+	 * Require some properties ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If <jk>true</jk>, then a Java class must contain at least 1 property to be considered a bean.
+	 * <p>
+	 * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>.
+	 */
+	public static final String BEAN_beansRequireSomeProperties = "BeanContext.beansRequireSomeProperties";
+
+	/**
+	 * Put returns old value ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, then the {@link BeanMap#put(String,Object) BeanMap.put()} method will return old property values.
+	 * <p>
+	 * Disabled by default because it introduces a slight performance penalty.
+	 */
+	public static final String BEAN_beanMapPutReturnsOldValue = "BeanContext.beanMapPutReturnsOldValue";
+
+	/**
+	 * Look for bean constructors with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}).
+	 */
+	public static final String BEAN_beanConstructorVisibility = "BeanContext.beanConstructorVisibility";
+
+	/**
+	 * Look for bean classes with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}).
+	 * <p>
+	 * Classes are not considered beans unless they meet the minimum visibility requirements.
+	 * For example, if the visibility is <code>PUBLIC</code> and the bean class is <jk>protected</jk>, then
+	 * 	the class will not be interpreted as a bean class.
+	 */
+	public static final String BEAN_beanClassVisibility = "BeanContext.beanClassVisibility";
+
+	/**
+	 * Look for bean fields with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}).
+	 * <p>
+	 * Fields are not considered bean properties unless they meet the minimum visibility requirements.
+	 * For example, if the visibility is <code>PUBLIC</code> and the bean field is <jk>protected</jk>, then
+	 * 	the field will not be interpreted as a bean property.
+	 * <p>
+	 * Use {@link Visibility#NONE} to prevent bean fields from being interpreted as bean properties altogether.
+	 */
+	public static final String BEAN_beanFieldVisibility = "BeanContext.beanFieldVisibility";
+
+	/**
+	 * Look for bean methods with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}).
+	 * <p>
+	 * Methods are not considered bean getters/setters unless they meet the minimum visibility requirements.
+	 * For example, if the visibility is <code>PUBLIC</code> and the bean method is <jk>protected</jk>, then
+	 * 	the method will not be interpreted as a bean getter or setter.
+	 */
+	public static final String BEAN_methodVisibility = "BeanContext.methodVisibility";
+
+	/**
+	 * Use Java {@link Introspector} for determining bean properties ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * Using the built-in Java bean introspector will not pick up fields or non-standard getters/setters.
+	 * Most {@link Bean @Bean} annotations will be ignored.
+	 */
+	public static final String BEAN_useJavaBeanIntrospector = "BeanContext.useJavaBeanIntrospector";
+
+	/**
+	 * Use interface proxies ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If <jk>true</jk>, then interfaces will be instantiated as proxy classes through the use of an {@link InvocationHandler}
+	 * if there is no other way of instantiating them.
+	 */
+	public static final String BEAN_useInterfaceProxies = "BeanContext.useInterfaceProxies";
+
+	/**
+	 * Ignore unknown properties ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, trying to set a value on a non-existent bean property will silently be ignored.
+	 * Otherwise, a {@code RuntimeException} is thrown.
+	 */
+	public static final String BEAN_ignoreUnknownBeanProperties = "BeanContext.ignoreUnknownBeanProperties";
+
+	/**
+	 * Ignore unknown properties with null values ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If <jk>true</jk>, trying to set a <jk>null</jk> value on a non-existent bean property will silently be ignored.
+	 * Otherwise, a {@code RuntimeException} is thrown.
+	 */
+	public static final String BEAN_ignoreUnknownNullBeanProperties = "BeanContext.ignoreUnknownNullBeanProperties";
+
+	/**
+	 * Ignore properties without setters ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * If <jk>true</jk>, trying to set a value on a bean property without a setter will silently be ignored.
+	 * Otherwise, a {@code RuntimeException} is thrown.
+	 */
+	public static final String BEAN_ignorePropertiesWithoutSetters = "BeanContext.ignorePropertiesWithoutSetters";
+
+	/**
+	 * Ignore invocation errors on getters ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, errors thrown when calling bean getter methods will silently be ignored.
+	 * Otherwise, a {@code BeanRuntimeException} is thrown.
+	 */
+	public static final String BEAN_ignoreInvocationExceptionsOnGetters = "BeanContext.ignoreInvocationExceptionsOnGetters";
+
+	/**
+	 * Ignore invocation errors on setters ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, errors thrown when calling bean setter methods will silently be ignored.
+	 * Otherwise, a {@code BeanRuntimeException} is thrown.
+	 */
+	public static final String BEAN_ignoreInvocationExceptionsOnSetters = "BeanContext.ignoreInvocationExceptionsOnSetters";
+
+	/**
+	 * Add to the list of packages whose classes should not be considered beans ({@link String}, comma-delimited list).
+	 * <p>
+	 * When specified, the current list of ignore packages are appended to.
+	 * The default list of ignore packages are as follows:
+	 * <ul>
+	 * 	<li><code>java.lang</code>
+	 * 	<li><code>java.lang.annotation</code>
+	 * 	<li><code>java.lang.ref</code>
+	 * 	<li><code>java.lang.reflect</code>
+	 * 	<li><code>java.io</code>
+	 * 	<li><code>java.net</code>
+	 * 	<li><code>java.nio.*</code>
+	 * 	<li><code>java.util.*</code>
+	 * </ul>
+	 * Any classes within these packages will be serialized to strings using {@link Object#toString()}.
+	 * <p>
+	 * Note that you can specify prefix patterns to include all subpackages.
+	 */
+	public static final String BEAN_addNotBeanPackages = "BeanContext.addNotBeanPackages";
+
+	/**
+	 * Remove from the list of packages whose classes should not be considered beans ({@link String}, comma-delimited list).
+	 * <p>
+	 * Essentially the opposite of {@link #BEAN_addNotBeanPackages}.
+	 */
+	public static final String BEAN_removeNotBeanPackages = "BeanContext.removeNotBeanPackages";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class
new file mode 100755
index 0000000..a16cbe6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class
new file mode 100755
index 0000000..f6be25f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class
new file mode 100755
index 0000000..61512ad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java
new file mode 100755
index 0000000..8aa1fb5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java
@@ -0,0 +1,461 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Java bean wrapper class.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	A wrapper that wraps Java bean instances inside of a {@link Map} interface that allows
+ * 	properties on the wrapped object can be accessed using the {@link Map#get(Object) get()} and {@link Map#put(Object,Object) put()} methods.
+ * <p>
+ * 	Use the {@link BeanContext} class to create instances of this class.
+ *
+ *
+ * <h6 class='topic'>Bean property order</h6>
+ * <p>
+ * 	The order of the properties returned by the {@link Map#keySet() keySet()} and {@link Map#entrySet() entrySet()} methods are as follows:
+ * 	<ul>
+ * 		<li>If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties in the annotation.
+ * 		<li>If {@link Bean @Bean} annotation is not specified on the class, then the order is the same as that returned
+ * 			by the {@link java.beans.BeanInfo} class (i.e. ordered by definition in the class).
+ * 	</ul>
+ * 	<br>
+ * 	The order can also be overridden through the use of a {@link BeanFilter}.
+ *
+ *
+ * <h6 class='topic'>POJO filters</h6>
+ * <p>
+ * 	If {@link PojoFilter PojoFilters} are defined on the class types of the properties of this bean or the bean properties themselves, the
+ * 	{@link #get(Object)} and {@link #put(Object, Object)} methods will automatically
+ * 	transform the property value to and from the serialized form.
+ *
+ * @author Barry M. Caceres
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> Specifies the type of object that this map encapsulates.
+ */
+public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T> {
+
+	/** The wrapped object. */
+	protected T bean;
+
+	/** Temporary holding cache for beans with read-only properties.  Normally null. */
+	protected Map<String,Object> propertyCache;
+
+	/** Temporary holding cache for bean properties of array types when the add() method is being used. */
+	protected Map<String,List<?>> arrayPropertyCache;
+
+	/** The BeanMeta associated with the class of the object. */
+	protected BeanMeta<T> meta;
+
+	/**
+	 * Instance of this class are instantiated through the BeanContext class.
+	 *
+	 * @param bean The bean to wrap inside this map.
+	 * @param meta The metadata associated with the bean class.
+	 */
+	protected BeanMap(T bean, BeanMeta<T> meta) {
+		this.bean = bean;
+		this.meta = meta;
+		if (meta.constructorArgs.length > 0)
+			propertyCache = new TreeMap<String,Object>();
+	}
+
+	/**
+	 * Returns the metadata associated with this bean map.
+	 *
+	 * @return The metadata associated with this bean map.
+	 */
+	public BeanMeta<T> getMeta() {
+		return meta;
+	}
+
+	/**
+	 * Returns the wrapped bean object.
+	 * Triggers bean creation if bean has read-only properties set through a constructor
+	 * 	defined by the {@link BeanConstructor} annotation.
+	 *
+	 * @return The inner bean object.
+	 */
+	public T getBean() {
+		T b = getBean(true);
+
+		// If we have any arrays that need to be constructed, do it now.
+		if (arrayPropertyCache != null) {
+			for (Map.Entry<String,List<?>> e : arrayPropertyCache.entrySet()) {
+				String key = e.getKey();
+				List<?> value = e.getValue();
+				BeanPropertyMeta<T> bpm = getPropertyMeta(key);
+				try {
+					bpm.setArray(b, value);
+				} catch (Exception e1) {
+					throw new RuntimeException(e1);
+				}
+			}
+			arrayPropertyCache = null;
+		}
+		return b;
+	}
+
+	/**
+	 * Returns the wrapped bean object.
+	 * <p>
+	 * If <code>create</code> is <jk>false</jk>, then this method may return <jk>null</jk>
+	 * 	if the bean has read-only properties set through a constructor
+	 * 	defined by the {@link BeanConstructor} annotation.
+	 * <p>
+	 * This method does NOT always return the bean in it's final state.
+	 * 	Array properties temporary stored as ArrayLists are not finalized
+	 * 	until the {@link #getBean()} method is called.
+	 *
+	 * @param create If bean hasn't been instantiated yet, then instantiate it.
+	 * @return The inner bean object.
+	 */
+	public T getBean(boolean create) {
+		/** If this is a read-only bean, then we need to create it. */
+		if (bean == null && create && meta.constructorArgs.length > 0) {
+			String[] props = meta.constructorArgs;
+			Constructor<T> c = meta.constructor;
+			Object[] args = new Object[props.length];
+			for (int i = 0; i < props.length; i++)
+				args[i] = propertyCache.remove(props[i]);
+			try {
+				bean = c.newInstance(args);
+				for (Map.Entry<String,Object> e : propertyCache.entrySet())
+					put(e.getKey(), e.getValue());
+				propertyCache = null;
+			} catch (Exception e) {
+				throw new BeanRuntimeException(e);
+			}
+		}
+		return bean;
+	}
+
+	/**
+	 * Returns the value of the property identified as the URI property (annotated with {@link BeanProperty#beanUri()} as <jk>true</jk>).
+	 *
+	 * @return The URI value, or <jk>null</jk> if no URI property exists on this bean.
+	 */
+	public Object getBeanUri() {
+		BeanMeta<T> bm = getMeta();
+		return bm.hasBeanUriProperty() ? bm.getBeanUriProperty().get(this) : null;
+	}
+
+	/**
+	 * Sets the bean URI property if the bean has a URI property.
+	 * Ignored otherwise.
+	 *
+	 * @param o The bean URI object.
+	 * @return If the bean context setting {@code beanMapPutReturnsOldValue} is <jk>true</jk>, then the old value of the property is returned.
+	 * 		Otherwise, this method always returns <jk>null</jk>.
+	 */
+	public Object putBeanUri(Object o) {
+		BeanMeta<T> bm = getMeta();
+		return bm.hasBeanUriProperty() ? bm.getBeanUriProperty().set(this, o) : null;
+	}
+
+	/**
+	 * Sets a property on the bean.
+	 * <p>
+	 * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then 
+	 * 	you must pass in a filtered value.
+	 * For example, if the bean property type class is a {@link Date} and the bean property has the 
+	 * 	{@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the 
+	 * 	{@link BeanProperty#filter() @BeanProperty.filter()} annotation, the value being passed in must be 
+	 * 	a String containing an ISO8601 date-time string value. 
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a bean with a 'birthDate' Date field</jc>
+	 * 	Person p = <jk>new</jk> Person();
+	 *
+	 * 	<jc>// Create a bean context and add the ISO8601 date-time filter</jc>
+	 * 	BeanContext beanContext = <jk>new</jk> BeanContext().addFilter(DateFilter.ISO8601DT.<jk>class</jk>);
+	 *
+	 * 	<jc>// Wrap our bean in a bean map</jc>
+	 * 	BeanMap&lt;Person&gt; b = beanContext.forBean(p);
+	 *
+	 * 	<jc>// Set the field</jc>
+	 * 	myBeanMap.put(<js>"birthDate"</js>, <js>"'1901-03-03T04:05:06-5000'"</js>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param property The name of the property to set.
+	 * @param value The value to set the property to.
+	 * @return If the bean context setting {@code beanMapPutReturnsOldValue} is <jk>true</jk>, then the old value of the property is returned.
+	 * 		Otherwise, this method always returns <jk>null</jk>.
+	 * @throws RuntimeException if any of the following occur.
+	 * 	<ul>
+	 * 		<li>BeanMapEntry does not exist on the underlying object.
+	 * 		<li>Security settings prevent access to the underlying object setter method.
+	 * 		<li>An exception occurred inside the setter method.
+	 * 	</ul>
+	 */
+	@Override /* Map */
+	public Object put(String property, Object value) {
+		BeanPropertyMeta<T> p = meta.properties.get(property);
+		if (p == null) {
+			if (meta.ctx.ignoreUnknownBeanProperties)
+				return null;
+			if (property.equals("<uri>") && meta.uriProperty != null)
+				return meta.uriProperty.set(this, value);
+
+			// 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.subTypeIdProperty != null) {
+				if (propertyCache == null)
+					propertyCache = new TreeMap<String,Object>();
+				return propertyCache.put(property, value);
+			}
+
+			throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property);
+		}
+		if (meta.filter != null)
+			if (meta.filter.writeProperty(this.bean, property, value))
+				return null;
+		return p.set(this, value);
+	}
+
+	/**
+	 * Add a value to a collection or array property.
+	 * <p>
+	 * 	As a general rule, adding to arrays is not recommended since the array must be recreate each time
+	 * 	this method is called.
+	 *
+	 * @param property Property name or child-element name (if {@link Xml#childName()} is specified).
+	 * @param value The value to add to the collection or array.
+	 */
+	public void add(String property, Object value) {
+		BeanPropertyMeta<T> p = meta.properties.get(property);
+		if (p == null) {
+			if (meta.ctx.ignoreUnknownBeanProperties)
+				return;
+			throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property);
+		}
+		p.add(this, value);
+	}
+
+
+	/**
+	 * Gets a property on the bean.
+	 * <p>
+	 * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then 
+	 * 	this method will return the filtered value.
+	 * For example, if the bean property type class is a {@link Date} and the bean property has the 
+	 * 	{@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the 
+	 * 	{@link BeanProperty#filter() @BeanProperty.filter()} annotation, this method will return a String 
+	 * 	containing an ISO8601 date-time string value. 
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a bean with a 'birthDate' Date field</jc>
+	 * 	Person p = <jk>new</jk> Person();
+	 * 	p.setBirthDate(<jk>new</jk> Date(1, 2, 3, 4, 5, 6));
+	 *
+	 * 	<jc>// Create a bean context and add the ISO8601 date-time filter</jc>
+	 * 	BeanContext beanContext = <jk>new</jk> BeanContext().addFilter(DateFilter.ISO8601DT.<jk>class</jk>);
+	 *
+	 * 	<jc>// Wrap our bean in a bean map</jc>
+	 * 	BeanMap&lt;Person&gt; b = beanContext.forBean(p);
+	 *
+	 * 	<jc>// Get the field as a string (i.e. "'1901-03-03T04:05:06-5000'")</jc>
+	 * 	String s = myBeanMap.get(<js>"birthDate"</js>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param property The name of the property to get.
+	 * @throws RuntimeException if any of the following occur.
+	 * 	<ol>
+	 * 		<li>BeanMapEntry does not exist on the underlying object.
+	 * 		<li>Security settings prevent access to the underlying object getter method.
+	 * 		<li>An exception occurred inside the getter method.
+	 * 	</ol>
+	 */
+	@Override /* Map */
+	public Object get(Object property) {
+		BeanPropertyMeta<T> p = meta.properties.get(property);
+		if (p == null)
+			return null;
+		if (meta.filter != null && property != null)
+			return meta.filter.readProperty(this.bean, property.toString(), p.get(this));
+		return p.get(this);
+	}
+
+	/**
+	 * Convenience method for setting multiple property values by passing in JSON (or other) text.
+	 * <p>
+	 * Typically the input is going to be JSON, although the actual data type
+	 * 	depends on the default parser specified by the {@link BeanContextFactory#setDefaultParser(ReaderParser)} method
+	 * 	on the bean context that created this map.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	aPersonBean.load(<js>"{name:'John Smith',age:21}"</js>)
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param input The text that will get parsed into a map and then added to this map.
+	 * @return This object (for method chaining).
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public BeanMap<T> load(String input) throws ParseException {
+		putAll(new ObjectMap(input, this.meta.ctx.defaultParser));
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting multiple property values by passing in a reader.
+	 *
+	 * @param r The text that will get parsed into a map and then added to this map.
+	 * @param p The parser to use to parse the text.
+	 * @return This object (for method chaining).
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException Thrown by <code>Reader</code>.
+	 */
+	public BeanMap<T> load(Reader r, ReaderParser p) throws ParseException, IOException {
+		putAll(new ObjectMap(r, p));
+		return this;
+	}
+
+	/**
+	 * Convenience method for loading this map with the contents of the specified map.
+	 * <p>
+	 * Identical to {@link #putAll(Map)} except as a fluent-style method.
+	 *
+	 * @param entries The map containing the entries to add to this map.
+	 * @return This object (for method chaining).
+	 */
+	@SuppressWarnings({"unchecked","rawtypes"})
+	public BeanMap<T> load(Map entries) {
+		putAll(entries);
+		return this;
+	}
+
+	/**
+	 * Returns the names of all properties associated with the bean.
+	 * <p>
+	 * 	The returned set is unmodifiable.
+	 */
+	@Override /* Map */
+	public Set<String> keySet() {
+		return meta.properties.keySet();
+	}
+
+	/**
+	 * Returns the specified property on this bean map.
+	 * <p>
+	 * 	Allows you to get and set an individual property on a bean without having a
+	 * 	handle to the bean itself by using the {@link BeanMapEntry#getValue()}
+	 * 	and {@link BeanMapEntry#setValue(Object)} methods.
+	 * <p>
+	 * 	This method can also be used to get metadata on a property by
+	 * 	calling the {@link BeanMapEntry#getMeta()} method.
+	 *
+	 * @param propertyName The name of the property to look up.
+	 * @return The bean property, or null if the bean has no such property.
+	 */
+	public BeanMapEntry<T> getProperty(String propertyName) {
+		BeanPropertyMeta<T> p = meta.properties.get(propertyName);
+		if (p == null)
+			return null;
+		return new BeanMapEntry<T>(this, p);
+	}
+
+	/**
+	 * Returns the metadata on the specified property.
+	 *
+	 * @param propertyName The name of the bean property.
+	 * @return Metadata on the specified property, or <jk>null</jk> if that property does not exist.
+	 */
+	public BeanPropertyMeta<T> getPropertyMeta(String propertyName) {
+		return meta.properties.get(propertyName);
+	}
+
+	/**
+	 * Returns the {@link ClassMeta} of the wrapped bean.
+	 *
+	 * @return The class type of the wrapped bean.
+	 */
+	@Override /* Delagate */
+	public ClassMeta<T> getClassMeta() {
+		return this.meta.getClassMeta();
+	}
+
+	/**
+	 * Returns all the properties associated with the bean.
+	 */
+	@Override /* Map */
+	public Set<Entry<String,Object>> entrySet() {
+
+		// Construct our own anonymous set to implement this function.
+		Set<Entry<String,Object>> s = new AbstractSet<Entry<String,Object>>() {
+
+			// Get the list of properties from the meta object.
+			// Note that the HashMap.values() method caches results, so this collection
+			// will really only be constructed once per bean type since the underlying
+			// map never changes.
+			final Collection<BeanPropertyMeta<T>> pSet = meta.properties.values();
+
+			@Override /* Set */
+			public Iterator<java.util.Map.Entry<String, Object>> iterator() {
+
+				// Construct our own anonymous iterator that uses iterators against the meta.properties
+				// map to maintain position.  This prevents us from having to construct any of our own
+				// collection objects.
+				return new Iterator<Entry<String,Object>>() {
+
+					final Iterator<BeanPropertyMeta<T>> pIterator = pSet.iterator();
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return pIterator.hasNext();
+					}
+
+					@Override /* Iterator */
+					public Map.Entry<String, Object> next() {
+						return new BeanMapEntry<T>(BeanMap.this, pIterator.next());
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						throw new UnsupportedOperationException("Cannot remove item from iterator.");
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return pSet.size();
+			}
+		};
+
+		return s;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class
new file mode 100755
index 0000000..eb1afcc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java
new file mode 100755
index 0000000..c502776
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+
+/**
+ * Represents a single entry in a bean map.
+ * <p>
+ * 	This class can be used to get and set property values on a bean, or to get metadata on a property.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct a new bean</jc>
+ * 	Person p = <jk>new</jk> Person();
+ *
+ * 	<jc>// Wrap it in a bean map</jc>
+ * 	BeanMap&lt;Person&gt; b = BeanContext.<jsf>DEFAULT</jsf>.forBean(p);
+ *
+ * 	<jc>// Get a reference to the birthDate property</jc>
+ * 	BeanMapEntry birthDate = b.getProperty(<js>"birthDate"</js>);
+ *
+ * 	<jc>// Set the property value</jc>
+ * 	birthDate.setValue(<jk>new</jk> Date(1, 2, 3, 4, 5, 6));
+ *
+ * 	<jc>// Or if the DateFilter.DEFAULT_ISO8601DT is registered with the bean context, set a filtered value</jc>
+ * 	birthDate.setFilteredValue(<js>"'1901-03-03T04:05:06-5000'"</js>);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ *
+ * @param <T> The bean type.
+ */
+public class BeanMapEntry<T> implements Map.Entry<String,Object> {
+	private final BeanMap<T> beanMap;
+	private final BeanPropertyMeta<T> meta;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanMap The bean map that this entry belongs to.
+	 * @param property The bean property.
+	 */
+	protected BeanMapEntry(BeanMap<T> beanMap, BeanPropertyMeta<T> property) {
+		this.beanMap = beanMap;
+		this.meta = property;
+	}
+
+	@Override /* Map.Entry */
+	public String getKey() {
+		return meta.getName();
+	}
+
+	/**
+	 * Returns the value of this property.
+	 * <p>
+	 * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then
+	 * 	this method will return the filtered value.
+	 * For example, if the bean property type class is a {@link Date} and the bean property has the
+	 * 	{@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the
+	 * 	{@link BeanProperty#filter() @BeanProperty.filter()} annotation, this method will return a String
+	 * 	containing an ISO8601 date-time string value.
+	 */
+	@Override /* Map.Entry */
+	public Object getValue() {
+		return meta.get(this.beanMap);
+	}
+
+	/**
+	 * Sets the value of this property.
+	 * <p>
+	 * If the property is an array of type {@code X}, then the value can be a {@code Collection<X>} or {@code X[]} or {@code Object[]}.
+	 * <p>
+	 * If the property is a bean type {@code X}, then the value can either be an {@code X} or a {@code Map}.
+	 * <p>
+	 * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then
+	 * 	you must pass in a filtered value.
+	 * For example, if the bean property type class is a {@link Date} and the bean property has the
+	 * 	{@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the
+	 * 	{@link BeanProperty#filter() @BeanProperty.filter()} annotation, the value being passed in must be
+	 * 	a String containing an ISO8601 date-time string value.
+	 *
+	 * @return  The set value after it's been converted.
+	 */
+	@Override /* Map.Entry */
+	public Object setValue(Object value) {
+		return meta.set(this.beanMap, value);
+	}
+
+	/**
+	 * Returns the bean map that contains this property.
+	 *
+	 * @return The bean map that contains this property.
+	 */
+	public BeanMap<T> getBeanMap() {
+		return this.beanMap;
+	}
+
+	/**
+	 * Returns the metadata about this bean property.
+	 *
+	 * @return Metadata about this bean property.
+	 */
+	public BeanPropertyMeta<T> getMeta() {
+		return this.meta;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return this.getKey() + "=" + this.getValue();
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class
new file mode 100755
index 0000000..a4cbf3a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class
new file mode 100755
index 0000000..2a98356
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class
new file mode 100755
index 0000000..c6c554a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java
new file mode 100755
index 0000000..d5ac436
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java
@@ -0,0 +1,749 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.Visibility.*;
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.beans.*;
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.Map.Entry;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.jena.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+
+/**
+ * Encapsulates all access to the properties of a bean class (like a souped-up {@link java.beans.BeanInfo}).
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Uses introspection to find all the properties associated with this class.  If the {@link Bean @Bean} annotation
+ * 	is present on the class, or the class has a {@link BeanFilter} registered with it in the bean context,
+ * 	then that information is used to determine the properties on the class.
+ * 	Otherwise, the {@code BeanInfo} functionality in Java is used to determine the properties on the class.
+ *
+ *
+ * <h6 class='topic'>Bean property ordering</h6>
+ * <p>
+ * 	The order of the properties are as follows:
+ * 	<ul>
+ * 		<li>If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties in the annotation.
+ * 		<li>If {@link Bean @Bean} annotation is not specified on the class, then the order is based on the following.
+ * 			<ul>
+ * 				<li>Public fields (same order as {@code Class.getFields()}).
+ * 				<li>Properties returned by {@code BeanInfo.getPropertyDescriptors()}.
+ * 				<li>Non-standard getters/setters with {@link BeanProperty @BeanProperty} annotation defined on them.
+ * 			</ul>
+ * 	</ul>
+ * 	<br>
+ * 	The order can also be overridden through the use of an {@link BeanFilter}.
+ *
+ *
+ * @param <T> The class type that this metadata applies to.
+ * @author Barry M. Caceres
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class BeanMeta<T> {
+
+	/** The target class type that this meta object describes. */
+	protected ClassMeta<T> classMeta;
+
+	/** The target class that this meta object describes. */
+	protected Class<T> c;
+
+	/** The properties on the target class. */
+	protected Map<String,BeanPropertyMeta<T>> properties;
+
+	/** The getter properties on the target class. */
+	protected Map<Method,String> getterProps = new HashMap<Method,String>();
+
+	/** The setter properties on the target class. */
+	protected Map<Method,String> setterProps = new HashMap<Method,String>();
+
+	/** The bean context that created this metadata object. */
+	protected BeanContext ctx;
+
+	/** Optional bean filter associated with the target class. */
+	protected BeanFilter<? extends T> filter;
+
+	/** Type variables implemented by this bean. */
+	protected Map<Class<?>,Class<?>[]> typeVarImpls;
+
+	/** The constructor for this bean. */
+	protected Constructor<T> constructor;
+
+	/** For beans with constructors with BeanConstructor annotation, this is the list of constructor arg properties. */
+	protected String[] constructorArgs = new String[0];
+
+	/** XML-related metadata */
+	protected XmlBeanMeta<T> xmlMeta;
+
+	// Other fields
+	BeanPropertyMeta<T> uriProperty;                                 // The property identified as the URI for this bean (annotated with @BeanProperty.beanUri).
+	BeanPropertyMeta<T> subTypeIdProperty;                           // The property indentified as the sub type differentiator property (identified by @Bean.subTypeProperty annotation).
+	PropertyNamer propertyNamer;                                     // Class used for calculating bean property names.
+
+	BeanMeta() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param classMeta The target class.
+	 * @param ctx The bean context that created this object.
+	 * @param filter Optional bean filter associated with the target class.  Can be <jk>null</jk>.
+	 */
+	protected BeanMeta(ClassMeta<T> classMeta, BeanContext ctx, com.ibm.juno.core.filter.BeanFilter<? extends T> filter) {
+		this.classMeta = classMeta;
+		this.ctx = ctx;
+		this.filter = filter;
+		this.c = classMeta.getInnerClass();
+	}
+
+	/**
+	 * Returns the {@link ClassMeta} of this bean.
+	 *
+	 * @return The {@link ClassMeta} of this bean.
+	 */
+	@BeanIgnore
+	public ClassMeta<T> getClassMeta() {
+		return classMeta;
+	}
+
+	/**
+	 * Initializes this bean meta, and returns an error message if the specified class is not
+	 * a bean for any reason.
+	 *
+	 * @return Reason why this class isn't a bean, or <jk>null</jk> if no problems detected.
+	 * @throws BeanRuntimeException If unexpected error occurs such as invalid annotations on the bean class.
+	 */
+	@SuppressWarnings("unchecked")
+	protected String init() throws BeanRuntimeException {
+
+		try {
+			Visibility
+				conVis = ctx.beanConstructorVisibility,
+				cVis = ctx.beanClassVisibility,
+				mVis = ctx.beanMethodVisibility,
+				fVis = ctx.beanFieldVisibility;
+
+			// If @Bean.interfaceClass is specified on the parent class, then we want
+			// to use the properties defined on that class, not the subclass.
+			Class<?> c2 = (filter != null && filter.getInterfaceClass() != null ? filter.getInterfaceClass() : c);
+
+			Class<?> stopClass = (filter != null ? filter.getStopClass() : Object.class);
+			if (stopClass == null)
+				stopClass = Object.class;
+
+			Map<String,BeanPropertyMeta<T>> normalProps = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+
+			/// See if this class matches one the patterns in the exclude-class list.
+			if (ctx.isNotABean(c))
+				return "Class matches exclude-class list";
+
+			if (! cVis.isVisible(c.getModifiers()))
+				return "Class is not public";
+
+			if (c.isAnnotationPresent(BeanIgnore.class))
+				return "Class is annotated with @BeanIgnore";
+
+			// Make sure it's serializable.
+			if (filter == null && ctx.beansRequireSerializable && ! isParentClass(Serializable.class, c))
+				return "Class is not serializable";
+
+			// Look for @BeanConstructor constructor.
+			for (Constructor<?> x : c.getConstructors()) {
+				if (x.isAnnotationPresent(BeanConstructor.class)) {
+					if (constructor != null)
+						throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found.");
+					constructor = (Constructor<T>)x;
+					constructorArgs = x.getAnnotation(BeanConstructor.class).properties();
+					if (constructorArgs.length != x.getParameterTypes().length)
+						throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor.");
+					if (! setAccessible(constructor))
+						throw new BeanRuntimeException(c, "Could not set accessibility to true on method with @BeanConstructor annotation.  Method=''{0}''", constructor.getName());
+				}
+			}
+
+			// If this is an interface, look for impl classes defined in the context.
+			if (constructor == null)
+				constructor = (Constructor<T>)ctx.getImplClassConstructor(c, conVis);
+
+			if (constructor == null)
+				constructor = (Constructor<T>)ClassMeta.findNoArgConstructor(c, conVis);
+
+			if (constructor == null && filter == null && ctx.beansRequireDefaultConstructor)
+				return "Class does not have the required no-arg constructor";
+
+			if (! setAccessible(constructor))
+				throw new BeanRuntimeException(c, "Could not set accessibility to true on no-arg constructor");
+
+			// Explicitly defined property names in @Bean annotation.
+			Set<String> fixedBeanProps = new LinkedHashSet<String>();
+
+			if (filter != null) {
+
+				// Get the 'properties' attribute if specified.
+				if (filter.getProperties() != null)
+					for (String p : filter.getProperties())
+						fixedBeanProps.add(p);
+
+				if (filter.getPropertyNamer() != null)
+					propertyNamer = filter.getPropertyNamer().newInstance();
+			}
+
+			if (propertyNamer == null)
+				propertyNamer = new PropertyNamerDefault();
+
+			// First populate the properties with those specified in the bean annotation to
+			// ensure that ordering first.
+			for (String name : fixedBeanProps)
+				normalProps.put(name, new BeanPropertyMeta<T>(this, name));
+
+			if (ctx.useJavaBeanIntrospector) {
+				BeanInfo bi = null;
+				if (! c2.isInterface())
+					bi = Introspector.getBeanInfo(c2, stopClass);
+				else
+					bi = Introspector.getBeanInfo(c2, null);
+				if (bi != null) {
+					for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
+						String name = pd.getName();
+						if (! normalProps.containsKey(name))
+							normalProps.put(name, new BeanPropertyMeta<T>(this, name));
+						normalProps.get(name).setGetter(pd.getReadMethod()).setSetter(pd.getWriteMethod());
+					}
+				}
+
+			} else /* Use 'better' introspection */ {
+
+				for (Field f : findBeanFields(c2, stopClass, fVis)) {
+					String name = findPropertyName(f, fixedBeanProps);
+					if (name != null) {
+						if (! normalProps.containsKey(name))
+							normalProps.put(name, new BeanPropertyMeta<T>(this, name));
+						normalProps.get(name).setField(f);
+					}
+				}
+
+				List<BeanMethod> bms = findBeanMethods(c2, stopClass, mVis, fixedBeanProps, propertyNamer);
+
+				// Iterate through all the getters.
+				for (BeanMethod bm : bms) {
+					String pn = bm.propertyName;
+					Method m = bm.method;
+					if (! normalProps.containsKey(pn))
+						normalProps.put(pn, new BeanPropertyMeta<T>(this, pn));
+					BeanPropertyMeta<?> bpm = normalProps.get(pn);
+					if (! bm.isSetter)
+						bpm.setGetter(m);
+				}
+
+				// Now iterate through all the setters.
+				for (BeanMethod bm : bms) {
+					if (bm.isSetter) {
+						BeanPropertyMeta<?> bpm = normalProps.get(bm.propertyName);
+						if (bm.matchesPropertyType(bpm))
+							bpm.setSetter(bm.method);
+					}
+				}
+			}
+
+			typeVarImpls = new HashMap<Class<?>,Class<?>[]>();
+			findTypeVarImpls(c, typeVarImpls);
+			if (typeVarImpls.isEmpty())
+				typeVarImpls = null;
+
+			// Eliminate invalid properties, and set the contents of getterProps and setterProps.
+			for (Iterator<BeanPropertyMeta<T>> i = normalProps.values().iterator(); i.hasNext();) {
+				BeanPropertyMeta<T> p = i.next();
+				try {
+					if (p.validate()) {
+
+						if (p.getGetter() != null)
+							getterProps.put(p.getGetter(), p.getName());
+
+						if (p.getSetter() != null)
+							setterProps.put(p.getSetter(), p.getName());
+
+						if (p.isBeanUri())
+							uriProperty = p;
+
+					} else {
+						i.remove();
+					}
+				} catch (ClassNotFoundException e) {
+					throw new BeanRuntimeException(c, e.getLocalizedMessage());
+				}
+			}
+
+			// Check for missing properties.
+			for (String fp : fixedBeanProps)
+				if (! normalProps.containsKey(fp))
+					throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @Bean(properties=X) annotation but was not found on the class definition.", fp);
+
+			// Mark constructor arg properties.
+			for (String fp : constructorArgs) {
+				BeanPropertyMeta<T> m = normalProps.get(fp);
+				if (m == null)
+					throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @BeanConstructor(properties=X) annotation but was not found on the class definition.", fp);
+				m.setAsConstructorArg();
+			}
+
+			// Make sure at least one property was found.
+			if (filter == null && ctx.beansRequireSomeProperties && normalProps.size() == 0)
+				return "No properties detected on bean class";
+
+			properties = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+
+			if (filter != null && filter.getSubTypeProperty() != null) {
+				String subTypeProperty = filter.getSubTypeProperty();
+				this.subTypeIdProperty = new SubTypePropertyMeta(subTypeProperty, filter.getSubTypes(), normalProps.remove(subTypeProperty));
+				properties.put(subTypeProperty, this.subTypeIdProperty);
+			}
+
+			properties.putAll(normalProps);
+
+			// If a filter is defined, look for inclusion and exclusion lists.
+			if (filter != null) {
+
+				// Eliminated excluded properties if BeanFilter.excludeKeys is specified.
+				String[] includeKeys = filter.getProperties();
+				String[] excludeKeys = filter.getExcludeProperties();
+				if (excludeKeys != null) {
+					for (String k : excludeKeys)
+						properties.remove(k);
+
+				// Only include specified properties if BeanFilter.includeKeys is specified.
+				// Note that the order must match includeKeys.
+				} else if (includeKeys != null) {
+					Map<String,BeanPropertyMeta<T>> properties2 = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+					for (String k : includeKeys) {
+						if (properties.containsKey(k))
+							properties2.put(k, properties.get(k));
+					}
+					properties = properties2;
+				}
+			}
+
+			xmlMeta = new XmlBeanMeta<T>(this, null);
+
+			// We return this through the Bean.keySet() interface, so make sure it's not modifiable.
+			properties = Collections.unmodifiableMap(properties);
+
+		} catch (BeanRuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			return "Exception:  " + StringUtils.getStackTrace(e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the subtype ID property of this bean if it has one.
+	 * <p>
+	 * The subtype id 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<T> getSubTypeIdProperty() {
+		return subTypeIdProperty;
+	}
+
+	/**
+	 * 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 subTypeIdProperty != null;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if one of the properties on this bean is annotated with {@link BeanProperty#beanUri()} as <jk>true</jk>
+	 *
+	 * @return <jk>true</jk> if this bean has subtypes associated with it. <jk>true</jk> if there is a URI property associated with this bean.
+	 */
+	public boolean hasBeanUriProperty() {
+		return uriProperty != null;
+	}
+
+	/**
+	 * Returns the bean property marked as the URI for the bean (annotated with {@link BeanProperty#beanUri()} as <jk>true</jk>).
+	 *
+	 * @return The URI property, or <jk>null</jk> if no URI property exists on this bean.
+	 */
+	public BeanPropertyMeta<T> getBeanUriProperty() {
+		return uriProperty;
+	}
+
+	/*
+	 * Temporary getter/setter method struct.
+	 */
+	private static class BeanMethod {
+		String propertyName;
+		boolean isSetter;
+		Method method;
+		Class<?> type;
+
+		BeanMethod(String propertyName, boolean isSetter, Method method) {
+			this.propertyName = propertyName;
+			this.isSetter = isSetter;
+			this.method = method;
+			if (isSetter)
+				this.type = method.getParameterTypes()[0];
+			else
+				this.type = method.getReturnType();
+		}
+
+		/*
+		 * Returns true if this method matches the class type of the specified property.
+		 * Only meant to be used for setters.
+		 */
+		boolean matchesPropertyType(BeanPropertyMeta<?> b) {
+			if (b == null)
+				return false;
+
+			// Get the bean property type from the getter/field.
+			Class<?> pt = null;
+			if (b.getGetter() != null)
+				pt = b.getGetter().getReturnType();
+			else if (b.getField() != null)
+				pt = b.getField().getType();
+
+			// Doesn't match if no getter/field defined.
+			if (pt == null)
+				return false;
+
+			// Doesn't match if not same type or super type as getter/field.
+			if (! isParentClass(type, pt))
+				return false;
+
+			// If a setter was previously set, only use this setter if it's a closer
+			// match (e.g. prev type is a superclass of this type).
+			if (b.getSetter() == null)
+				return true;
+
+			Class<?> prevType = b.getSetter().getParameterTypes()[0];
+			return isParentClass(prevType, type, true);
+		}
+
+		@Override /* Object */
+		public String toString() {
+			return method.toString();
+		}
+	}
+
+	/*
+	 * Find all the bean methods on this class.
+	 *
+	 * @param c The filtered class.
+	 * @param stopClass Don't look above this class in the hierarchy.
+	 * @param v The minimum method visibility.
+	 * @param fixedBeanProps Only include methods whose properties are in this list.
+	 * @param pn Use this property namer to determine property names from the method names.
+	 */
+	private static List<BeanMethod> findBeanMethods(Class<?> c, Class<?> stopClass, Visibility v, Set<String> fixedBeanProps, PropertyNamer pn) {
+		List<BeanMethod> l = new LinkedList<BeanMethod>();
+
+		for (Class<?> c2 : findClasses(c, stopClass)) {
+			for (Method m : c2.getDeclaredMethods()) {
+				int mod = m.getModifiers();
+				if (Modifier.isStatic(mod) || Modifier.isTransient(mod))
+					continue;
+				if (m.isAnnotationPresent(BeanIgnore.class))
+					continue;
+				if (m.isBridge())   // This eliminates methods with covariant return types from parent classes on child classes.
+					continue;
+				if (! (v.isVisible(m) || m.isAnnotationPresent(BeanProperty.class)))
+					continue;
+				String n = m.getName();
+				Class<?>[] pt = m.getParameterTypes();
+				Class<?> rt = m.getReturnType();
+				boolean isGetter = false, isSetter = false;
+				if (pt.length == 1 && n.startsWith("set") && (isParentClass(rt, c) || rt.equals(Void.TYPE))) {
+					isSetter = true;
+					n = n.substring(3);
+				} else if (pt.length == 0 && n.startsWith("get") && (! rt.equals(Void.TYPE))) {
+					isGetter = true;
+					n = n.substring(3);
+				} else if (pt.length == 0 && n.startsWith("is") && (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {
+					isGetter = true;
+					n = n.substring(2);
+				}
+				n = pn.getPropertyName(n);
+				if (isGetter || isSetter) {
+					BeanProperty bp = m.getAnnotation(BeanProperty.class);
+					if (bp != null && ! bp.name().equals("")) {
+						n = bp.name();
+						if (! fixedBeanProps.isEmpty())
+							if (! fixedBeanProps.contains(n))
+								throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", n);
+					}
+					l.add(new BeanMethod(n, isSetter, m));
+				}
+			}
+		}
+		return l;
+	}
+
+	private static Collection<Field> findBeanFields(Class<?> c, Class<?> stopClass, Visibility v) {
+		List<Field> l = new LinkedList<Field>();
+		for (Class<?> c2 : findClasses(c, stopClass)) {
+			for (Field f : c2.getDeclaredFields()) {
+				int m = f.getModifiers();
+				if (Modifier.isStatic(m) || Modifier.isTransient(m))
+					continue;
+				if (f.isAnnotationPresent(BeanIgnore.class))
+					continue;
+				if (! (v.isVisible(f) || f.isAnnotationPresent(BeanProperty.class)))
+					continue;
+				l.add(f);
+			}
+		}
+		return l;
+	}
+
+	private static List<Class<?>> findClasses(Class<?> c, Class<?> stopClass) {
+		LinkedList<Class<?>> l = new LinkedList<Class<?>>();
+		findClasses(c, l, stopClass);
+		return l;
+	}
+
+	private static void findClasses(Class<?> c, LinkedList<Class<?>> l, Class<?> stopClass) {
+		while (c != null && stopClass != c) {
+			l.addFirst(c);
+			for (Class<?> ci : c.getInterfaces())
+				findClasses(ci, l, stopClass);
+			c = c.getSuperclass();
+		}
+	}
+
+	/**
+	 * Returns the metadata on all properties associated with this bean.
+	 *
+	 * @return Metadata on all properties associated with this bean.
+	 */
+	public Collection<BeanPropertyMeta<T>> getPropertyMetas() {
+		return this.properties.values();
+	}
+
+	/**
+	 * Returns the metadata on the specified list of properties.
+	 *
+	 * @param pNames The list of properties to retrieve.  If <jk>null</jk>, returns all properties.
+	 * @return The metadata on the specified list of properties.
+	 */
+	public Collection<BeanPropertyMeta<T>> getPropertyMetas(final String...pNames) {
+		if (pNames == null)
+			return getPropertyMetas();
+		List<BeanPropertyMeta<T>> l = new ArrayList<BeanPropertyMeta<T>>(pNames.length);
+		for (int i = 0; i < pNames.length; i++)
+			l.add(getPropertyMeta(pNames[i]));
+		return l;
+	}
+
+	/**
+	 * Returns XML related metadata for this bean type.
+	 *
+	 * @return The XML metadata for this bean type.
+	 */
+	public XmlBeanMeta<T> getXmlMeta() {
+		return xmlMeta;
+	}
+
+	/**
+	 * Returns metadata about the specified property.
+	 *
+	 * @param name The name of the property on this bean.
+	 * @return The metadata about the property, or <jk>null</jk> if no such property exists
+	 * 	on this bean.
+	 */
+	public BeanPropertyMeta<T> getPropertyMeta(String name) {
+		return this.properties.get(name);
+	}
+
+	/**
+	 * Creates a new instance of this bean.
+	 *
+	 * @param outer The outer object if bean class is a non-static inner member class.
+	 * @return A new instance of this bean if possible, or <jk>null</jk> if not.
+	 * @throws IllegalArgumentException Thrown by constructor.
+	 * @throws InstantiationException Thrown by constructor.
+	 * @throws IllegalAccessException Thrown by constructor.
+	 * @throws InvocationTargetException Thrown by constructor.
+	 */
+	@SuppressWarnings("unchecked")
+	protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+		if (classMeta.isMemberClass) {
+			if (constructor != null)
+				return constructor.newInstance(outer);
+		} else {
+			if (constructor != null)
+				return constructor.newInstance((Object[])null);
+			InvocationHandler h = classMeta.getProxyInvocationHandler();
+			if (h != null) {
+				ClassLoader cl = classMeta.beanContext.classLoader;
+				if (cl == null)
+					cl = this.getClass().getClassLoader();
+				return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h);
+			}
+		}
+		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.
+	 */
+	private String findPropertyName(Field f, Set<String> fixedBeanProps) {
+		BeanProperty bp = f.getAnnotation(BeanProperty.class);
+		if (bp != null && ! bp.name().equals("")) {
+			String name = bp.name();
+			if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))
+				return name;
+			throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", name);
+		}
+		String name = propertyNamer.getPropertyName(f.getName());
+		if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))
+			return name;
+		return null;
+	}
+
+	/**
+	 * Recursively determines the classes represented by parameterized types in the class hierarchy of
+	 * the specified type, and puts the results in the specified map.<br>
+	 * <p>
+	 * 	For example, given the following classes...
+	 * <p class='bcode'>
+	 * 	public static class BeanA&lt;T> {
+	 * 		public T x;
+	 * 	}
+	 * 	public static class BeanB extends BeanA&lt;Integer>} {...}
+	 * <p>
+	 * 	...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating
+	 * 	that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}:
+	 * <p class='bcode'>
+	 * 	{BeanA.class:[Integer.class]}
+	 * <p>
+	 * 	TODO:  This code doesn't currently properly handle the following situation:
+	 * <p class='bcode'>
+	 * 	public static class BeanB&ltT extends Number> extends BeanA&ltT>;
+	 * 	public static class BeanC extends BeanB&ltInteger>;
+	 * <p>
+	 * 	When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<br>
+	 * 	If anyone can figure out a better way of doing this, please do so!
+	 *
+	 * @param t The type we're recursing.
+	 * @param m Where the results are loaded.
+	 */
+	private static void findTypeVarImpls(Type t, Map<Class<?>,Class<?>[]> m) {
+		if (t instanceof Class) {
+			Class<?> c = (Class<?>)t;
+			findTypeVarImpls(c.getGenericSuperclass(), m);
+			for (Type ci : c.getGenericInterfaces())
+				findTypeVarImpls(ci, m);
+		} else if (t instanceof ParameterizedType) {
+			ParameterizedType pt = (ParameterizedType)t;
+			Type rt = pt.getRawType();
+			if (rt instanceof Class) {
+				Type[] gImpls = pt.getActualTypeArguments();
+				Class<?>[] gTypes = new Class[gImpls.length];
+				for (int i = 0; i < gImpls.length; i++) {
+					Type gt = gImpls[i];
+					if (gt instanceof Class)
+						gTypes[i] = (Class<?>)gt;
+					else if (gt instanceof TypeVariable) {
+						TypeVariable<?> tv = (TypeVariable<?>)gt;
+						for (Type upperBound : tv.getBounds())
+							if (upperBound instanceof Class)
+								gTypes[i] = (Class<?>)upperBound;
+					}
+				}
+				m.put((Class<?>)rt, gTypes);
+				findTypeVarImpls(pt.getRawType(), m);
+			}
+		}
+	}
+
+	/*
+	 * Bean property for getting and setting bean subtype.
+	 */
+	@SuppressWarnings({"rawtypes","unchecked"})
+	private class SubTypePropertyMeta extends BeanPropertyMeta<T> {
+
+		private Map<Class<?>,String> subTypes;
+		private BeanPropertyMeta<T> realProperty;  // Bean property if bean actually has a real subtype field.
+
+		SubTypePropertyMeta(String subTypeAttr, Map<Class<?>,String> subTypes, BeanPropertyMeta<T> realProperty) {
+			super(BeanMeta.this, subTypeAttr, ctx.string());
+			this.subTypes = subTypes;
+			this.realProperty = realProperty;
+			this.htmlMeta = new HtmlBeanPropertyMeta<T>(this);
+			this.xmlMeta = new XmlBeanPropertyMeta<T>(this);
+			this.rdfMeta = new RdfBeanPropertyMeta<T>(this);
+		}
+
+		/*
+		 * Setting this bean property causes the inner bean to be set to the subtype implementation.
+		 */
+		@Override /* BeanPropertyMeta */
+		public Object set(BeanMap<T> 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 = ctx.getBeanMeta(subTypeClass);
+					try {
+						m.bean = (T)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(c, "Unknown subtype ID ''{0}''", subTypeId);
+		}
+
+		@Override /* BeanPropertyMeta */
+		public Object get(BeanMap<T> m) throws BeanRuntimeException {
+			String subTypeId = filter.getSubTypes().get(c);
+			if (subTypeId == null)
+				throw new BeanRuntimeException(c, "Unmapped sub type class");
+			return subTypeId;
+		}
+	}
+
+	@Override /* Object */
+	public String toString() {
+		StringBuilder sb = new StringBuilder(c.getName());
+		sb.append(" {\n");
+		for (BeanPropertyMeta<?> pm : this.properties.values())
+			sb.append("\t").append(pm.toString()).append(",\n");
+		sb.append("}");
+		return sb.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class
new file mode 100755
index 0000000..6f63839
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java
new file mode 100755
index 0000000..9effae3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Sames as {@link BeanMeta}, except the list of bean properties are limited
+ * by a {@link BeanProperty#properties()} annotation.
+ *
+ * @param <T> The class type that this metadata applies to.
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class BeanMetaFiltered<T> extends BeanMeta<T> {
+
+	private final BeanMeta<T> innerMeta;
+
+	/**
+	 * Wrapper constructor.
+	 *
+	 * @param innerMeta The unfiltered bean meta of the bean property.
+	 * @param pNames The list of filtered property names.
+	 */
+	public BeanMetaFiltered(BeanMeta<T> innerMeta, String[] pNames) {
+		this.innerMeta = innerMeta;
+		this.properties = new LinkedHashMap<String,BeanPropertyMeta<T>>();
+		for (String p : pNames)
+			properties.put(p, innerMeta.getPropertyMeta(p));
+		this.xmlMeta = new XmlBeanMeta<T>(innerMeta, pNames);
+	}
+
+	/**
+	 * Wrapper constructor.
+	 *
+	 * @param innerMeta The unfiltered bean meta of the bean property.
+	 * @param pNames The list of filtered property names.
+	 */
+	public BeanMetaFiltered(BeanMeta<T> innerMeta, Collection<String> pNames) {
+		this(innerMeta, pNames.toArray(new String[pNames.size()]));
+	}
+
+	@Override /* Delagate */
+	public ClassMeta<T> getClassMeta() {
+		return innerMeta.classMeta;
+	}
+
+	@Override /* BeanMeta */
+	public Collection<BeanPropertyMeta<T>> getPropertyMetas() {
+		return properties.values();
+	}
+
+	@Override /* BeanMeta */
+	public BeanPropertyMeta<T> getPropertyMeta(String name) {
+		return properties.get(name);
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return innerMeta.c.getName();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class
new file mode 100755
index 0000000..d55611b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class differ


[17/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.java
new file mode 100755
index 0000000..ec52ab5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.jena.*;
+
+/**
+ * Annotation for specifying options for RDF serializers.
+ * <p>
+ * 	Can be applied to Java packages, types, fields, and methods.
+ * <p>
+ * 	Can be used for the following:
+ * <ul>
+ * 	<li>Override the default behavior of how collections and arrays are serialized.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({PACKAGE,TYPE,FIELD,METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface Rdf {
+
+	/**
+	 * Sets the XML prefix of this property or class.
+	 * <p>
+	 * 	Must either be matched to a {@link #namespace()} annotation on the same object, parent object, or a {@link RdfNs} with the same name
+	 * 	through the {@link RdfSchema#rdfNs()} annotation on the package.
+	 * </p>
+	 */
+	String prefix() default "";
+
+	/**
+	 * Sets the namespace URI of this property or class.
+	 * <p>
+	 * 	Must be matched with a {@link #prefix()} annotation on this object, a parent object, or a {@link RdfNs} with the same name
+	 * 	through the {@link RdfSchema#rdfNs()} annotation on the package.
+	 */
+	String namespace() default "";
+
+	/**
+	 * The format for how collections (e.g. lists and arrays) are serialized in RDF.
+	 * @see RdfCollectionFormat
+	 */
+	RdfCollectionFormat collectionFormat() default RdfCollectionFormat.DEFAULT;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.class
new file mode 100755
index 0000000..44818eb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.java
new file mode 100755
index 0000000..96ef14d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfNs.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena.annotation;
+
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Namespace name/URL mapping pair.
+ * <p>
+ * 	Used to identify a namespace/URI pair on a {@link RdfSchema#rdfNs()} annotation.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({})
+@Retention(RUNTIME)
+@Inherited
+public @interface RdfNs {
+
+	/**
+	 * RDF namespace prefix.
+	 */
+	String prefix();
+
+	/**
+	 * RDF namespace URL.
+	 */
+	String namespaceURI();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.class
new file mode 100755
index 0000000..9e2038d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.java
new file mode 100755
index 0000000..00d6485
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/RdfSchema.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Identifies the default RDF namespaces at the package level.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(PACKAGE)
+@Retention(RUNTIME)
+@Inherited
+public @interface RdfSchema {
+
+	/**
+	 * Sets the default RDF prefix for all classes in this and child packages.
+	 * <p>
+	 * 	Must either be matched with a {@link #namespace()} annotation, or an {@link #rdfNs()} mapping with the
+	 * 	same {@link RdfNs#prefix} value.
+	 * </p>
+	 */
+	public String prefix() default "";
+
+	/**
+	 * Sets the default RDF namespace URL for all classes in this and child packages.
+	 * <p>
+	 * 	Must either be matched with a {@link #prefix()} annotation, or an {@link #rdfNs()} mapping with the
+	 * 	same {@link RdfNs#namespaceURI} value.
+	 * </p>
+	 */
+	public String namespace() default "";
+
+	/**
+	 * Lists all namespace mappings to be used on all classes within this package.
+	 * <p>
+	 * 	The purpose of this annotation is to allow namespace mappings to be defined in a single location
+	 * 	and referred to by name through just the {@link Rdf#prefix()} annotation.
+	 * <p>
+	 * 	Inherited by child packages.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p>
+	 * 	Contents of <code>package-info.java</code>...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jc>// XML namespaces used within this package.</jc>
+	 * 	<ja>@RdfSchema</ja>(prefix=<js>"ab"</js>,
+	 * 		namespaces={
+	 * 			<ja>@RdfNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.ibm.com/addressBook/"</js>),
+	 * 			<ja>@RdfNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.ibm.com/person/"</js>),
+	 * 			<ja>@RdfNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.ibm.com/address/"</js>),
+	 * 			<ja>@RdfNs</ja>(prefix=<js>"mail"</js>, namespaceURI="<js>http://www.ibm.com/mail/"</js>)
+	 * 		}
+	 * 	)
+	 * 	<jk>package</jk> com.ibm.sample.addressbook;
+	 * 	<jk>import</jk> com.ibm.juno.core.rdf.annotation.*;
+	 * </p>
+	 * <p>
+	 * 	Class in package using defined namespaces...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jk>package</jk> com.ibm.sample.addressbook;
+	 *
+	 * 	<jc>// Bean class, override "ab" namespace on package.</jc>
+	 * 	<ja>@Rdf</ja>(prefix=<js>"addr"</js>)
+	 * 	<jk>public class</jk> Address {
+	 *
+	 * 		<jc>// Bean property, use "addr" namespace on class.</jc>
+	 * 		<jk>public int</jk> <jf>id</jf>;
+	 *
+	 * 		<jc>// Bean property, override with "mail" namespace.</jc>
+	 * 		<ja>@Rdf</ja>(prefix=<js>"mail"</js>)
+	 * 		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public RdfNs[] rdfNs() default {};
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/package.html
new file mode 100755
index 0000000..3e8af8d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>RDF annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_HTML.png
new file mode 100755
index 0000000..b4a3576
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_N3.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_N3.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_N3.png
new file mode 100755
index 0000000..16613a4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_N3.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_NTriple.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_NTriple.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_NTriple.png
new file mode 100755
index 0000000..9da3ffa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_NTriple.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXML.png
new file mode 100755
index 0000000..13f2b43
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXMLABBREV.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXMLABBREV.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXMLABBREV.png
new file mode 100755
index 0000000..e1ffa09
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_RDFXMLABBREV.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_Turtle.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_Turtle.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_Turtle.png
new file mode 100755
index 0000000..0fd2b36
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/doc-files/Example_Turtle.png differ


[29/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.java
new file mode 100755
index 0000000..304bc25
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+/**
+ * Common super class for all core-API serializers, parsers, and serializer/parser groups.
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Maintains an inner {@link BeanContextFactory} instance that can be used by serializer and parser subclasses
+ * 		to work with beans in a consistent way.
+ * <p>
+ * 	Provides several duplicate convenience methods from the {@link BeanContextFactory} class to set properties on that class from this class.
+ * <p>
+ * 	Also implements the {@link Lockable} interface to allow for easy locking and cloning.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class CoreApi extends Lockable {
+
+	/** The bean context used by this object. */
+	protected transient BeanContextFactory beanContextFactory = new BeanContextFactory();
+	private BeanContext beanContext;
+
+
+	/**
+	 * Returns the current value of the {@code beanContext} setting.
+	 *
+	 * @return The current setting value.
+	 */
+	public final BeanContext getBeanContext() {
+		if (beanContext == null)
+			beanContext = beanContextFactory.getBeanContext();
+		return beanContext;
+	}
+
+	/**
+	 * Sets a property on this class.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return This class (for method chaining).
+	 * @throws LockedException If {@link #lock()} has been called on this object.
+	 */
+	public CoreApi setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		beanContextFactory.setProperty(property, value);
+		return this;
+	}
+
+	/**
+	 * Sets multiple properties on this class.
+	 *
+	 * @param properties The properties to set on this class.
+	 * @return This class (for method chaining).
+	 * @throws LockedException If {@link #lock()} has been called on this object.
+	 */
+	public CoreApi setProperties(ObjectMap properties) throws LockedException {
+		checkLock();
+		beanContextFactory.setProperties(properties);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling <code>getBeanContext().addNotBeanClasses(Class...)</code>.
+	 *
+	 * @see BeanContextFactory#addNotBeanClasses(Class...)
+	 * @param classes The new setting value for the bean context.
+	 * @throws LockedException If {@link BeanContextFactory#lock()} was called on this class or the bean context.
+	 * @return This object (for method chaining).
+	 */
+	public CoreApi addNotBeanClasses(Class<?>...classes) throws LockedException {
+		checkLock();
+		beanContextFactory.addNotBeanClasses(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling <code>getBeanContext().addFilters(Class...)</code>.
+	 *
+	 * @see BeanContextFactory#addFilters(Class...)
+	 * @param classes The new setting value for the bean context.
+	 * @throws LockedException If {@link BeanContextFactory#lock()} was called on this class or the bean context.
+	 * @return This object (for method chaining).
+	 */
+	public CoreApi addFilters(Class<?>...classes) throws LockedException {
+		checkLock();
+		beanContextFactory.addFilters(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling <code>getBeanContext().addImplClass(Class, Class)</code>.
+	 *
+	 * @see BeanContextFactory#addImplClass(Class, Class)
+	 * @param interfaceClass The interface class.
+	 * @param implClass The implementation class.
+	 * @throws LockedException If {@link BeanContextFactory#lock()} was called on this class or the bean context.
+	 * @param <T> The class type of the interface.
+	 * @return This object (for method chaining).
+	 */
+	public <T> CoreApi addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		checkLock();
+		beanContextFactory.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling <code>getBeanContext().setClassLoader(ClassLoader)</code>.
+	 *
+	 * @see BeanContextFactory#setClassLoader(ClassLoader)
+	 * @param classLoader The new classloader.
+	 * @throws LockedException If {@link BeanContextFactory#lock()} was called on this class or the bean context.
+	 * @return This object (for method chaining).
+	 */
+	public CoreApi setClassLoader(ClassLoader classLoader) throws LockedException {
+		checkLock();
+		beanContextFactory.setClassLoader(classLoader);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link BeanContext#object()}.
+	 *
+	 * @return The reusable {@link ClassMeta} for representing the {@link Object} class.
+	 */
+	public ClassMeta<Object> object() {
+		return getBeanContext().object();
+	}
+
+	/**
+	 * Shortcut for calling  {@link BeanContext#string()}.
+	 *
+	 * @return The reusable {@link ClassMeta} for representing the {@link String} class.
+	 */
+	public ClassMeta<String> string() {
+		return getBeanContext().string();
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Lockable */
+	public void checkLock() {
+		super.checkLock();
+		beanContext = null;
+	}
+
+	@Override /* Lockable */
+	public CoreApi lock() {
+		super.lock();
+		beanContextFactory.lock();
+		beanContext = beanContextFactory.getBeanContext();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public CoreApi clone() throws CloneNotSupportedException{
+		CoreApi c = (CoreApi)super.clone();
+		c.beanContextFactory = beanContextFactory.clone();
+		c.beanContext = null;
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.class
new file mode 100755
index 0000000..1099224
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.java
new file mode 100755
index 0000000..27e1b6d
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Delegate.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+/**
+ * An object that represents another object, often wrapping that object.
+ * <p>
+ * <b>*** Internal Interface - Not intended for external use ***</b>
+ * <p>
+ * 	For example, {@link BeanMap} is a map representation of a bean.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The represented class type.
+ */
+public interface Delegate<T> {
+
+	/**
+	 * The {@link ClassMeta} of the class of the represented object.
+	 *
+	 * @return The class type of the represented object.
+	 */
+	public ClassMeta<T> getClassMeta();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.class
new file mode 100755
index 0000000..9ad36e2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.java
new file mode 100755
index 0000000..4353979
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/InvalidDataConversionException.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.text.*;
+
+/**
+ * General invalid conversion exception.
+ * <p>
+ * 	Exception that gets thrown if you try to perform an invalid conversion, such as when calling {@code ObjectMap.getInt(...)} on a non-numeric <code>String</code>.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class InvalidDataConversionException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * @param toType Attempting to convert to this class type.
+	 * @param cause The cause.
+	 * @param value The value being converted.
+	 */
+	public InvalidDataConversionException(Object value, Class<?> toType, Exception cause) {
+		super(MessageFormat.format("Invalid data conversion from type ''{0}'' to type ''{1}''.  Value=''{2}''.", value == null ? null : value.getClass().getName(), toType.getName(), value), cause);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.class
new file mode 100755
index 0000000..0600ad8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.java
new file mode 100755
index 0000000..0b8ecd8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Lockable.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+/**
+ * Superclass of all classes that have a locked state.
+ * <p>
+ * 	Used to mark bean contexts, serializers, and parsers as read-only so that
+ * 	settings can no longer be modified.
+ * <p>
+ * 	Also keeps track of when the object has been cloned and allows for lazy cloning through
+ * 	the {@link #onUnclone()} method.  The idea behind this is that certain expensive fields don't
+ * 	need to be cloned unless the object is actually being modified.
+ * <p>
+ * 	Calling {@link #lock()} on the object causes it to be put into a read-only state.
+ * 	Once called, subsequent calls to {@link #checkLock()} will cause {@link LockedException LockedExceptions}
+ * 		to be thrown.
+ * <p>
+ * 	As a rule, cloned objects are unlocked by default.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class Lockable implements Cloneable {
+
+	private boolean isLocked = false;
+	private boolean isCloned = false;
+
+	/**
+	 * Locks this object so that settings on it cannot be modified.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public Lockable lock() {
+		isLocked = true;
+		return this;
+	}
+
+	/**
+	 * @return <code><jk>true</jk></code> if this object has been locked.
+	 */
+	public boolean isLocked() {
+		return isLocked;
+	}
+
+	/**
+	 * Causes a {@link LockedException} to be thrown if this object has been locked.
+	 * <p>
+	 * 	Also calls {@link #onUnclone()} if this is the first time this method has been called since cloning.
+	 *
+	 * @throws LockedException If {@link #lock()} has been called on this object.
+	 */
+	public void checkLock() throws LockedException {
+		if (isLocked)
+			throw new LockedException();
+		if (isCloned)
+			onUnclone();
+		isCloned = false;
+	}
+
+	/**
+	 * Subclass can override this method to handle lazy-cloning on the first time {@link #checkLock()} is called after
+	 * the object has been cloned.
+	 */
+	public void onUnclone() {}
+
+	/**
+	 * Creates an unlocked clone of this object.
+	 *
+	 * @throws CloneNotSupportedException If class cannot be cloned.
+	 */
+	@Override /* Object */
+	public Lockable clone() throws CloneNotSupportedException {
+		Lockable c = (Lockable)super.clone();
+		c.isLocked = false;
+		c.isCloned = true;
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.class
new file mode 100755
index 0000000..422d647
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.java
new file mode 100755
index 0000000..ce2f31e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/LockedException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+/**
+ * Exception that gets thrown when trying to modify settings on a locked {@link Lockable} object.
+ * <p>
+ * A locked exception indicates a programming error.
+ * Certain objects that are meant for reuse, such as serializers and parsers, provide
+ * the ability to lock the current settings so that they cannot be later changed.
+ * This exception indicates that a setting change was attempted on a previously locked object.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class LockedException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	LockedException() {
+		super("Object is locked and object settings cannot be modified.");
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.class
new file mode 100755
index 0000000..53d21c1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.java
new file mode 100755
index 0000000..c10e07c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/MediaRange.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2013, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * Describes a single type used in content negotiation between an HTTP client and server, as described in
+ * Section 14.1 and 14.7 of RFC2616 (the HTTP/1.1 specification).
+ */
+public final class MediaRange implements Comparable<MediaRange>  {
+
+	private final String type;								// The media type (e.g. "text" for Accept, "utf-8" for Accept-Charset)
+	private final String subType;                   // The media sub-type (e.g. "json" for Accept, not used for Accept-Charset)
+	private final Float qValue;
+	private final Map<String,Set<String>> parameters, extensions;
+
+	/**
+	 * Returns the media type enclosed by this media range.
+	 * <p>
+	 * Examples:
+	 * <ul>
+	 * 	<li><js>"text/html"</js>
+	 * 	<li><js>"text/*"</js>
+	 * 	<li><js>"*\/*"</js>
+	 * </ul>
+	 *
+	 * @return The media type of this media range, lowercased, never <jk>null</jk>.
+	 */
+	public String getMediaType() {
+		return type + "/" + subType;
+	}
+
+	/**
+	 * Return just the type portion of this media range.
+	 *
+	 * @return The type portion of this media range.
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Returns the <js>'q'</js> (quality) value for this type, as described in Section 3.9 of RFC2616.
+	 * <p>
+	 * The quality value is a float between <code>0.0</code> (unacceptable) and <code>1.0</code> (most acceptable).
+	 * <p>
+	 * If 'q' value doesn't make sense for the context (e.g. this range was extracted from a <js>"content-*"</js> header, as opposed to <js>"accept-*"</js>
+	 * header, its value will always be <js>"1"</js>.
+	 *
+	 * @return The 'q' value for this type, never <jk>null</jk>.
+	 */
+	public Float getQValue() {
+		return qValue;
+	}
+
+	/**
+	 * Returns the optional set of parameters associated to the type as returned by {@link #getMediaType()}.
+	 * <p>
+	 * The parameters are those values as described in standardized MIME syntax.
+	 * An example of such a parameter in string form might be <js>"level=1"</js>.
+	 * <p>
+	 * Values are lowercase and never <jk>null</jk>.
+	 *
+	 * @return The optional list of parameters, never <jk>null</jk>.
+	 */
+	public Map<String,Set<String>> getParameters() {
+		return parameters;
+	}
+
+	/**
+	 * Returns the optional set of custom extensions defined for this type.
+	 * <p>
+	 * Values are lowercase and never <jk>null</jk>.
+	 *
+	 * @return The optional list of extensions, never <jk>null</jk>.
+	 */
+	public Map<String,Set<String>> getExtensions() {
+		return extensions;
+	}
+
+	/**
+	 * Provides a string representation of this media range, suitable for use as an <code>Accept</code> header value.
+	 * <p>
+	 * The literal text generated will be all lowercase.
+	 *
+	 * @return A media range suitable for use as an Accept header value, never <code>null</code>.
+	 */
+	@Override /* Object */
+	public String toString() {
+		StringBuffer sb = new StringBuffer().append(type).append('/').append(subType);
+
+		if (! parameters.isEmpty())
+			for (Entry<String,Set<String>> e : parameters.entrySet()) {
+				String k = e.getKey();
+				for (String v : e.getValue())
+					sb.append(';').append(k).append('=').append(v);
+			}
+
+		// '1' is equivalent to specifying no qValue. If there's no extensions, then we won't include a qValue.
+		if (qValue.floatValue() == 1.0) {
+			if (! extensions.isEmpty()) {
+				sb.append(";q=").append(qValue);
+				for (Entry<String,Set<String>> e : extensions.entrySet()) {
+					String k = e.getKey();
+					for (String v : e.getValue())
+						sb.append(';').append(k).append('=').append(v);
+				}
+			}
+		} else {
+			sb.append(";q=").append(qValue);
+			for (Entry<String,Set<String>> e : extensions.entrySet()) {
+				String k = e.getKey();
+				for (String v : e.getValue())
+					sb.append(';').append(k).append('=').append(v);
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified object is also a <code>MediaType</code>, and has the same qValue, type, parameters, and extensions.
+	 *
+	 * @return <jk>true</jk> if object is equivalent.
+	 */
+	@Override /* Object */
+	public boolean equals(Object o) {
+
+		if (o == null || !(o instanceof MediaRange))
+			return false;
+
+		if (this == o)
+			return true;
+
+		MediaRange o2 = (MediaRange) o;
+		return qValue.equals(o2.qValue)
+			&& type.equals(o2.type)
+			&& subType.equals(o2.subType)
+			&& parameters.equals(o2.parameters)
+			&& extensions.equals(o2.extensions);
+	}
+
+	/**
+	 * Returns a hash based on this instance's <code>media-type</code>.
+	 *
+	 * @return A hash based on this instance's <code>media-type</code>.
+	 */
+	@Override /* Object */
+	public int hashCode() {
+		return type.hashCode() + subType.hashCode();
+	}
+
+	/**
+	 * Creates a <code>MediaRange</code> object with the referenced values.
+	 *
+	 * @param type The MIME type of this media range (e.g. <js>"application"</js> in <js>"application/json"</js>)
+	 * @param subType The MIME subtype of this media range (e.g. <js>"json"</js> in <js>"application/json"</js>).
+	 * @param parameters The optional parameters for this range.
+	 * @param qValue The quality value of this range.  Must be between <code>0</code> and <code>1.0</code>.
+	 * @param extensions The optional extensions to this quality value.
+	 */
+	private MediaRange(String type, String subType, Map<String,Set<String>> parameters, Float qValue, Map<String,Set<String>> extensions) {
+		this.type = type;
+		this.subType = subType;
+		this.parameters = (parameters == null ? new TreeMap<String,Set<String>>() : parameters);
+		this.extensions = (extensions == null ? new TreeMap<String,Set<String>>() : extensions);
+		this.qValue = qValue;
+	}
+
+	/**
+	 * Parses an <code>Accept</code> header value into an array of media ranges.
+	 * <p>
+	 * The returned media ranges are sorted such that the most acceptable media is available at ordinal position <js>'0'</js>, and the least acceptable at position n-1.
+	 * <p>
+	 * The syntax expected to be found in the referenced <code>value</code> complies with the syntax described in RFC2616, Section 14.1, as described below:
+	 * <p class='bcode'>
+	 * 	Accept         = "Accept" ":"
+	 * 	                  #( media-range [ accept-params ] )
+	 *
+	 * 	media-range    = ( "*\/*"
+	 * 	                  | ( type "/" "*" )
+	 * 	                  | ( type "/" subtype )
+	 * 	                  ) *( ";" parameter )
+	 * 	accept-params  = ";" "q" "=" qvalue *( accept-extension )
+	 * 	accept-extension = ";" token [ "=" ( token | quoted-string ) ]
+	 * </p>
+	 * This method can also be used on other headers such as <code>Accept-Charset</code> and <code>Accept-Encoding</code>...
+	 * <p class='bcode'>
+	 * 	Accept-Charset = "Accept-Charset" ":"
+	 * 	1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
+	 * </p>
+	 *
+	 * @param value The value to parse.  If <jk>null</jk> or empty, returns a single <code>MediaRange</code> is returned that represents all types.
+	 * @return The media ranges described by the string.
+	 * 	The ranges are sorted such that the most acceptable media is available at ordinal position <js>'0'</js>, and the least acceptable at position n-1.
+	 */
+	public static MediaRange[] parse(String value) {
+
+		Set<MediaRange> ranges = new TreeSet<MediaRange>();
+
+		if (value == null || value.length() == 0)
+			return new MediaRange[]{new MediaRange("*", "*", null, 1f, null)};
+
+		value = value.toLowerCase(Locale.ENGLISH);
+
+		for (String r : value.trim().split("\\s*,\\s*")) {
+			r = r.trim();
+
+			if (r.isEmpty())
+				continue;
+
+			String[] tokens = r.split("\\s*;\\s*");
+
+			tokens[0] = tokens[0].replace(' ', '+');
+
+			// There is at least a type.
+			String[] t = tokens[0].split("/");
+			String type = t[0], subType = (t.length == 1 ? "*" : t[1]);
+
+			// Only the type of the range is specified
+			if (tokens.length == 1) {
+				ranges.add(new MediaRange(type, subType, null, 1f, null));
+				continue;
+			}
+
+			Float qValue = 1f;
+			Map<String,Set<String>> params = new TreeMap<String,Set<String>>();
+			Map<String,Set<String>> exts = new TreeMap<String,Set<String>>();
+
+			boolean isInExtensions = false;
+			for (int i = 1; i < tokens.length; i++) {
+				String[] parm = tokens[i].split("\\s*=\\s*");
+				if (parm.length == 2) {
+					String k = parm[0], v = parm[1];
+					if (isInExtensions) {
+						if (! exts.containsKey(parm[0]))
+							exts.put(parm[0], new TreeSet<String>());
+						exts.get(parm[0]).add(parm[1]);
+					} else if (k.equals("q")) {
+						qValue = new Float(v);
+						isInExtensions = true;
+					} else /*(! isInExtensions)*/ {
+						if (! params.containsKey(parm[0]))
+							params.put(parm[0], new TreeSet<String>());
+						params.get(parm[0]).add(parm[1]);
+					}
+				}
+			}
+
+			ranges.add(new MediaRange(type, subType, params, qValue, exts));
+		}
+
+		return ranges.toArray(new MediaRange[ranges.size()]);
+	}
+
+	/**
+	 * Compares two MediaRanges for equality.
+	 * <p>
+	 * The values are first compared according to <code>qValue</code> values.
+	 * Should those values be equal, the <code>type</code> is then lexicographically compared (case-insensitive) in ascending order,
+	 * 	with the <js>"*"</js> type demoted last in that order.
+	 * <code>MediaRanges</code> with the same type but different sub-types are compared - a more specific subtype is
+	 * 	promoted over the 'wildcard' subtype.
+	 * <code>MediaRanges</code> with the same types but with extensions are promoted over those same types with no extensions.
+	 *
+	 * @param o The range to compare to.  Never <jk>null</jk>.
+	 */
+	@Override /* Comparable */
+	public int compareTo(MediaRange o) {
+
+		// Compare q-values.
+		int qCompare = Float.compare(o.qValue, qValue);
+		if (qCompare != 0)
+			return qCompare;
+
+		// Compare media-types.
+		// Note that '*' comes alphabetically before letters, so just do a reverse-alphabetical comparison.
+		int i = o.type.compareTo(type);
+		if (i == 0)
+			i = o.subType.compareTo(subType);
+		return i;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified <code>MediaRange</code> matches this range.
+	 * <p>
+	 * This implies the types and subtypes are the same as or encompasses the other (e.g. <js>'application/xml'</js> and <js>'application/*'</js>).
+	 *
+	 * @param o The other media rage.
+	 * @return <jk>true</jk> if the media ranges are the same or one encompasses the other.
+	 */
+	public boolean matches(MediaRange o) {
+		if (this == o)
+			return true;
+
+		if (qValue == 0 || o.qValue == 0)
+			return false;
+
+		if (type.equals(o.type) || (type.equals("*")) || (o.type.equals("*")))
+			if (subType.equals(o.subType) || subType.equals("*") || o.subType.equals("*"))
+				return true;
+
+		return false;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$1.class
new file mode 100755
index 0000000..cb9fa76
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2$1.class
new file mode 100755
index 0000000..229273b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2.class
new file mode 100755
index 0000000..5dba15e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.class
new file mode 100755
index 0000000..3204758
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.java
new file mode 100755
index 0000000..74f00b0
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectList.java
@@ -0,0 +1,447 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Java implementation of a JSON array.
+ * <p>
+ * 	An extension of {@link LinkedList}, so all methods available to in that class are also available
+ * 	to this class.
+ * <p>
+ * 	Note that the use of this class is optional.  The serializers will accept any objects that implement
+ * 	the {@link Collection} interface.  But this class provides some useful additional functionality
+ * 	when working with JSON models constructed from Java Collections Framework objects.  For example, a
+ * 	constructor is provided for converting a JSON array string directly into a {@link List}.  It also contains
+ * 	accessor methods for to avoid common typecasting when accessing elements in a list.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct an empty List</jc>
+ * 	List l = <jk>new</jk> ObjectList();
+ *
+ * 	<jc>// Construct a list of objects using various methods</jc>
+ * 	l = <jk>new</jk> ObjectList().append(<js>"foo"</js>).append(123).append(<jk>true</jk>);
+ * 	l = <jk>new</jk> ObjectList().append(<js>"foo"</js>, 123, <jk>true</jk>);  <jc>// Equivalent</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"foo"</js>, 123, <jk>true</jk>);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Construct a list of integers from JSON</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
+ *
+ * 	<jc>// Construct a list of generic ObjectMap objects from JSON</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[{foo:'bar'},{baz:'bing'}]"</js>);
+ *
+ * 	<jc>// Construct a list of integers from XML</jc>
+ * 	String xml = <js>"&lt;array&gt;&lt;number&gt;1&lt;/number&gt;&lt;number&gt;2&lt;/number&gt;&lt;number&gt;3&lt;/number&gt;&lt;/array&gt;"</js>;
+ * 	l = <jk>new</jk> ObjectList(xml, DataFormat.<jsf>XML</jsf>);
+ * 	l = (List)XmlParser.<jsf>DEFAULT</jsf>.parse(xml);  <jc>// Equivalent</jc>
+ * 	l = (List)XmlParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, xml);  <jc>// Equivalent</jc>
+ * 	l = XmlParser.<jsf>DEFAULT</jsf>.parse(List.<jk>class</jk>, xml);  <jc>// Equivalent</jc>
+ * 	l = XmlParser.<jsf>DEFAULT</jsf>.parse(ObjectList.<jk>class</jk>, xml);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Construct JSON from ObjectList</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[{foo:'bar'},{baz:'bing'}]"</js>);
+ * 	String json = l.toString();  <jc>// Produces "[{foo:'bar'},{baz:'bing'}]"</jc>
+ * 	json = l.toString(JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>);  <jc>// Equivalent</jc>
+ * 	json = JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>.serialize(l);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get one of the entries in the list as an Integer</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
+ * 	Integer i = l.getInt(1);
+ * 	i = l.get(Integer.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get one of the entries in the list as an Float</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
+ * 	Float f = l.getFloat(1); <jc>// Returns 2f </jc>
+ * 	f = l.get(Float.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Same as above, except converted to a String</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
+ * 	String s = l.getString(1); <jc>// Returns "2" </jc>
+ * 	s = l.get(String.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get one of the entries in the list as a bean (converted to a bean if it isn't already one)</jc>
+ * 	l = <jk>new</jk> ObjectList(<js>"[{name:'John Smith',age:45}]"</js>);
+ * 	Person p = l.get(Person.<jk>class</jk>, 0);
+ *
+ * 	<jc>// Iterate over a list of beans using the elements() method</jc>
+ * 	ObjectList ObjectList = <jk>new</jk> ObjectList(<js>"[{name:'John Smith',age:45}]"</js>);
+ * 	<jk>for</jk> (Person p : ObjectList.elements(Person.<jk>class</jk>) {
+ * 		<jc>// Do something with p</jc>
+ * 	}
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ObjectList extends LinkedList<Object> {
+	private static final long serialVersionUID = 1L;
+
+	private transient BeanContext beanContext = BeanContext.DEFAULT;
+
+	/**
+	 * An empty read-only ObjectList.
+	 */
+	public static final ObjectList EMPTY_LIST = new ObjectList() {
+		private static final long serialVersionUID = 1L;
+
+		@Override /* List */
+		public void add(int location, Object object) {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override /* List */
+		public ListIterator<Object> listIterator(final int location) {
+			return Collections.emptyList().listIterator(location);
+		}
+
+		@Override /* List */
+		public Object remove(int location) {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override /* List */
+		public Object set(int location, Object object) {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override /* List */
+		public List<Object> subList(int start, int end) {
+			return Collections.emptyList().subList(start, end);
+		}
+	};
+
+	/**
+	 * Construct a JSON array directly from text using the specified parser.
+	 *
+	 * @param s The string being parsed.
+	 * @param p The parser to use to parse the input.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public ObjectList(CharSequence s, ReaderParser p) throws ParseException {
+		this(p == null ? BeanContext.DEFAULT : p.getBeanContext());
+		try {
+			if (p == null)
+				p = JsonParser.DEFAULT;
+			if (s != null)
+				p.parseIntoCollection(new CharSequenceReader(s), s.length(), this, beanContext.object());
+		} catch (IOException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/**
+	 * Shortcut for <code><jk>new</jk> ObjectList(String,JsonParser.<jsf>DEFAULT</jsf>);</code>
+	 *
+	 * @param s The string being parsed.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public ObjectList(CharSequence s) throws ParseException {
+		this(s, null);
+	}
+
+	/**
+	 * Construct a JSON array directly from a reader using the specified parser.
+	 *
+	 * @param r The reader to read from.  Will automatically be wrapped in a {@link BufferedReader} if it isn't already a BufferedReader.
+	 * @param p The parser to use to parse the input.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public ObjectList(Reader r, ReaderParser p) throws ParseException, IOException {
+		parseReader(r, p);
+	}
+
+	private void parseReader(Reader r, ReaderParser p) throws IOException, ParseException {
+		if (p == null)
+			p = JsonParser.DEFAULT;
+		p.parseIntoCollection(r, -1, this, beanContext.object());
+	}
+
+	/**
+	 * Construct an empty JSON array. (i.e. an empty {@link LinkedList}).
+	 */
+	public ObjectList() {
+		this(BeanContext.DEFAULT);
+	}
+
+	/**
+	 * Construct an empty JSON array with the specified bean context. (i.e. an empty {@link LinkedList}).
+	 *
+	 * @param beanContext The bean context to associate with this object list for creating beans.
+	 */
+	public ObjectList(BeanContext beanContext) {
+		super();
+		this.beanContext = beanContext;
+	}
+
+	/**
+	 * Construct a JSON array and fill it with the specified objects.
+	 *
+	 * @param o A list of objects to add to this list.
+	 */
+	public ObjectList(Object... o) {
+		super(Arrays.asList(o));
+	}
+
+	/**
+	 * Construct a JSON array and fill it with the specified collection of objects.
+	 *
+	 * @param c A list of objects to add to this list.
+	 */
+	public ObjectList(Collection<?> c) {
+		super(c);
+	}
+
+	/**
+	 * Override the default bean context used for converting POJOs.
+	 * <p>
+	 * Default is {@link BeanContext#DEFAULT}, which is sufficient in most cases.
+	 * <p>
+	 * Useful if you're serializing/parsing beans with filters defined.
+	 *
+	 * @param beanContext The new bean context.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectList setBeanContext(BeanContext beanContext) {
+		this.beanContext = beanContext;
+		return this;
+	}
+
+	/**
+	 * Convenience method for adding multiple objects to this list.
+	 * @param o The objects to add to the list.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectList append(Object...o) {
+		for (Object o2 : o)
+			add(o2);
+		return this;
+	}
+
+	/**
+	 * Get the entry at the specified index, converted to the specified type (if possible).
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param type The type of object to convert the entry to.
+	 * @param index The index into this list.
+	 * @param <T> The type of object to convert the entry to.
+	 * @return The converted entry.
+	 */
+	public <T> T get(Class<T> type, int index) {
+		return beanContext.convertToType(get(index), type);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(String.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 */
+	public String getString(int index) {
+		return get(String.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(Integer.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer getInt(int index) {
+		return get(Integer.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(Boolean.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean getBoolean(int index) {
+		return get(Boolean.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(Long.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long getLong(int index) {
+		return get(Long.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(Map.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> getMap(int index) {
+		return get(Map.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(List.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> getList(int index) {
+		return get(List.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(ObjectMap.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap getObjectMap(int index) {
+		return get(ObjectMap.class, index);
+	}
+
+	/**
+	 * Shortcut for calling <code>get(ObjectList.<jk>class</jk>, index)</code>.
+	 *
+	 * @param index The index.
+	 * @return The converted value.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList getObjectList(int index) {
+		return get(ObjectList.class, index);
+	}
+
+	/**
+	 * Creates an {@link Iterable} with elements of the specified child type.
+	 * <p>
+	 * Attempts to convert the child objects to the correct type if they aren't already the correct type.
+	 * <p>
+	 * The <code>next()</code> method on the returned iterator may throw a {@link InvalidDataConversionException} if
+	 * 	the next element cannot be converted to the specified type.
+	 * <p>
+	 * See {@link BeanContext#convertToType(Object, ClassMeta)} for a description of valid conversions.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Iterate over a list of ObjectMaps.</jc>
+	 * 	ObjectList l = <jk>new</jk> ObjectList(<js>"[{foo:'bar'},{baz:123}]"</js>);
+	 * 	for (ObjectMap m : l.elements(ObjectMap.<jk>class</jk>)) {
+	 * 		<jc>// Do something with m.</jc>
+	 * 	}
+	 *
+	 * 	<jc>// Iterate over a list of ints.</jc>
+	 * 	ObjectList l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
+	 * 	for (Integer i : l.elements(Integer.<jk>class</jk>)) {
+	 * 		<jc>// Do something with i.</jc>
+	 * 	}
+	 *
+	 * 	<jc>// Iterate over a list of beans.</jc>
+	 * 	<jc>// Automatically converts to beans.</jc>
+	 * 	ObjectList l = <jk>new</jk> ObjectList(<js>"[{name:'John Smith',age:45}]"</js>);
+	 * 	for (Person p : l.elements(Person.<jk>class</jk>)) {
+	 * 		<jc>// Do something with p.</jc>
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <E> The child object type.
+	 * @param childType The child object type.
+	 * @return A new <code>Iterable</code> object over this list.
+	 */
+	public <E> Iterable<E> elements(final Class<E> childType) {
+		final Iterator<?> i = iterator();
+		return new Iterable<E>() {
+
+			@Override /* Iterable */
+			public Iterator<E> iterator() {
+				return new Iterator<E>() {
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i.hasNext();
+					}
+
+					@Override /* Iterator */
+					public E next() {
+						return beanContext.convertToType(i.next(), childType);
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						i.remove();
+					}
+
+				};
+			}
+		};
+	}
+
+	/**
+	 * Returns the {@link ClassMeta} of the class of the object at the specified index.
+	 *
+	 * @param index An index into this list, zero-based.
+	 * @return The data type of the object at the specified index, or <jk>null</jk> if the value is null.
+	 */
+	public ClassMeta<?> getClassMeta(int index) {
+		return beanContext.getClassMetaForObject(get(index));
+	}
+
+	/**
+	 * Serialize this array to a string using the specified serializer.
+	 *
+	 * @param serializer The serializer to use to convert this object to a string.
+	 * @return This object as a serialized string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public String toString(WriterSerializer serializer) throws SerializeException {
+		return serializer.serialize(this);
+	}
+
+	/**
+	 * Serialize this array to JSON using the {@link JsonSerializer#DEFAULT} serializer.
+	 */
+	@Override /* Object */
+	public String toString() {
+		try {
+			return this.toString(JsonSerializer.DEFAULT_LAX);
+		} catch (SerializeException e) {
+			return e.getLocalizedMessage();
+		}
+	}
+
+	/**
+	 * Convenience method for serializing this ObjectList to the specified Writer using
+	 * the JsonSerializer.DEFAULT serializer.
+	 *
+	 * @param w The writer to send the serialized contents of this object.
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public void serializeTo(Writer w) throws IOException, SerializeException {
+		JsonSerializer.DEFAULT.serialize(this);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$1.class
new file mode 100755
index 0000000..a58f23d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1$1.class
new file mode 100755
index 0000000..57b81a7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1.class
new file mode 100755
index 0000000..0ccaec1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2.class
new file mode 100755
index 0000000..777a312
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.class
new file mode 100755
index 0000000..5ed2e03
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.class differ


[28/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.java
new file mode 100755
index 0000000..1a70876
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ObjectMap.java
@@ -0,0 +1,1282 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.filters.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Java implementation of a JSON object.
+ * <p>
+ * 	An extension of {@link LinkedHashMap}, so all methods available in that class are also available
+ * 	to this class.
+ * <p>
+ * 	Note that the use of this class is optional.  The serializers will accept any objects that implement
+ * 	the {@link java.util.Map} interface.  But this class provides some useful additional functionality
+ * 	when working with JSON models constructed from Java Collections Framework objects.  For example, a
+ * 	constructor is provided for converting a JSON object string directly into a {@link Map}.  It also contains
+ * 	accessor methods for to avoid common typecasting when accessing elements in a list.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct an empty Map</jc>
+ * 	Map m = <jk>new</jk> ObjectMap();
+ *
+ * 	<jc>// Construct a Map from JSON</jc>
+ * 	String json = <js>"{a:'A',b:{c:'C',d:123}}"</js>;
+ * 	m = <jk>new</jk> ObjectMap(json);
+ *
+ * 	<jc>// Construct a Map using the append method</jc>
+ * 	m = <jk>new</jk> ObjectMap().append(<js>"foo"</js>,<js>"x"</js>).append(<js>"bar"</js>,123).append(<js>"baz"</js>,<jk>true</jk>);
+ *
+ * 	<jc>// Construct a Map from XML generated by XmlSerializer</jc>
+ * 	String xml = <js>"&lt;object&gt;&lt;a type='string'&gt;A&lt;/a&gt;&lt;b type='object'&gt;&lt;c type='string'&gt;C&lt;/c&gt;&lt;d type='number'&gt;123&lt;/d&gt;&lt;/b&gt;&lt;/object&gt;"</js>;
+ * 	m = <jk>new</jk> ObjectMap(xml, DataFormat.<jsf>XML</jsf>);
+ * 	m = (Map)XmlParser.<jsf>DEFAULT</jsf>.parse(xml); <jc>// Equivalent</jc>
+ * 	m = (Map)XmlParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ * 	m = XmlParser.<jsf>DEFAULT</jsf>.parse(Map.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ * 	m = XmlParser.<jsf>DEFAULT</jsf>.parse(ObjectMap.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Construct a Map from a URL GET parameter string generated by UrlEncodingParser</jc>
+ * 	String urlParams = <js>"?a='A'&amp;b={c:'C',d:123}"</js>;
+ * 	m = <jk>new</jk> ObjectMap(urlParams, DataFormat.<jsf>URLPARAM</jsf>);
+ * 	m = (Map)UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ * 	m = UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(Map.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ * 	m = UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(ObjectMap.<jk>class</jk>, xml); <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Construct JSON from ObjectMap</jc>
+ * 	m = <jk>new</jk> ObjectMap(<js>"{foo:'bar'},{baz:[123,true]}"</js>);
+ * 	json = m.toString();  <jc>// Produces "{foo:'bar'},{baz:[123,true]}"</jc>
+ * 	json = m.toString(JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>);  <jc>// Equivalent</jc>
+ * 	json = JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>.serialize(m);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get a map entry as an Integer</jc>
+ * 	m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
+ * 	Integer i = m.getInt(<js>"foo"</js>);
+ * 	i = m.get(Integer.<jk>class</jk>, <js>"foo"</js>);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get a map entry as a Float</jc>
+ * 	m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
+ * 	Float f = m.getFloat(<js>"foo"</js>);
+ * 	f = m.get(Float.<jk>class</jk>, <js>"foo"</js>);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Same as above, except converted to a String</jc>
+ * 	m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
+ * 	String s = m.getString(<js>"foo"</js>); <jc>// Returns "123"</jc>
+ * 	s = m.get(String.<jk>class</jk>, <js>"foo"</js>);  <jc>// Equivalent</jc>
+ *
+ * 	<jc>// Get one of the entries in the list as a bean (converted to a bean if it isn't already one)</jc>
+ * 	m = <jk>new</jk> ObjectMap(<js>"{person:{name:'John Smith',age:45}}"</js>);
+ * 	Person p = m.get(Person.<jk>class</jk>, <js>"person"</js>);
+ *
+ * 	<jc>// Add an inner map</jc>
+ * 	ObjectMap m1 = <jk>new</jk> ObjectMap(<js>"{a:1}"</js>);
+ * 	ObjectMap m2 = <jk>new</jk> ObjectMap(<js>"{b:2}"</js>).setInner(m1);
+ * 	<jk>int</jk> a = m2.getInt(<js>"a"</js>);  <jc>// a == 1 </jc>
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class ObjectMap extends LinkedHashMap<String,Object> {
+	private static final long serialVersionUID = 1L;
+
+	private transient BeanContext beanContext = BeanContext.DEFAULT;
+	private ObjectMap inner;
+
+	/**
+	 * An empty read-only ObjectMap.
+	 */
+	public static final ObjectMap EMPTY_MAP = new ObjectMap() {
+
+		private static final long serialVersionUID = 1L;
+
+		@Override /* Map */
+		@SuppressWarnings("unchecked")
+		public Set<Map.Entry<String,Object>> entrySet() {
+			return Collections.EMPTY_MAP.entrySet();
+		}
+
+		@Override /* Map */
+		@SuppressWarnings("unchecked")
+		public Set<String> keySet() {
+			return Collections.EMPTY_MAP.keySet();
+		}
+
+		@Override /* Map */
+		public Object put(String key, Object value) {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override /* Map */
+		public Object remove(Object key) {
+			throw new UnsupportedOperationException();
+		}
+
+		@Override /* Map */
+		public Collection<Object> values() {
+			return Collections.emptyMap().values();
+		}
+	};
+
+	/**
+	 * Construct an ObjectMap directly from a string using the specified parser.
+	 *
+	 * @param s The string being parsed.
+	 * @param p The parser to use to parse the input.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public ObjectMap(CharSequence s, ReaderParser p) throws ParseException {
+		this(p == null ? BeanContext.DEFAULT : p.getBeanContext());
+		try {
+			if (p == null)
+				p = JsonParser.DEFAULT;
+			if (s != null)
+				p.parseIntoMap(new CharSequenceReader(s), s.length(), this, beanContext.string(), beanContext.object());
+		} catch (IOException e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/**
+	 * Shortcut for <code><jk>new</jk> ObjectMap(string,JsonParser.<jsf>DEFAULT</jsf>);</code>
+	 *
+	 * @param s The JSON text to parse.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public ObjectMap(CharSequence s) throws ParseException {
+		this(s, null);
+	}
+
+	/**
+	 * Construct an ObjectMap directly from a reader using the specified parser.
+	 *
+	 * @param r The reader to read from.  The reader will be wrapped in a {@link BufferedReader} if it isn't already.
+	 * @param p The parser to use to parse the input.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public ObjectMap(Reader r, ReaderParser p) throws ParseException, IOException {
+		parseReader(r, p);
+	}
+
+	/**
+	 * Shortcut for <code><jk>new</jk> ObjectMap(reader, JsonParser.<jsf>DEFAULT</jsf>)</code>.
+	 *
+	 * @param r The reader to read from.  The reader will be wrapped in a {@link BufferedReader} if it isn't already.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public ObjectMap(Reader r) throws ParseException, IOException {
+		parseReader(r, JsonParser.DEFAULT);
+	}
+
+	private void parseReader(Reader r, ReaderParser p) throws IOException, ParseException {
+		if (p == null)
+			p = JsonParser.DEFAULT;
+		p.parseIntoMap(r, -1, this, beanContext.string(), beanContext.object());
+	}
+
+	/**
+	 * Construct an empty JSON object (i.e. an empty {@link LinkedHashMap}).
+	 */
+	public ObjectMap() {
+		this(BeanContext.DEFAULT);
+	}
+
+	/**
+	 * Construct an empty JSON object (i.e. an empty {@link LinkedHashMap}) with the specified bean context.
+	 *
+	 * @param beanContext The bean context to use for creating beans.
+	 */
+	public ObjectMap(BeanContext beanContext) {
+		super();
+		this.beanContext = beanContext;
+	}
+
+	/**
+	 * Construct a JSON object and fill it with the contents from the specified {@link Map}.
+	 *
+	 * @param m The map whose entries will be copied into this map.
+	 */
+	public ObjectMap(Map<?,?> m) {
+		super();
+		for (Map.Entry<?,?> e : m.entrySet())
+			put(e.getKey().toString(), e.getValue());
+	}
+
+	/**
+	 * Set an inner map in this map to allow for chained get calls.
+	 * <p>
+	 * If {@link #get(Object)} returns <jk>null</jk>, then {@link #get(Object)} will be called on the inner map.
+	 * <p>
+	 * In addition to providing the ability to chain maps, this method also provides the ability
+	 * to wrap an existing map inside another map so that you can add entries to the outer
+	 * map without affecting the values on the inner map.
+	 * <p class='bcode'>
+	 * 	ObjectMap m1 = <jk>new</jk> ObjectMap(<js>"{foo:1}"</js>);
+	 * 	ObjectMap m2 = <jk>new</jk> ObjectMap().setInner(m1);
+	 * 	m2.put(<js>"foo"</js>, 2);                      <jc>// Overwrite the entry</jc>
+	 * 	<jk>int</jk> foo1 = m1.getInt(<js>"foo"</js>);           <jc>// foo1 == 1 </jc>
+	 * 	<jk>int</jk> foo2 = m2.getInt(<js>"foo"</js>);           <jc>// foo2 == 2 </jc>
+	 * </p>
+	 *
+	 * @param inner The inner map.
+	 * 	Can be <jk>null</jk> to remove the inner map from an existing map.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectMap setInner(ObjectMap inner) {
+		this.inner = inner;
+		return this;
+	}
+
+	/**
+	 * Searches for the specified key in this map ignoring case.
+	 *
+	 * @param key The key to search for.  For performance reasons, it's preferrable that the key be all lowercase.
+	 * @return The key, or <jk>null</jk> if map does not contain this key.
+	 */
+	public String findKeyIgnoreCase(String key) {
+		for (String k : keySet())
+			if (key.equalsIgnoreCase(k))
+				return k;
+		return null;
+	}
+
+
+	/**
+	 * Returns the inner map if one was set through {@link #setInner(ObjectMap)}.
+	 *
+	 * @return The inner map if one was set through {@link #setInner(ObjectMap)}, or <jk>null</jk> if no inner map is present.
+	 */
+	public ObjectMap getInner() {
+		return inner;
+	}
+
+	/**
+	 * Override the default bean context used for converting POJOs.
+	 * <p>
+	 * Default is {@link BeanContext#DEFAULT}, which is sufficient in most cases.
+	 * <p>
+	 * Useful if you're serializing/parsing beans with filters defined.
+	 *
+	 * @param beanContext The new bean context.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectMap setBeanContext(BeanContext beanContext) {
+		this.beanContext = beanContext;
+		return this;
+	}
+
+	/**
+	 * Returns the {@link BeanContext} currently associated with this map.
+	 *
+	 * @return The {@link BeanContext} currently associated with this map.
+	 */
+	public BeanContext getBeanContext() {
+		return beanContext;
+	}
+
+	/**
+	 * Convenience method for adding multiple objects to this map.
+	 * <p>
+	 * 	Equivalent to calling {@code put(key, value)}, but returns
+	 * 	this map so that the method can be chained.
+	 *
+	 * @param key The key.
+	 * @param value The value.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectMap append(String key, Object value) {
+		put(key, value);
+		return this;
+	}
+
+	@Override /* Map */
+	public Object get(Object key) {
+		Object o = super.get(key);
+		if (o == null && inner != null)
+			o = inner.get(key);
+		return o;
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but returns the default value if the key
+	 * could not be found.
+	 *
+	 * @param key The key.
+	 * @param def The default value if the entry doesn't exist.
+	 * @return The value, or the default value if the entry doesn't exist.
+	 */
+	public Object get(String key, Object def) {
+		Object o = get(key);
+		return (o == null ? def : o);
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but casts or converts the value to the specified class type.
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param <T> The class type.
+	 * @param type The class type.
+	 * @param key The key.
+	 * @return The value, or <jk>null</jk> if the entry doesn't exist.
+	 */
+	public <T> T get(Class<T> type, String key) {
+		return get(type, key, null);
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but converts the raw value to the specified class type using the specified filter.
+	 *
+	 * @param <T> The filtered class type.
+	 * @param filter The filter class used to convert the raw type to a filtered type.
+	 * @param key The key.
+	 * @return The value, or <jk>null</jk> if the entry doesn't exist.
+	 * @throws ParseException Thrown by the filter if a problem occurred trying to parse the value.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public <T> T get(PojoFilter<T,?> filter, String key) throws ParseException {
+		Object o = super.get(key);
+		if (o == null)
+			return null;
+		PojoFilter f = filter;
+		return (T)f.unfilter(o, null);
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but casts or converts the value to the specified class type.
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param <T> The class type.
+	 * @param type The class type.
+	 * @param key The key.
+	 * @param def The default value if the entry doesn't exist.
+	 * @return The value, or the default value if the entry doesn't exist.
+	 */
+	public <T> T get(Class<T> type, String key, T def) {
+		Object o = get(key);
+		if (o == null)
+			return def;
+		T t = beanContext.convertToType(o, type);
+		if (t == null)
+			return def;
+		return t;
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but casts or converts the value to the specified class type.
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param <T> The class type.
+	 * @param type The class type.
+	 * @param key The key.
+	 * @return The value, or the default value if the entry doesn't exist.
+	 */
+	public <T> T get(ClassMeta<T> type, String key) {
+		return get(type, key, null);
+	}
+
+	/**
+	 * Same as {@link Map#get(Object) get()}, but casts or converts the value to the specified class type.
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param <T> The class type.
+	 * @param type The class type.
+	 * @param key The key.
+	 * @param def The default value if the entry doesn't exist.
+	 * @return The value, or the default value if the entry doesn't exist.
+	 */
+	public <T> T get(ClassMeta<T> type, String key, T def) {
+		Object o = get(key);
+		if (o == null)
+			return def;
+		return beanContext.convertToType(o, type);
+	}
+
+	/**
+	 * Returns the value for the first key in the list that has an entry in this map.
+	 *
+	 * @param keys The keys to look up in order.
+	 * @return The value of the first entry whose key exists, or <jk>null</jk> if none of the keys exist in this map.
+	 */
+	public Object find(String...keys) {
+		for (String key : keys)
+			if (containsKey(key))
+				return get(key);
+		return null;
+	}
+
+	/**
+	 * Returns the value for the first key in the list that has an entry in this map.
+	 * <p>
+	 * 	Casts or converts the value to the specified class type.
+	 * <p>
+	 * 	See {@link BeanContext#convertToType(Object, ClassMeta)} for the list of valid data conversions.
+	 *
+	 * @param type The class type to convert the value to.
+	 * @param <T> The class type to convert the value to.
+	 * @param keys The keys to look up in order.
+	 * @return The value of the first entry whose key exists, or <jk>null</jk> if none of the keys exist in this map.
+	 */
+	public <T> T find(Class<T> type, String...keys) {
+		for (String key : keys)
+			if (containsKey(key))
+				return get(type, key);
+		return null;
+	}
+
+	/**
+	 * Convenience method for inserting JSON directly into an attribute on this object.
+	 * <p>
+	 * 	The JSON text can be an object (i.e. <js>"{...}"</js>) or an array (i.e. <js>"[...]"</js>).
+	 *
+	 * @param key The key.
+	 * @param json The JSON text that will be parsed into an Object and then inserted into this map.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 */
+	public void putJson(String key, String json) throws ParseException {
+		this.put(key, JsonParser.DEFAULT.parse(json, Object.class));
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link String}.
+	 * <p>
+	 * 	Shortcut for <code>get(String.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 */
+	public String getString(String key) {
+		return get(String.class, key);
+	}
+
+	/**
+	 * Specialized method that calls {@link #getString(String)} and splits the
+	 * 	results as a simple comma-delimited list.
+	 *
+	 * @param key the key.
+	 * @return A list of tokens, trimmed of whitespace.  An empty list if entry not found.  Never <jk>null</jk>.
+	 */
+	public String[] getStringArray(String key) {
+		String s = get(String.class, key);
+		return (s == null ? new String[0] : StringUtils.split(s, ','));
+	}
+
+	/**
+	 * Same as {@link #getStringArray(String)} but returns a default value if the value cannot be found.
+	 *
+	 * @param key The map key.
+	 * @param def The default value if value is not found.
+	 * @return The value converted to a string array.
+	 */
+	public String[] getStringArray(String key, String[] def) {
+		String s = get(String.class, key);
+		String[] r = (s == null ? new String[0] : StringUtils.split(s, ','));
+		return (r.length == 0 ? def : r);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link String}.
+	 * <p>
+	 * 	Shortcut for <code>get(String.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 */
+	public String getString(String key, String defVal) {
+		return get(String.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to an {@link Integer}.
+	 * <p>
+	 * 	Shortcut for <code>get(Integer.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer getInt(String key) {
+		return get(Integer.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to an {@link Integer}.
+	 * <p>
+	 * 	Shortcut for <code>get(Integer.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer getInt(String key, Integer defVal) {
+		return get(Integer.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Long}.
+	 * <p>
+	 * 	Shortcut for <code>get(Long.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long getLong(String key) {
+		return get(Long.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Long}.
+	 * <p>
+	 * 	Shortcut for <code>get(Long.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long getLong(String key, Long defVal) {
+		return get(Long.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Boolean}.
+	 * <p>
+	 * 	Shortcut for <code>get(Boolean.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean getBoolean(String key) {
+		return get(Boolean.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Boolean}.
+	 * <p>
+	 * 	Shortcut for <code>get(Boolean.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean getBoolean(String key, Boolean defVal) {
+		return get(Boolean.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(Map.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> getMap(String key) {
+		return get(Map.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(Map.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> getMap(String key, Map<?,?> defVal) {
+		return get(Map.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link List}.
+	 * <p>
+	 * 	Shortcut for <code>get(List.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> getList(String key) {
+		return get(List.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link List}.
+	 * <p>
+	 * 	Shortcut for <code>get(List.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> getList(String key, List<?> defVal) {
+		return get(List.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectMap.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap getObjectMap(String key) {
+		return get(ObjectMap.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectMap}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectMap.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap getObjectMap(String key, ObjectMap defVal) {
+		return get(ObjectMap.class, key, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectList}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectList.<jk>class</jk>, key)</code>.
+	 *
+	 * @param key The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList getObjectList(String key) {
+		return get(ObjectList.class, key);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectList}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectList.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList getObjectList(String key, ObjectList defVal) {
+		return get(ObjectList.class, key, defVal);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link String}.
+	 * <p>
+	 * 	Shortcut for <code>find(String.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 */
+	public String findString(String... keys) {
+		return find(String.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to an {@link Integer}.
+	 * <p>
+	 * 	Shortcut for <code>find(Integer.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer findInt(String... keys) {
+		return find(Integer.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link Long}.
+	 * <p>
+	 * 	Shortcut for <code>find(Long.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long findLong(String... keys) {
+		return find(Long.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link Boolean}.
+	 * <p>
+	 * 	Shortcut for <code>find(Boolean.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean findBoolean(String... keys) {
+		return find(Boolean.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>find(Map.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> findMap(String... keys) {
+		return find(Map.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link List}.
+	 * <p>
+	 * 	Shortcut for <code>find(List.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> findList(String... keys) {
+		return find(List.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link ObjectMap}.
+	 * <p>
+	 * 	Shortcut for <code>find(ObjectMap.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap findObjectMap(String... keys) {
+		return find(ObjectMap.class, keys);
+	}
+
+	/**
+	 * Returns the first entry that exists converted to a {@link ObjectList}.
+	 * <p>
+	 * 	Shortcut for <code>find(ObjectList.<jk>class</jk>, keys)</code>.
+	 *
+	 * @param keys The list of keys to look for.
+	 * @return The converted value of the first key in the list that has an entry in this map,
+	 * 	or <jk>null</jk> if the map contains no mapping for any of the keys.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList findObjectList(String... keys) {
+		return find(ObjectList.class, keys);
+	}
+
+	/**
+	 * Returns the first key in the map.
+	 *
+	 * @return The first key in the map, or <jk>null</jk> if the map is empty.
+	 */
+	public String getFirstKey() {
+		return isEmpty() ? null : keySet().iterator().next();
+	}
+
+	/**
+	 * Returns the class type of the object at the specified index.
+	 *
+	 * @param key The key into this map.
+	 * @return The data type of the object at the specified key, or <jk>null</jk> if the value is null or does not exist.
+	 */
+	public ClassMeta<?> getClassMeta(String key) {
+		return beanContext.getClassMetaForObject(get(key));
+	}
+
+	/**
+	 * Equivalent to calling <code>get(class,key,def)</code> followed by <code>remove(key);</code>
+	 *
+	 * @param <T> The class type.
+	 * @param type The class type.
+	 * @param key The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public <T> T remove(Class<T> type, String key, T defVal) {
+		T t = get(type, key, defVal);
+		remove(key);
+		return t;
+	}
+
+
+	/**
+	 * Convenience method for removing several keys at once.
+	 *
+	 * @param keys The list of keys to remove.
+	 */
+	public void removeAll(Collection<String> keys) {
+		for (String k : keys)
+			remove(k);
+	}
+
+	/**
+	 * Convenience method for removing several keys at once.
+	 *
+	 * @param keys The list of keys to remove.
+	 */
+	public void removeAll(String... keys) {
+		for (String k : keys)
+			remove(k);
+	}
+
+	@Override /* Map */
+	public boolean containsKey(Object key) {
+		if (super.containsKey(key))
+			return true;
+		if (inner != null)
+			return inner.containsKey(key);
+		return false;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this map contains the specified key, ignoring
+	 * 	the inner map if it exists.
+	 *
+	 * @param key The key to look up.
+	 * @return <jk>true</jk> if this map contains the specified key.
+	 */
+	public boolean containsOuterKey(Object key) {
+		return super.containsKey(key);
+	}
+
+	/**
+	 * Returns a copy of this <code>ObjectMap</code> with only the specified keys.
+	 *
+	 * @param keys The keys of the entries to copy.
+	 * @return A new map with just the keys and values from this map.
+	 */
+	public ObjectMap include(String...keys) {
+		ObjectMap m2 = new ObjectMap();
+		for (Map.Entry<String,Object> e : this.entrySet())
+			for (String k : keys)
+				if (k.equals(e.getKey()))
+					m2.put(k, e.getValue());
+		return m2;
+	}
+
+	/**
+	 * Returns a copy of this <code>ObjectMap</code> without the specified keys.
+	 *
+	 * @param keys The keys of the entries not to copy.
+	 * @return A new map without the keys and values from this map.
+	 */
+	public ObjectMap exclude(String...keys) {
+		ObjectMap m2 = new ObjectMap();
+		for (Map.Entry<String,Object> e : this.entrySet()) {
+			boolean exclude = false;
+			for (String k : keys)
+				if (k.equals(e.getKey()))
+					exclude = true;
+			if (! exclude)
+				m2.put(e.getKey(), e.getValue());
+		}
+		return m2;
+	}
+
+	/**
+	 * Sets a value in this map if the entry does not exist or the value is <jk>null</jk>.
+	 *
+	 * @param key The map key.
+	 * @param val The value to set if the current value does not exist or is <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectMap putIfNull(String key, Object val) {
+		Object o = get(key);
+		if (o == null)
+			put(key, val);
+		return this;
+	}
+
+	/**
+	 * Sets a value in this map if the entry does not exist or the value is <jk>null</jk> or an empty string.
+	 *
+	 * @param key The map key.
+	 * @param val The value to set if the current value does not exist or is <jk>null</jk> or an empty string.
+	 * @return This object (for method chaining).
+	 */
+	public ObjectMap putIfEmpty(String key, Object val) {
+		Object o = get(key);
+		if (o == null || o.toString().isEmpty())
+			put(key, val);
+		return this;
+	}
+
+	/**
+	 * Converts this map into the class type specified by the <js>"_class"</js> entry value.
+	 * <p>
+	 * 	This method can be used to convert <code>ObjectMap</code> objects to a variety of POJO types.
+	 *
+	 * <dl>
+	 * 	<dt>Example of valid class types:</dt>
+	 * 	<dd>
+	 * <p>
+	 * An object map can be converted to a bean.
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	{
+	 * 		_class: <js>'com.ibm.sample.addressBook.Person'</js>,
+	 * 		name: <js>'John Smith'</js>,
+	 * 		...
+	 * 	}
+	 * </p>
+	 * <p>
+	 * It can also be converted into another map type.
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jc>// Generic TreeMap (String keys, Object values)</jc>
+	 * 	{
+	 * 		_class: <js>'java.util.TreeMap'</js>,
+	 * 		name: <js>'John Smith'</js>,
+	 * 		...
+	 * 	}
+	 * 	<jc>// TreeMap where values are forced to be strings.</jc>
+	 * 	{
+	 * 		_class: <js>'java.util.TreeMap&lt;java.lang.String,java.lang.String&gt;'</js>,
+	 * 		name: <js>'John Smith'</js>,
+	 * 		...
+	 * 	}
+	 * </p>
+	 * <p>
+	 * It can also be converted to Collections objects if map defines an <code>items</code> entry of type array.
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jc>// LinkedList of strings</jc>
+	 * 	{
+	 * 		_class: <js>'java.util.LinkedList'</js>,
+	 * 		items: [ <js>'John Smith'</js>, ... ]
+	 * 	}
+	 * 	<jc>// LinkedList of beans</jc>
+	 * 	{
+	 * 		_class: <js>'java.util.LinkedList&lt;com.ibm.sample.addressBook.Person&gt;'</js>,
+	 * 		items: [ { name: <js>'John Smith'</js>, ... }, ... ]
+	 * 	}
+	 * </p>
+	 * <p>
+	 * It can also be converted to arrays.
+	 * 		</p>
+	 * <p class='bcode'>
+	 * 	<jc>// Array of strings</jc>
+	 * 	{
+	 * 		_class: <js>'java.lang.String[]'</js>,
+	 * 		items: [ <js>'John Smith'</js>, ... ]
+	 * 	}
+	 * 	<jc>// Array of beans</jc>
+	 * 	{
+	 * 		_class: <js>'com.ibm.sample.addressBook.Person[]'</js>,
+	 * 		items: [ { name: <js>'John Smith'</js>, ... }, ... ]
+	 * 	}
+	 * </p>
+	 * <p>
+	 * It can also be converted to any type that can be handled by the {@link BeanContext#convertToType(Object, Class)} method.
+	 * In this case, the value is specified by an <code>value</code> entry of any type.
+	 * 			For example, if the bean context has a {@link CalendarFilter} associated with it, it can convert a string value to a calendar.
+	 * <p class='bcode'>
+	 * 	{
+	 * 		_class: <js>'java.util.GregorianCalendar'</js>,
+	 * 		value: <js>'2001-07-04T15:30:45-05:00'</js>
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * 	<dt>Notes:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li>This method is recursive.  It will also recursively convert any descendant entries to POJOs.
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @return The new Java object of type specified by the <js>"_class"</js> entry value, or this
+	 * 	same object if entry does not exist.
+	 */
+	public Object cast() {
+		String c = (String)get("_class");
+		if (c == null) {
+			if (containsKey("_value"))
+				return get("_value");
+			return this;
+		}
+		return cast2(beanContext.getClassMetaFromString(c));
+	}
+
+	/**
+	 * Converts this map into an object of the specified type.
+	 * <p>
+	 * The rules are the same as those specified in {@link #cast()}.
+	 * <p>
+	 * If this map contains a <js>"_class"</js> entry, it must be the same as or a subclass
+	 * 	of the <code>type</code>.
+	 *
+	 * @param <T> The class type to convert this map object to.
+	 * @param type The class type to convert this map object to.
+	 * @return The new object.
+	 * @throws ClassCastException If the <js>"_class"</js> entry is present and not assignable
+	 * 	from <code>type</code>
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T cast(Class<T> type) {
+		ClassMeta<?> c1 = beanContext.getClassMetaFromString((String)get("_class"));
+		ClassMeta<?> c2 = beanContext.getClassMeta(type);
+		ClassMeta<?> c = narrowClassMeta(c1, c2);
+		return (T)cast2(c);
+	}
+
+	/**
+	 * Same as {@link #cast(Class)}, except allows you to specify a {@link ClassMeta} parameter.
+	 *
+	 * @param <T> The class type to convert this map object to.
+	 * @param cm The class type to convert this map object to.
+	 * @return The new object.
+	 * @throws ClassCastException If the <js>"_class"</js> entry is present and not assignable
+	 * 	from <code>type</code>
+	 */
+	@SuppressWarnings({"unchecked"})
+	public <T> T cast(ClassMeta<T> cm) {
+		ClassMeta<?> c1 = beanContext.getClassMetaFromString((String)get("_class"));
+		ClassMeta<?> c = narrowClassMeta(c1, cm);
+		return (T)cast2(c);
+	}
+
+	/*
+	 * Combines the class specified by a "_class" attribute with the ClassMeta
+	 * passed in through the cast(ClassMeta) method.
+	 * The rule is that child classes superceed parent classes, and c2 superceeds c1
+	 * if one isn't the parent of another.
+	 */
+	@SuppressWarnings("unchecked")
+	private ClassMeta<?> narrowClassMeta(ClassMeta<?> c1, ClassMeta<?> c2) {
+		if (c1 == null)
+			return c2;
+		ClassMeta<?> c = getNarrowedClassMeta(c1, c2);
+		if (c1.isMap()) {
+			ClassMeta<?> k = getNarrowedClassMeta(c1.getKeyType(), c2.getKeyType());
+			ClassMeta<?> v = getNarrowedClassMeta(c1.getValueType(), c2.getValueType());
+			return beanContext.getMapClassMeta((Class<? extends Map<?,?>>)c.getInnerClass(), k, v);
+		}
+		if (c1.isCollection()) {
+			ClassMeta<?> e = getNarrowedClassMeta(c1.getElementType(), c2.getElementType());
+			return beanContext.getCollectionClassMeta((Class<? extends Collection<?>>)c.getInnerClass(), e);
+		}
+		return c;
+	}
+
+	/*
+	 * If c1 is a child of c2 or the same as c2, returns c1.
+	 * Otherwise, returns c2.
+	 */
+	private ClassMeta<?> getNarrowedClassMeta(ClassMeta<?> c1, ClassMeta<?> c2) {
+		if (isParentClass(c2.getInnerClass(), c1.getInnerClass()))
+			return c1;
+		return c2;
+	}
+
+	/*
+	 * Converts this map to the specified class type.
+	 */
+	@SuppressWarnings({"unchecked","rawtypes"})
+	private <T> T cast2(ClassMeta<T> cm) {
+
+		try {
+			Object value = get("value");
+
+			if (cm.isMap()) {
+				Map m2 = (cm.canCreateNewInstance() ? (Map)cm.newInstance() : new ObjectMap(beanContext));
+				ClassMeta<?> kType = cm.getKeyType(), vType = cm.getValueType();
+				for (Map.Entry<String,Object> e : entrySet()) {
+					Object k = e.getKey();
+					Object v = e.getValue();
+					if (! k.equals("_class")) {
+
+						// Attempt to recursively cast child maps.
+						if (v instanceof ObjectMap)
+							v = ((ObjectMap)v).cast();
+
+						k = (kType.isString() ? k : beanContext.convertToType(k, kType));
+						v = (vType.isObject() ? v : beanContext.convertToType(v, vType));
+
+						m2.put(k, v);
+					}
+				}
+				return (T)m2;
+
+			} else if (cm.isBean()) {
+				BeanMap<? extends T> bm = beanContext.newBeanMap(cm.getInnerClass());
+
+				// Iterate through all the entries in the map and set the individual field values.
+				for (Map.Entry<String,Object> e : entrySet()) {
+					String k = e.getKey();
+					Object v = e.getValue();
+					if (! k.equals("_class")) {
+
+						// Attempt to recursively cast child maps.
+						if (v instanceof ObjectMap)
+							v = ((ObjectMap)v).cast();
+
+						bm.put(k, v);
+					}
+				}
+
+				return bm.getBean();
+
+			} else if (cm.isArray() || cm.isCollection()) {
+				List items = (List)get("items");
+				return beanContext.convertToType(items, cm);
+
+			} else if (value != null) {
+				return beanContext.convertToType(value, cm);
+			}
+
+		} catch (Exception e) {
+			throw new BeanRuntimeException(cm.innerClass, "Error occurred attempting to cast to an object of type ''{0}''", cm.innerClass.getName()).initCause(e);
+		}
+
+		throw new BeanRuntimeException(cm.innerClass, "Cannot convert to class type ''{0}''.  Only beans and maps can be converted using this method.", cm.innerClass.getName());
+	}
+
+
+	/**
+	 * Serialize this object into a string using the specified serializer.
+	 *
+	 * @param serializer The serializer to use to convert this object to a string.
+	 * @return This object serialized as a string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public String toString(WriterSerializer serializer) throws SerializeException {
+		return serializer.serialize(this);
+	}
+
+	/**
+	 * Serialize this object into a JSON string using the {@link JsonSerializer#DEFAULT} serializer.
+	 */
+	@Override /* Object */
+	public String toString() {
+		try {
+			return this.toString(JsonSerializer.DEFAULT_LAX);
+		} catch (SerializeException e) {
+			return e.getLocalizedMessage();
+		}
+	}
+
+	/**
+	 * Convenience method for serializing this map to the specified <code>Writer</code> using
+	 * the {@link JsonSerializer#DEFAULT} serializer.
+	 *
+	 * @param w The writer to serialize this object to.
+	 * @return This object (for method chaining).
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public ObjectMap serializeTo(Writer w) throws IOException, SerializeException {
+		JsonSerializer.DEFAULT.serialize(this);
+		return this;
+	}
+
+	@Override /* Map */
+	public Set<String> keySet() {
+		if (inner == null)
+			return super.keySet();
+		LinkedHashSet<String> s = new LinkedHashSet<String>();
+		s.addAll(inner.keySet());
+		s.addAll(super.keySet());
+		return s;
+	}
+
+	@Override /* Map */
+	public Set<Map.Entry<String,Object>> entrySet() {
+		if (inner == null)
+			return super.entrySet();
+
+		final Set<String> keySet = keySet();
+		final Iterator<String> keys = keySet.iterator();
+
+		return new AbstractSet<Map.Entry<String,Object>>() {
+
+			@Override /* Iterable */
+			public Iterator<Map.Entry<String,Object>> iterator() {
+
+				return new Iterator<Map.Entry<String,Object>>() {
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return keys.hasNext();
+					}
+
+					@Override /* Iterator */
+					public Map.Entry<String,Object> next() {
+						return new Map.Entry<String,Object>() {
+							String key = keys.next();
+
+							@Override /* Map.Entry */
+							public String getKey() {
+								return key;
+							}
+
+							@Override /* Map.Entry */
+							public Object getValue() {
+								return get(key);
+							}
+
+							@Override /* Map.Entry */
+							public Object setValue(Object object) {
+								return put(key, object);
+							}
+						};
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						throw new UnsupportedOperationException();
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return keySet.size();
+			}
+		};
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.class
new file mode 100755
index 0000000..2154b91
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.java
new file mode 100755
index 0000000..a4c26d3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamer.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Defines an API for converting conventional bean property names to some other form.
+ * <p>
+ * For example, given the bean property <js>"fooBarURL"</js>, the {@link PropertyNamerDashedLC}
+ * 	property namer will convert this to <js>"foo-bar-url"</js>.
+ * <p>
+ * Property namers are associated with beans through the {@link Bean#propertyNamer} annotation.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface PropertyNamer {
+
+	/**
+	 * Convert the specified default property name to some other value.
+	 * @param name The original bean property name.
+	 * @return The converted property name.
+	 */
+	public String getPropertyName(String name);
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.class
new file mode 100755
index 0000000..752a35e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.java
new file mode 100755
index 0000000..4d93c7e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDashedLC.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+/**
+ * Converts property names to dashed-lower-case format.
+ * <p>
+ * 	Examples:
+ * <ul>
+ * 	<li><js>"fooBar"</js> -&gt; <js>"foo-bar"</js>
+ * 	<li><js>"fooBarURL"</js> -&gt; <js>"foo-bar-url"</js>
+ * 	<li><js>"FooBarURL"</js> -&gt; <js>"foo-bar-url"</js>
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class PropertyNamerDashedLC implements PropertyNamer {
+
+	@Override /* PropertyNamer */
+	public String getPropertyName(String name) {
+		if (name == null || name.isEmpty())
+			return name;
+
+		int numUCs = 0;
+		boolean isPrevUC = Character.isUpperCase(name.charAt(0));
+		for (int i = 1; i < name.length(); i++) {
+			char c = name.charAt(i);
+			if (Character.isUpperCase(c)) {
+				if (! isPrevUC)
+					numUCs++;
+				isPrevUC = true;
+			} else {
+				isPrevUC = false;
+			}
+		}
+
+		char[] name2 = new char[name.length() + numUCs];
+		isPrevUC = Character.isUpperCase(name.charAt(0));
+		name2[0] = Character.toLowerCase(name.charAt(0));
+		int ni = 0;
+		for (int i = 0; i < name.length(); i++) {
+			char c = name.charAt(i);
+			if (Character.isUpperCase(c)) {
+				if (! isPrevUC)
+					name2[ni++] = '-';
+				isPrevUC = true;
+				name2[ni++] = Character.toLowerCase(c);
+			} else {
+				isPrevUC = false;
+				name2[ni++] = c;
+			}
+		}
+
+		return new String(name2);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.class
new file mode 100755
index 0000000..3a6cb52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.java
new file mode 100755
index 0000000..c534d76
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/PropertyNamerDefault.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.beans.*;
+
+/**
+ * Default property namer.
+ * <p>
+ * 	Examples:
+ * <ul>
+ * 	<li><js>"fooBar"</js> -&gt; <js>"fooBar"</js>
+ * 	<li><js>"fooBarURL"</js> -&gt; <js>"fooBarURL"</js>
+ * 	<li><js>"FooBarURL"</js> -&gt; <js>"fooBarURL"</js>
+ * 	<li><js>"URL"</js> -&gt; <js>"URL"</js>
+ * </ul>
+ * <p>
+ * 	See {@link Introspector#decapitalize(String)} for exact rules.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class PropertyNamerDefault implements PropertyNamer {
+
+	@Override /* PropertyNamer */
+	public String getPropertyName(String name) {
+		return Introspector.decapitalize(name);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.class
new file mode 100755
index 0000000..7c7b7a5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.java
new file mode 100755
index 0000000..4dc8f2f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Streamable.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.io.*;
+
+/**
+ * Interface that identifies that an object can be serialized directly to an output stream.
+ * <p>
+ * 	Instances must identify the media type of the content by implementing the
+ * 	{@link #getMediaType()} method.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface Streamable {
+
+	/**
+	 * Serialize this object to the specified output stream.
+	 *
+	 * @param os The output stream to stream to.
+	 * @throws IOException
+	 */
+	void streamTo(OutputStream os) throws IOException;
+
+	/**
+	 * Returns the serialized media type for this resource (e.g. <js>"text/html"</js>).
+	 *
+	 * @return The media type, or <jk>null</jk> if the media type is not known.
+	 */
+	String getMediaType();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility$1.class
new file mode 100755
index 0000000..2fb5745
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.class
new file mode 100755
index 0000000..3bd640f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.java
new file mode 100755
index 0000000..0687d39
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Visibility.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.lang.reflect.*;
+
+/**
+ * Defines class/field/method visibilities.
+ * <p>
+ * Used to specify minimum levels of visibility when detecting bean classes, methods, and fields.
+ * Used in conjunction with the following bean context properties:
+ * <ul>
+ * 	<li>{@link BeanContextProperties#BEAN_beanConstructorVisibility}
+ * 	<li>{@link BeanContextProperties#BEAN_beanClassVisibility}
+ * 	<li>{@link BeanContextProperties#BEAN_beanFieldVisibility}
+ * 	<li>{@link BeanContextProperties#BEAN_methodVisibility}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum Visibility {
+
+	/** Ignore all */
+	NONE,
+
+	/** Include only <jk>public</jk> classes/fields/methods. */
+	PUBLIC,
+
+	/** Include only <jk>public</jk> or <jk>protected</jk> classes/fields/methods. */
+	PROTECTED,
+
+	/** Include all but <jk>private</jk> classes/fields/methods. */
+	DEFAULT,
+
+	/** Include all classes/fields/methods. */
+	PRIVATE;
+
+	/**
+	 * Identifies if the specified mod matches this visibility.
+	 * Example:
+	 * <code>
+	 * 	<jsf>PUBLIC</jsf>.isVisible(MyPublicClass.<jk>class</jk>.getModifiers()); <jc>//true</jk>
+	 * 	<jsf>PUBLIC</jsf>.isVisible(MyPrivateClass.<jk>class</jk>.getModifiers()); <jc>//false</jk>
+	 * 	<jsf>PRIVATE</jsf>.isVisible(MyPrivateClass.<jk>class</jk>.getModifiers()); <jc>//true</jk>
+	 * 	<jsf>NONE</jsf>.isVisible(MyPublicClass.<jk>class</jk>.getModifiers()); <jc>//false</jk>
+	 * </code>
+	 *
+	 * @param mod The modifier from the object being tested (e.g. results from {@link Class#getModifiers()}.
+	 * @return <jk>true</jk> if this visibility matches the specified modifier attribute.
+	 */
+	public boolean isVisible(int mod) {
+		switch(this) {
+			case NONE: return false;
+			case PRIVATE: return true;
+			case DEFAULT: return ! Modifier.isPrivate(mod);
+			case PROTECTED: return Modifier.isProtected(mod) || Modifier.isPublic(mod);
+			default: return Modifier.isPublic(mod);
+		}
+	}
+
+	/**
+	 * Shortcut for <code>isVisible(x.getModifiers());</code>
+	 *
+	 * @param x The constructor to check.
+	 * @return <jk>true</jk> if the constructor is at least as visible as this object.
+	 */
+	public boolean isVisible(Constructor<?> x) {
+		return isVisible(x.getModifiers());
+	}
+
+	/**
+	 * Shortcut for <code>isVisible(x.getModifiers());</code>
+	 *
+	 * @param x The method to check.
+	 * @return <jk>true</jk> if the method is at least as visible as this object.
+	 */
+	public boolean isVisible(Method x) {
+		return isVisible(x.getModifiers());
+	}
+
+	/**
+	 * Shortcut for <code>isVisible(x.getModifiers());</code>
+	 *
+	 * @param x The field to check.
+	 * @return <jk>true</jk> if the field is at least as visible as this object.
+	 */
+	public boolean isVisible(Field x) {
+		return isVisible(x.getModifiers());
+	}
+
+	/**
+	 * Makes constructor accessible if it matches the visibility requirements, or returns <jk>null</jk> if it doesn't.
+	 * Security exceptions thrown on the call to {@link Constructor#setAccessible(boolean)} are quietly ignored.
+	 *
+	 * @param x The constructor.
+	 * @return The same constructor if visibility requirements met, or <jk>null</jk> if visibility requirement not
+	 * 	met or call to {@link Constructor#setAccessible(boolean)} throws a security exception.
+	 */
+	public <T> Constructor<T> filter(Constructor<T> x) {
+		if (x == null)
+			return null;
+		if (isVisible(x))
+			if (! setAccessible(x))
+				return null;
+		return x;
+	}
+
+	/**
+	 * Makes method accessible if it matches the visibility requirements, or returns <jk>null</jk> if it doesn't.
+	 * Security exceptions thrown on the call to {@link Method#setAccessible(boolean)} are quietly ignored.
+	 *
+	 * @param x The method.
+	 * @return The same method if visibility requirements met, or <jk>null</jk> if visibility requirement not
+	 * 	met or call to {@link Method#setAccessible(boolean)} throws a security exception.
+	 */
+	public <T> Method filter(Method x) {
+		if (x == null)
+			return null;
+		if (isVisible(x))
+			if (! setAccessible(x))
+				return null;
+		return x;
+	}
+
+	/**
+	 * Makes field accessible if it matches the visibility requirements, or returns <jk>null</jk> if it doesn't.
+	 * Security exceptions thrown on the call to {@link Field#setAccessible(boolean)} are quietly ignored.
+	 *
+	 * @param x The field.
+	 * @return The same field if visibility requirements met, or <jk>null</jk> if visibility requirement not
+	 * 	met or call to {@link Field#setAccessible(boolean)} throws a security exception.
+	 */
+	public Field filter(Field x) {
+		if (x == null)
+			return null;
+		if (isVisible(x))
+			if (! setAccessible(x))
+				return null;
+		return x;
+	}
+
+	/**
+	 * Attempts to call <code>x.setAccessible(<jk>true</jk>)</code> and quietly ignores security exceptions.
+	 *
+	 * @param x The constructor.
+	 * @return <jk>true</jk> if call was successful.
+	 */
+	public static boolean setAccessible(Constructor<?> x) {
+		try {
+			if (! (x == null || x.isAccessible()))
+				x.setAccessible(true);
+			return true;
+		} catch (SecurityException e) {
+			return false;
+		}
+	}
+
+	/**
+	 * Attempts to call <code>x.setAccessible(<jk>true</jk>)</code> and quietly ignores security exceptions.
+	 *
+	 * @param x The method.
+	 * @return <jk>true</jk> if call was successful.
+	 */
+	public static boolean setAccessible(Method x) {
+		try {
+			if (! (x == null || x.isAccessible()))
+				x.setAccessible(true);
+			return true;
+		} catch (SecurityException e) {
+			return false;
+		}
+	}
+
+	/**
+	 * Attempts to call <code>x.setAccessible(<jk>true</jk>)</code> and quietly ignores security exceptions.
+	 *
+	 * @param x The field.
+	 * @return <jk>true</jk> if call was successful.
+	 */
+	public static boolean setAccessible(Field x) {
+		try {
+			if (! (x == null || x.isAccessible()))
+				x.setAccessible(true);
+			return true;
+		} catch (SecurityException e) {
+			return false;
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.class
new file mode 100755
index 0000000..ceb79f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.java
new file mode 100755
index 0000000..0c7cbd2
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/Writable.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.io.*;
+
+/**
+ * Interface that identifies that an object can be serialized directly to a writer.
+ * <p>
+ * 	Instances must identify the media type of the content by implementing the
+ * 	{@link #getMediaType()} method.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public interface Writable {
+
+	/**
+	 * Serialize this object to the specified writer.
+	 *
+	 * @param w The writer to write to.
+	 * @throws IOException
+	 */
+	void writeTo(Writer w) throws IOException;
+
+	/**
+	 * Returns the serialized media type for this resource (e.g. <js>"text/html"</js>)
+	 *
+	 * @return The media type, or <jk>null</jk> if the media type is not known.
+	 */
+	String getMediaType();
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.class
new file mode 100755
index 0000000..a9f3acd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.java
new file mode 100755
index 0000000..ccdb7f7
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/Bean.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.beans.*;
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.filter.*;
+
+/**
+ * Used to tailor how beans get interpreted by the framework.
+ * <p>
+ * 	Can be used to do the following:
+ * <ul>
+ * 	<li>Explicitly specify the set and order of properties on a bean.
+ * 	<li>Associate a {@link PropertyNamer} with a class.
+ * 	<li>Specify subtypes of a bean differentiated by a sub type property.
+ * </ul>
+ * <p>
+ * 	This annotation can be applied to classes and interfaces.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(TYPE)
+@Retention(RUNTIME)
+@Inherited
+public @interface Bean {
+
+	/**
+	 * The set and order of names of properties associated with a bean class.
+	 * <p>
+	 * 	The order specified is the same order that the entries will be returned by the {@link BeanMap#entrySet()} and related methods.
+	 * <p>
+	 * 	This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getProperties()} method.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Address class with only street/city/state properties (in that order).</jc>
+	 * 	<jc>// All other properties are ignored.</jc>
+	 * 	<ja>@Bean</ja>(properties={<js>"street"</js>,<js>"city"</js>,<js>"state"</js>})
+	 * 	<jk>public class</jk> Address {
+	 * 		...
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String[] properties() default {};
+
+	/**
+	 * Specifies a list of properties that should be excluded from {@link BeanMap#entrySet()}.
+	 * <p>
+	 * 	This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getExcludeProperties()} method.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Address class with only street/city/state properties (in that order).</jc>
+	 * 	<jc>// All other properties are ignored.</jc>
+	 * 	<ja>@Bean</ja>(excludeProperties={<js>"city"</js>,<js>"state"</js>})
+	 * 	<jk>public class</jk> Address {
+	 * 		...
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String[] excludeProperties() default {};
+
+	/**
+	 * Associates a {@link PropertyNamer} with this bean to tailor the names of the bean properties.
+	 * <p>
+	 * 	Property namers are used to transform bean property names from standard form to some other form.
+	 * 	For example, the {@link PropertyNamerDashedLC} will convert property names to dashed-lowercase, and
+	 * 		these will be used as attribute names in JSON, and element names in XML.
+	 * <p>
+	 * 	This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getPropertyNamer()} method.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Define a class with dashed-lowercase property names.</jc>
+	 * 	<ja>@Bean</ja>(propertyNamer=PropertyNamerDashedLC.<jk>class</jk>)
+	 * 	<jk>public class</jk> MyClass {
+	 * 		...
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	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={
+	 * 			<ja>@BeanSubType</ja>(type=A1.<jk>class</jk>, id=<js>"A1"</js>),
+	 * 			<ja>@BeanSubType</ja>(type=A2.<jk>class</jk>, id=<js>"A2"</js>)
+	 * 		}
+	 * 	)
+	 * 	<jk>public class</jk> A {
+	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
+	 * 	}
+	 *
+	 * 	<jc>// Subclass 1</jc>
+	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f1</jf>;
+	 * 	}
+	 *
+	 * 	<jc>// Subclass 2</jc>
+	 * 	<jk>public class</jk> A2 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f2</jf>;
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	The following shows what happens when serializing a subclassed object to JSON:
+	 * <p>
+	 * <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 "";
+
+	/**
+	 * Used in conjunction with {@link #subTypeProperty()} to set up bean subtypes.
+	 */
+	BeanSubType[] 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.
+	 * 	Additional properties on subclasses will be ignored.
+	 * <p class='bcode'>
+	 * 	<jc>// Parent class</jc>
+	 * 	<ja>@Bean</ja>(interfaceClass=A.<jk>class</jk>)
+	 * 	<jk>public abstract class</jk> A {
+	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
+	 * 	}
+	 *
+	 * 	<jc>// Sub class</jc>
+	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
+	 * 		<jk>public</jk> String <jf>f1</jf> = <js>"f1"</js>;
+	 * 	}
+	 *
+	 * 	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
+	 * 	A1 a1 = <jk>new</jk> A1();
+	 * 	String r = s.serialize(a1);
+	 * 	<jsm>assertEquals</jsm>(<js>"{f0:'f0'}"</js>, r);  // Note f1 is not serialized.
+	 * </p>
+	 * <p>
+	 * 	Note that this annotation can be used on the parent class so that it filters to all child classes,
+	 * 		or can be set individually on the child classes.
+	 * <p>
+	 * 	This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getInterfaceClass()} method.
+	 */
+	Class<?> interfaceClass() default Object.class;
+
+	/**
+	 * Identifies a stop class for the annotated class.
+	 * <p>
+	 * Identical in purpose to the stop class specified by {@link Introspector#getBeanInfo(Class, Class)}.
+	 * Any properties in the stop class or in its baseclasses will be ignored during analysis.
+	 * <p>
+	 * For example, in the following class hierarchy, instances of <code>C3</code> will include property <code>p3</code>, but
+	 * 	not <code>p1</code> or <code>p2</code>.
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> C1 {
+	 * 		<jk>public int</jk> getP1();
+	 * 	}
+	 *
+	 * 	<jk>public class</jk> C2 <jk>extends</jk> C1 {
+	 * 		<jk>public int</jk> getP2();
+	 * 	}
+	 *
+	 * 	<ja>@Bean</ja>(stopClass=C2.<jk>class</jk>)
+	 * 	<jk>public class</jk> C3 <jk>extends</jk> C2 {
+	 * 		<jk>public int</jk> getP3();
+	 * 	}
+	 * </p>
+	 */
+	Class<?> stopClass() default Object.class;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.class
new file mode 100755
index 0000000..3a5d88f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.java
new file mode 100755
index 0000000..b9153e9
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanConstructor.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Maps constructor arguments to property names on beans with read-only properties.
+ * <p>
+ * 	This annotation can be used in the case of beans with properties whose values can only be set by passing
+ * 	them in through a constructor on the class.<br>
+ * 	Since method parameter names are lost during compilation, this annotation essentially redefines them
+ * 	so that they are available at runtime.
+ * <p>
+ * 	The definition of a read-only bean is a bean with properties with only getters, like shown below...
+ * <p class='bcode'>
+ * 	<jk>public class</jk> Person {
+ * 		<jk>private final</jk> String <jf>name</jf>;
+ * 		<jk>private final int</jk> <jf>age</jf>;
+ *
+ * 		<ja>@BeanConstructor</ja>(properties={<js>"name"</js>,<js>"age"</js>})
+ * 		<jk>public</jk> Person(String name, <jk>int</jk> age) {
+ * 			<jk>this</jk>.<jf>name</jf> = name;
+ * 			<jk>this</jk>.<jf>age</jf> = age;
+ * 		}
+ *
+ * 		<jc>// Read only properties.</jc>
+ *
+ * 		<jk>public</jk> String getName() {
+ * 			<jk>return</jk> <jf>name</jf>;
+ * 		}
+ *
+ * 		<jk>public int</jk> getAge() {
+ * 			<jk>return</jk> <jf>age</jf>;
+ * 		}
+ * 	}
+ *
+ * 	String json = <js>"{name:'John Smith',age:45}"</js>;
+ * 	Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(json);
+ * 	String name = p.getName();  <jc>// "John Smith"</jc>
+ * 	<jk>int</jk> age = p.getAge();   <jc>// 45</jc>
+ * </p>
+ * <p>
+ * 	This annotation can only be applied to constructors and can only be applied to one constructor per class.
+ * <p>
+ * 	When present, bean instantiation is delayed until the call to {@link BeanMap#getBean()}.
+ * 	Until then, bean property values are stored in a local cache until <code>getBean()</code> is called.
+ * 	Because of this additional caching step, parsing into read-only beans tends to be slower and use
+ * 	more memory than parsing into beans with writable properties.
+ * <p>
+ * 	Attempting to call {@link BeanMap#put(String,Object)} on a read-only property after calling {@link BeanMap#getBean()}
+ * 	will result in a {@link BeanRuntimeException} being thrown.
+ * 	Multiple calls to {@link BeanMap#getBean()} will return the same bean instance.
+ * <p>
+ * 	Beans can be defined with a combination of read-only and read-write properties.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target(CONSTRUCTOR)
+@Retention(RUNTIME)
+@Inherited
+public @interface BeanConstructor {
+
+	/**
+	 * The names of the properties of the constructor arguments.
+	 * <p>
+	 * 	The number of properties listed must match the number of arguments in the constructor.
+	 */
+	String[] properties() default {};
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.class
new file mode 100755
index 0000000..4e1f137
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.java
new file mode 100755
index 0000000..b71b3f8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanIgnore.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Ignore classes, fields, and methods from being interpreted as bean or bean components.
+ * <p>
+ * 	Applied to classes that may look like beans, but you want to be treated as non-beans.
+ * 	For example, if you want to force a bean to be converted to a string using the <code>toString()</code>
+ * 		method, use this annoation on the class.
+ * <p>
+ * 	Applies to fields that should not be interpreted as bean property fields.
+ * <p>
+ * 	Applies to getters or setters that should not be interpreted as bean property getters or setters.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({FIELD,METHOD,TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface BeanIgnore {}
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.class
new file mode 100755
index 0000000..49c9274
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/annotation/BeanProperty.class differ


[43/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/package.html b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/package.html
new file mode 100755
index 0000000..413b883
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/package.html
@@ -0,0 +1,942 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2015. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Juno Cloud Microservice API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Introduction'>Microservice Introduction</a></p> 
+	<li><p><a class='doclink' href='#GettingStarted'>Getting Started</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#GettingStarted_Installing'>Installing in Eclipse</a></p> 
+		<li><p><a class='doclink' href='#GettingStarted_Running'>Running in Eclipse</a></p> 
+		<li><p><a class='doclink' href='#GettingStarted_Building'>Building and Running from Command-Line</a></p> 
+	</ol>	
+	<li><p><a class='doclink' href='#Manifest'>Manifest File</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#Manifest_API'>Manifest API</a></p> 
+	</ol>
+	<li><p><a class='doclink' href='#ConfigFile'>Config File</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#ConfigFile_API'>Config File API</a></p>
+	</ol> 
+	<li><p><a class='doclink' href='#ResourceClasses'>Resource Classes</a></p> 
+	<li><p><a class='doclink' href='#RestMicroservice'>RestMicroservice</a></p>
+	<ol> 
+		<li><p><a class='doclink' href='#RestMicroservice_Extending'>Extending RestMicroservice</a></p>
+	</ol>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Introduction"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Microservice Introduction</h2>
+<div class='topic'>
+	<p>
+		The Juno Cloud Microservice is an API for creating standalone executable jars that can be used to 
+		start lightweight configurable REST interfaces with all the power of the Juno REST server and client APIs.
+	</p>
+	<p>
+		The Microservice API consists of a combination of the Juno Core, Server, and Client APIs and an embedded
+		Eclipse Jetty Servlet Container.  It includes all libraries needed to execute in a Java 1.6+ environment.
+	</p>
+	<p>
+		Features include:
+	</p>
+	<ul class='spaced-list'>
+		<li>An out-of-the-box zipped Eclipse project to get started quickly.
+		<li>Packaged as a simple executable jar and configuration file.
+		<li>All the power of the Juno Cloud API for defining REST servlets and clients with the ability to serialize and parse POJOs as HTML, JSON, XML, RDF, URL-Encoding, and others.
+		<li>An extensible API that allows you to hook into various lifecycle events.
+		<li>Simple-to-use APIs for accessing manifest file entries, command-line arguments, and external configuration file properties.
+		<li>Predefined REST resources for configuring microservice and accessing log files.
+	</ul>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="GettingStarted"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - Getting Started</h2>
+<div class='topic'>
+	<p>
+		The <l>microservice-project.zip</l> file is a zipped eclipse project that includes everything you 
+		need to create a REST microservice in an Eclipse workspace.
+	</p>	
+		
+	<!-- ======================================================================================================== -->
+	<a id="GettingStarted_Installing"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.1 - Installing in Eclipse</h3>
+	<div class='topic'>
+		<p>
+			Follow these instructions to create a new template project in Eclipse.
+		</p>		
+		<ol class='spaced-list'>
+			<li>Download the latest microservice-project zip file (e.g. <l>microservice-project-5.2.zip</l>).
+			<li>In your Eclipse workspace, go to <b>File-&gt;Import-&gt;General-&gt;Existing Projects into Workspace</b> and click <b>Next</b>.<br><br>
+				<img class='bordered' src="doc-files/instructions1.png">
+			<li>Select the zip file and click <b>Finish</b>.<br><br>
+				<img class='bordered' src="doc-files/instructions2.png">
+			<li>In your workspace, you should now see the following project:<br><br>
+				<img class='bordered' src="doc-files/instructions3.png">
+		</ol>
+		<p>
+			The important elements in this project are:
+		</p>
+		<ul class='spaced-list'>
+			<li><l>META-INF/MANIFEST.MF</l> - The manifest file.  <br>
+				This defines the entry point, classpath, top-level REST resources, and location of external configuration file. <br><br>
+				<p class='bcode'>
+	<mk>Main-Class</mk>: com.ibm.juno.microservice.RestMicroservice
+	<mk>Rest-Resources</mk>: 
+	 com.ibm.juno.microservice.sample.RootResources
+	<mk>Main-ConfigFile</mk>: microservice.cfg
+	<mk>Class-Path</mk>: 
+	 lib/commons-codec-1.9.jar 
+	 lib/commons-io-1.2.jar 
+	 lib/commons-logging-1.1.1.jar 
+	 lib/httpclient-4.5.jar 
+	 lib/httpcore-4.4.1.jar 
+	 lib/httpmime-4.5.jar 
+	 lib/javax.servlet-api-3.0.jar 
+	 lib/jetty-all-8.1.0.jar 
+	 lib/juno-all-5.2.jar 
+	 lib/org.apache.commons.fileupload_1.3.1.jar
+				</p>
+			<li><l>RestMicroservice.java</l> - The application class. <br>
+				This is a specialized microservice in Juno for exposing REST servlets.
+			<li><l>RootResources.java</l> - The top-level REST resource. <br>
+				This class routes HTTP requests to child resources:<br><br>
+				<p class='bcode'>
+	<jd>/**
+	 * Root microservice page.
+	 */</jd>
+	<ja>@RestResource</ja>(
+		path=<js>"/"</js>,
+		label=<js>"Juno Microservice Template"</js>,
+		description=<js>"Template for creating REST microservices"</js>,
+		properties={
+			<ja>@Property</ja>(name=<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'$R{servletURI}?method=OPTIONS'}"</js>)
+		},
+		children={
+			HelloWorldResource.<jk>class</jk>,
+			ConfigResource.<jk>class</jk>,
+			LogsResource.<jk>class</jk>
+		}
+	)
+	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
+		<jc>// No actual code!</jc>
+	}		
+				</p>
+			<li><l>microservice.cfg</l> - The external configuration file. <br>
+				A deceivingly simple yet powerful INI-style configuration file:<br><br>
+		<p class='bcode'>
+	<cc>#================================================================================
+	# Basic configuration file for SaaS microservices
+	# Subprojects can use this as a starting point.
+	#================================================================================</cc>
+	
+	<cc>#================================================================================
+	# REST settings
+	#================================================================================</cc>
+	<cs>[REST]</cs>
+	
+	<cc># The HTTP port number to use.
+	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	<ck>port</ck> = <cv>10000</cv>
+	...
+				</p>
+				
+		</ul>
+		<p>
+			At this point, you're ready to start the microservice from your workspace.
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="GettingStarted_Running"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.2 - Running in Eclipse</h3>
+	<div class='topic'>
+		<p>
+			The <l>microservice-project.launch</l> file is already provided to allow you to quickly start
+			your new microservice.
+		</p>
+		<p>
+			Go to <b>Run-&gt;Run Configurations-&gt;Java Application-&gt;microservice-project</b> and click <b>Run</b>.
+		</p>
+		<img class='bordered' src="doc-files/instructions4.png">
+		<p>
+			In your console view, you should see the following output:
+		</p>
+		<img class='bordered' src="doc-files/instructions5.png">
+		<p>
+			Now open your browser and point to <l>http://localhost:10000</l>.  
+			You should see the following:
+		</p>
+		<img class='bordered' src="doc-files/instructions6.png">
+		<p>
+			You have started a REST interface on port 10000.
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="GettingStarted_Building"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.3 - Building and Running from Command Line</h3>
+	<div class='topic'>
+		<p>
+			The <l>build.xml</l> file is a very basic ANT script for creating your microservice
+			as an executable jar.
+		</p>
+		<p>
+			To build your microservice, right-click on <l>build.xml</l> and select <b>Run As-&gt;Ant Build</b>.
+			Once complete (which should only take about 1 second), if you refresh your project, you should see the following new directory:
+		</p>
+		<img class='bordered' src='doc-files/build1.png'>
+		<p>
+			If you open up a command prompt in the <l>build/microservice</l> folder, you can start your microservice as follows:
+		</p>
+		<img class='bordered' src='doc-files/build2.png'>
+		<p>
+			If you get this error message: <code class='snippet'>java.net.BindException: Address already in use</code>, then this microservice is already running elsewhere and so it cannot bind to port 10000.
+		</p>
+	</div>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="Manifest"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - Manifest File</h2>
+<div class='topic'>
+	<p>
+		The <l>META-INF/MANIFEST.MF</l> file is used to describe the microservice. 
+		If you open it, you'll see the following:
+	</p>
+	<p class='bcode'>
+	<mk>Main-Class</mk>: <mv>com.ibm.juno.microservice.RestMicroservice</mv>
+	<mk>Rest-Resources</mk>: 
+	 <mv>com.ibm.juno.microservice.sample.RootResources</mv>
+	<mk>Main-ConfigFile</mk>: <mv>microservice.cfg</mv>
+	<mk>Class-Path</mk>: 
+	 <mv>lib/commons-codec-1.9.jar 
+	 lib/commons-io-1.2.jar 
+	 lib/commons-logging-1.1.1.jar 
+	 lib/httpclient-4.5.jar 
+	 lib/httpcore-4.4.1.jar 
+	 lib/httpmime-4.5.jar 
+	 lib/javax.servlet-api-3.0.jar 
+	 lib/jetty-all-8.1.0.jar 
+	 lib/juno-all-5.2.jar 
+	 lib/org.apache.commons.fileupload_1.3.1.jar</mv>
+	</p>
+	<p>
+	 	The <mk>Main-Class</mk> entry is the standard manifest entry describing the entry point for the executable jar.
+	 	In most cases, this value will always be <l>com.ibm.juno.microservice.RestMicroservice</l>.
+	 	However, it is possible to extend this class or implement your own microservice, in which case you'll need
+	 	to modify this value to point to the new class.
+	</p>
+	<p>
+		The <mk>Rest-Resources</mk> entry is a comma-delimited list of REST resources.
+		These are classes that subclass from either {@link com.ibm.juno.microservice.Resource} or {@link com.ibm.juno.microservice.ResourceGroup}.
+		This is a specialized entry when using <l>com.ibm.juno.microservice.RestMicroservice</l>.
+		In most cases, you'll want to specify a single top-level "grouping" REST resource mapped to <l>"/"</l> that extends from {@link com.ibm.juno.microservice.ResourceGroup}
+		so that you can define multiple child resources.
+		In this case, we're pointing to a resource defined in our project: <l>com.ibm.juno.microservice.sample.RootResources</l>.
+	</p>
+	<p>
+		The <mk>Main-ConfigFile</mk> entry points to the location of an external configuration file for our microservice.
+	</p>		
+	<p>
+		The <mk>Class-Path</mk> entry is the standard manifest file entry.
+		However, if you need to add extra libraries to your microservice, you'll need to copy them into your <l>lib</l> 
+		directory and add them to the classpath here.
+	</p>
+	<p>
+		Other manifest file entries are also provided:
+	</p>
+	<ul class='spaced-list'>
+		<li><mk>Rest-Port</mk> - The HTTP port to use.  Default is <l>10000</l>.
+		<li><mk>Rest-ContextPath</mk> - The servlet context path.  Default is <l>"/"</l>.
+		<li><mk>Rest-AuthType</mk> - Authentication support.<br>  
+			Possible values are <l>"NONE"</l> and <l>"BASIC"</l>.<br>  
+			Default is <l>"NONE"</l>.<br>
+			Used with the following additional settings:
+			<ul>
+				<li><mk>Rest-LoginUser</mk>
+				<li><mk>Rest-LoginPassword</mk>
+				<li><mk>Rest-AuthRealm</mk>
+			</ul>
+	</ul>
+	<p>
+		In addition to these predefined manifest entries, you can add your own particular entries to the manifest file
+		and access them through the Manifest API described next. 
+	</p>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Manifest_API"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.1 - Manifest API</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.microservice.Microservice#getManifest()} method is a static method that
+			can be used to retrieve the manifest file as an {@link com.ibm.juno.core.ObjectMap}.  
+		</p>
+		<p class='bcode'>
+	<jc>// Get Main-Class from manifest file.</jc>
+	String mainClass = Microservice.<jsm>getManifest</jsm>().getString(<js>"Main-Class"</js>, <js>"unknown"</js>);
+	 
+	<jc>// Get Rest-Resources from manifest file.</jc>
+	String[] restResources = Microservice.<jsm>getManifest</jsm>().getStringArray(<js>"Rest-Resources"</js>);
+		</p>
+		<p>
+			Since this method returns an {@link com.ibm.juno.core.ObjectMap}, it's possible to retrieve entries as a wide variety
+			of object types such as java primitives, arrays, collections, maps, or even POJOs serialized as JSON.
+		</p>
+	</div>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="ConfigFile"></a>
+<h2 class='topic' onclick='toggle(this)'>4 - Config File</h2>
+<div class='topic'>
+	<p>
+		The microservice config file is an external INI-style configuration file that is used to configure
+		your microservice.
+	</p>
+	<p>
+		If you open the <l>microservice.cfg</l> file, you'll see several predefined sections and settings.
+	</p>
+	<p class='bcode'>
+	<cc>#================================================================================
+	# Basic configuration file for SaaS microservices
+	# Subprojects can use this as a starting point.
+	#================================================================================</cc>
+	
+	<cc>#================================================================================
+	# REST settings
+	#================================================================================</cc>
+	<cs>[REST]</cs>
+	
+	<cc># The HTTP port number to use.
+	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	<ck>port</ck> = <cv>10000</cv>
+	
+	<cc># A JSON map of servlet paths to servlet classes.
+	# Example:  
+	# 	resourceMap = {'/*':'com.ibm.MyServlet'}
+	# Either resourceMap or resources must be specified.</cc>
+	<ck>resourceMap</ck> = 
+
+	<cc># A comma-delimited list of names of classes that extend from Servlet.
+	# Resource paths are pulled from @RestResource.path() annotation, or
+	# 	"/*" if annotation not specified.
+	# Example:  
+	# 	resources = com.ibm.MyServlet
+	# Default is Rest-Resources in manifest file.
+	# Either resourceMap or resources must be specified.</cc>
+	<ck>resources</ck> = 
+
+	<cc># The context root of the Jetty server.
+	# Default is Rest-ContextPath in manifest file, or "/".</cc>
+	<ck>contextPath</ck> = 
+
+	<cc># Authentication:  NONE, BASIC.</cc>
+	<ck>authType</ck> = <cv>NONE</cv>
+	
+	<cc># The BASIC auth username.
+	# Default is Rest-LoginUser in manifest file.</cc>
+	<ck>loginUser</ck> = 
+	
+	<cc># The BASIC auth password.
+	# Default is Rest-LoginPassword in manifest file.</cc>
+	<ck>loginPassword</ck> = 
+	
+	<cc># The BASIC auth realm.
+	# Default is Rest-AuthRealm in manifest file.</cc>
+	<ck>authRealm</ck> = 
+	
+	<cc># Stylesheet to use for HTML views.
+	# The default options are:
+	#  - styles/juno.css
+	#  - styles/devops.css
+	# Other stylesheets can be referenced relative to the servlet package or working
+	# 	directory.</cc>
+	<ck>stylesheet</ck> = <cv>styles/devops.css</cv>
+	
+	<cc># What to do when the config file is saved.
+	# Possible values:
+	# 	NOTHING - Don't do anything. 
+	#	RESTART_SERVER - Restart the Jetty server.
+	#	RESTART_SERVICE - Shutdown and exit with code '3'.</cc>
+	<ck>saveConfigAction</ck> = <cv>RESTART_SERVER</cv>
+	
+	<cc># Enable SSL support.</cc>
+	<ck>useSsl</ck> = <cv>false</cv>
+	
+	<cc>#================================================================================
+	# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
+	#--------------------------------------------------------------------------------
+	# Ignored if REST/useSsl is false.
+	#================================================================================</cc>
+	<cs>[REST-SslContextFactory]</cs>
+	<ck>keyStorePath</ck> = <cv>client_keystore.jks</cv>
+	<ck>keyStorePassword*</ck> = <cv>{HRAaRQoT}</cv>
+	<ck>excludeCipherSuites</ck> = <cv>TLS_DHE.*, TLS_EDH.*</cv>
+	<ck>excludeProtocols</ck> = <cv>SSLv3</cv>
+	<ck>allowRenegotiate</ck> = <cv>false</cv>
+	
+	<cc>#================================================================================
+	# Logger settings
+	# See FileHandler Java class for details.
+	#================================================================================</cc>
+	<cs>[Logging]</cs>
+
+	<cc># The directory where to create the log file.
+	# Default is "."</cc>
+	<ck>logDir</ck> = <cv>logs</cv>
+	
+	<cc># The name of the log file to create for the main logger.
+	# The logDir and logFile make up the pattern that's passed to the FileHandler
+	# constructor.
+	# If value is not specified, then logging to a file will not be set up.</cc>
+	<ck>logFile</ck> = <cv>microservice.%g.log</cv>
+	
+	<cc># Whether to append to the existing log file or create a new one.
+	# Default is false.</cc>
+	<ck>append</ck> = 
+	
+	<cc># The SimpleDateFormat format to use for dates.
+	# Default is "yyyy.MM.dd hh:mm:ss".</cc>
+	<ck>dateFormat</ck> = 
+	
+	<cc># The log message format.
+	# The value can contain any of the following variables:
+	# 	{date} - The date, formatted per dateFormat.
+	#	{class} - The class name.
+	#	{method} - The method name.
+	#	{logger} - The logger name.
+	#	{level} - The log level name.
+	#	{msg} - The log message.
+	#	{threadid} - The thread ID.
+	#	{exception} - The localized exception message.
+	# Default is "[{date} {level}] {msg}%n".</cc>
+	<ck>format</ck> =
+	
+	<cc># The maximum log file size.
+	# Suffixes available for numbers.
+	# See ConfigFile.getInt(String,int) for details.
+	# Default is 1M.</cc>
+	<ck>limit</ck> = <cv>10M</cv>
+	
+	<cc># Max number of log files.
+	# Default is 1.</cc>
+	<ck>count</ck> = <cv>5</cv>
+	
+	<cc># Default log levels.
+	# Keys are logger names.
+	# Values are serialized Level POJOs.</cc>
+	<ck>levels</ck> = <cv>{ com.ibm.juno:'INFO' }</cv>
+	
+	<cc># Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
+	# Useful for preventing log files from filling up with duplicate stack traces.
+	# Default is false.</cc>
+	<ck>useStackTraceHashes</ck> = <cv>true</cv>
+	
+	<cc># The default level for the console logger.
+	# Default is WARNING.</cc>
+	<ck>consoleLevel</ck> = 
+	
+	<cc>#================================================================================
+	# System properties
+	#--------------------------------------------------------------------------------
+	# These are arbitrary system properties that are set during startup.
+	#================================================================================</cc>
+	<cs>[SystemProperties]</cs>
+	
+	<cc># Configure Jetty for StdErrLog Logging</cc>
+	<ck>org.eclipse.jetty.util.log.class</ck> = <cv>org.eclipse.jetty.util.log.StrErrLog</cv>
+	
+	<cc># Jetty logging level</cc>
+	<ck>org.eclipse.jetty.LEVEL</ck> = <cv>WARN</cv>		
+	</p>
+	<p class='info'>
+		The predefined config file includes all settings for instructional purposes. 
+		In your microservice, you can remove all lines from your config file that have default values.
+	</p>
+	<p>
+		Although the config file looks deceptively simple, the config file API is a very powerful feature with many capabilities, including:
+	</p>
+	<ul>
+		<li>The ability to use variables to reference environment variables, system properties, other config file entries, and a host of other types.
+		<li>The ability to store and retrieve POJOs as JSON.
+		<li>APIs for updating, modifying, and saving configuration files without losing comments or formatting.
+		<li>Extensive listener APIs.
+	</ul>
+	<h6 class='topic'>Examples:</h6>
+	<p class='bcode'>
+	<cc>#--------------------------</cc>
+	<cc># My section</cc>
+	<cc>#--------------------------</cc>
+	<cs>[MySection]</cs>
+	
+	<cc># An integer</cc>
+	<ck>anInt</ck> = <cv>1 </cv>
+	
+	<cc># A boolean</cc>
+	<ck>aBoolean</ck> = <cv>true </cv>
+	
+	<cc># An int array</cc>
+	<ck>anIntArray</ck> = <cv>1,2,3 </cv>
+	
+	<cc># A POJO that can be converted from a String</cc>
+	<ck>aURL</ck> = <cv>http://foo </cv>
+	
+	<cc># An encoded password</cc>
+	<ck>aPassword*</ck> = <cv>{HRAaRQoT}</cv>
+
+	<cc># A POJO that can be converted from JSON</cc>
+	<ck>aBean</ck> = <cv>{foo:'bar',baz:123}</cv>
+	
+	<cc># A system property</cc>
+	<ck>locale</ck> = <cv>$S{java.locale, en_US}</cv>
+	
+	<cc># An environment variable</cc>
+	<ck>path</ck> = <cv>$E{PATH, unknown}</cv>
+	
+	<cc># A manifest file entry</cc>
+	<ck>mainClass</ck> = <cv>$MF{Main-Class}</cv>
+	
+	<cc># Another value in this config file</cc>
+	<ck>sameAsAnInt</ck> = <cv>$C{MySection/anInt}</cv>
+	
+	<cc># A command-line argument in the form "myarg=foo"</cc>
+	<ck>myArg</ck> = <cv>$ARG{myarg}</cv>
+	
+	<cc># The first command-line argument</cc>
+	<ck>firstArg</ck> = <cv>$ARG{0}</cv>
+
+	<cc># Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.</cc>
+	<ck>nested</ck> = <cv>$S{mySystemProperty,$E{MY_ENV_VAR,$ARG{0}}}</cv>
+
+	<cc># A POJO with embedded variables</cc>
+	<ck>aBean2</ck> = <cv>{foo:'$ARG{0}',baz:$C{MySection/anInt}}</cv>
+	
+	</p>
+	<p class='bcode'>
+	<jc>// Java code for accessing config entries above.</jc>
+	ConfigFile cf = Microservice.<jsm>getConfig</jsm>();
+	
+	<jk>int</jk> anInt = cf.getInt(<js>"MySection/anInt"</js>); 
+	<jk>boolean</jk> aBoolean = cf.getBoolean(<js>"MySection/aBoolean"</js>); 
+	<jk>int</jk>[] anIntArray = cf.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"MySection/anIntArray"</js>); 
+	URL aURL = cf.getObject(URL.<jk>class</jk>, <js>"MySection/aURL"</js>); 
+	String aPassword = cf.getString(<js>"MySection/aPassword"</js>);
+	MyBean aBean = cf.getObject(MyBean.<jk>class</jk>, <js>"MySection/aBean"</js>); 
+	Locale locale = cf.getObject(Locale.<jk>class</jk>, <js>"MySection/locale"</js>); 
+	String path = cf.getString(<js>"MySection/path"</js>); 
+	String mainClass = cf.getString(<js>"MySection/mainClass"</js>); 
+	<jk>int</jk> sameAsAnInt = cf.getInt(<js>"MySection/sameAsAnInt"</js>); 
+	String myArg = cf.getString(<js>"MySection/myArg"</js>); 
+	String firstArg = cf.getString(<js>"MySection/firstArg"</js>); 
+	</p>
+	<h6 class='topic'>Additional Information</h6>
+	<ul class='javahierarchy'>
+		<li class='p'><a href='../core/ini/package-summary.html#TOC'><l>com.ibm.juno.core.ini</l></a> - Juno Configuration API Javadocs.
+	</ul>
+	
+	<!-- ======================================================================================================== -->
+	<a id="ConfigFile_API"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.1 - Config File API</h3>
+	<div class='topic'>
+		<p>
+			There are 3 primary ways of getting access to the config file.
+		</p>
+		<ul class='javahierarchy'>
+			<li class='m'>{@link com.ibm.juno.microservice.Microservice#getConfig()} - A static method that can be used to access
+				the config file from anywhere in your application.<br>
+				When using this method, any of the following variables can be resolved:
+				<ul>
+					<li><l>$S{key}, $S{key,default}</l> - System properties.
+					<li><l>$E{key}, $E{key,default}</l> - Environment variables.
+					<li><l>$C{key}, $C{key,default}</l> - Config file entries.
+					<li><l>$MF{key}, $MF{key,default}</l> - Manifest file entries.
+					<li><l>$ARG{key}, $ARG{key,default}</l> - Command-line arguments.
+				</ul>
+				Additional user-defined variables can be defined by overriding the {@link com.ibm.juno.microservice.Microservice#createVarResolver()} method.
+			<li class='m'>{@link com.ibm.juno.server.RestServlet#getConfig()} - An instance method to access it from inside a REST servlet.<br>
+				The following variables are available in addition to the variables defined above:
+				<ul>
+					<li><l>$I{key}, $I{key,default}</l> - Servlet initialization parameters.
+				</ul>
+				<h6 class='figure'>Example usage:</h6>
+				<p class='bcode'>
+	<cc>#-------------------------------</cc>
+	<cc># Properties for MyHelloResource </cc>
+	<cc>#-------------------------------</cc>
+	<cs>[MyHelloResource]</cs>
+	<ck>greeting</ck> = <cv>Hello world!</cv> 
+				</p>
+				<p class='bcode'>
+	<ja>@RestResource</ja>(...)
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {
+		<jc>// Access config file when initializing fields.</jc>
+		<jk>private</jk> String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
+		
+		<jc>// Or access config file in servlet init method.</jc>
+		<ja>@Override</ja> <jc>/* Servlet */</jc>
+		<jk>public void</jk> init() {
+			String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
+		}
+	}		
+				</p>
+				<p>
+					Additional user-defined variables can be defined at this level by overriding the {@link com.ibm.juno.microservice.Resource#createVarResolver()} method.
+				</p>
+			<li class='m'>{@link com.ibm.juno.server.RestRequest#getConfig()} - An instance method to access it from inside a REST method.<br>
+				The following variables are available in addition to the variables defined above:
+				<ul>
+					<li><l>$L{key}, $L{key,args}</l> - Localized variables pulled from {@link com.ibm.juno.server.RestRequest#getMessage(String, Object...)}.
+					<li><l>$A{key}, $A{key,default}</l> - Request attributes pulled from {@link com.ibm.juno.server.RestRequest#getAttribute(String)}.
+					<li><l>$P{key}, $P{key,default}</l> - Request parameters pulled from {@link com.ibm.juno.server.RestRequest#getParameter(String)}.
+					<li><l>$R{key}</l> - Request variables.
+					<ul>
+			 			<li><l>$R{contextPath}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getContextPath()}.
+			 			<li><l>$R{method}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getMethod()}.
+			 			<li><l>$R{methodDescription}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getMethodDescription()}.
+			 			<li><l>$R{pathInfo}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getPathInfo()}.
+			 			<li><l>$R{requestParentURI}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getRequestParentURI()}.
+			 			<li><l>$R{requestURI}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getRequestURI()}.
+			 			<li><l>$R{servletDescription}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getServletDescription()}.
+			 			<li><l>$R{servletLabel}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getServletLabel()}.
+			 			<li><l>$R{servletParentURI}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getServletParentURI()}.
+			 			<li><l>$R{servletPath}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getServletPath()}.
+			 			<li><l>$R{servletURI}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getServletURI()}.
+			 			<li><l>$R{trimmedRequestURI}</l> - Value returned by {@link com.ibm.juno.server.RestRequest#getTrimmedRequestURI()}.
+					</ul>
+					<li><l>$UE{...}</l> - URL-Encode the specified value by calling {@link com.ibm.juno.server.RestUtils#encode(String)}.
+				</ul>
+				<h6 class='figure'>Example usage:</h6>
+				<p class='bcode'>
+	<cc>#-----------------------------</cc>
+	<cc># Contents of microservice.cfg </cc>
+	<cc>#-----------------------------</cc>
+	<cs>[MyHelloResource]</cs>
+	<ck>greeting</ck> = <cv>Hello $A{person}!</cv> 
+	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$A{person}}</cv> 
+				</p>
+				<p class='bcode'>
+	<cc>#---------------------------------</cc>
+	<cc># Contents of MyHelloResource.java </cc>
+	<cc>#---------------------------------</cc>
+	<ja>@RestResource</ja>(
+		path=<js>"/hello"</js>,
+		messages=<js>"nls/Messages"</js>,
+		...
+	)
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {
+
+		<jd>/** Standard hello message. */</jd>
+		<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/{person}"</js>)
+		<jk>public</jk> String sayHello(RestRequest req) {
+			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/greeting"</js>);
+		}
+
+		<jd>/** Hello message in users language. */</jd>
+		<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/localized/{person}"</js>)
+		<jk>public</jk> String sayLocalizedHello(RestRequest req) {
+			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/localizedGreeting"</js>);
+		}
+	}		
+				<p class='bcode'>
+	<cc>#---------------------------------------</cc>
+	<cc># Contents of nls/Messages_en.properties </cc>
+	<cc>#---------------------------------------</cc>
+	<ck>MyHelloResource.HelloMessage</ck> = <cv>Hello {0}!</cv> 
+				</p>
+				<p>
+					Additional user-defined variables can be defined at this level by overriding the {@link com.ibm.juno.server.RestServlet#createRequestVarResolver(RestRequest)} method.
+				</p>
+		</ul>
+		<p>
+			That <l>sayLocalizedHello()</l> example might need some explanation since there's a lot going on there.
+			Here's what happens when an HTTP call is made to <l>GET /hello/localized/Bob</l>:
+		</p>
+		<ol class='spaced-list'>
+			<li>The HTTP call matches the <l>/hello</l> path on the <l>MyHelloResource</l> class.
+			<li>The HTTP call matches the <l>/localized/{person}</l> path on the <l>sayLocalizedHello()</l> method.
+			<li>The request attribute <l>person</l> gets assigned the value <l>"Bob"</l>.
+			<li>The call to <l>req.getConfig().getString("MyHelloResource/localizedGreeting")</l> 
+				finds the value <l>"$L{HelloMessage,$A{person}}"</l>.
+			<li>The arguments in the <l>$L{}</l> variable get resolved, resulting in <l>"$L{HelloMessage,Bob}"</l>.
+			<li>The <l>$L{}</l> variable gets resolved to the message <l>"Hello {0}!"</l> in the localized properties file of the servlet based on the <l>Accept-Language</l> header on the request.
+			<li>The arguments get replaced in the message resulting in <l>"Hello Bob!"</l>. 
+			<li>The resulting message <l>"Hello Bob!"</l> is returned as a POJO to be serialized to whatever content type was specified on the <l>Accept</l> header on the request.
+</ol>
+		<p>
+			This particular example is needlessly complex, but it gives an idea of how variables can be used recursively to produce sophisticated results
+		</p>
+	</div>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="ResourceClasses"></a>
+<h2 class='topic' onclick='toggle(this)'>5 - Resource Classes</h2>
+<div class='topic'>
+	<p>
+		Now let's take a look at the resource classes themselves.  
+		The top-level page:
+	</p>
+	<img class='bordered' src='doc-files/instructions6.png'>
+	<p>
+		...is generated by this class...
+	<p class='bcode'>
+	<jd>/**
+	 * Root microservice page.
+	 */</jd>
+	<ja>@RestResource</ja>(
+		path=<js>"/"</js>,
+		label=<js>"Juno Microservice Template"</js>,
+		description=<js>"Template for creating REST microservices"</js>,
+		properties={
+			<ja>@Property</ja>(name=<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'$R{servletURI}?method=OPTIONS'}"</js>)
+		},
+		children={
+			HelloWorldResource.<jk>class</jk>,
+			ConfigResource.<jk>class</jk>,
+			LogsResource.<jk>class</jk>
+		}
+	)
+	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
+		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L;
+	}		
+	</p>
+	<ul class='spaced-list'>
+		<li>The </l>label</l> and <l>description</l> annotations define the titles on the page.<br>
+			These can be globalized using <l>$L{...}</l> variables, or by defining specially-named properties in the properties
+			file for the resource.
+		<li>In this case, the <l>path</l> annotation defines the context root of your application since it was 
+			not specified in the manifest or config file.<br>
+			Therefore, this resource is mapped to <l>http://localhost:10000</l>.
+		<li>The <l>children</l> annotation make up the list of child resources.<br>
+			These child resources can be anything that extends from <l>Servlet</l>, although usually
+			they will be subclasses of {@link com.ibm.juno.microservice.Resource} or other resource groups.
+	</ul>
+	<p>
+		If you click the <l>helloWorld</l> link in your application, you'll get a simple hello world message:
+	</p>
+	<img class='bordered' src='doc-files/helloworld1.png'>
+	<p>
+		...which is generated by this class...
+	</p>
+	<p class='bcode'>
+	<jd>/**
+	 * Sample REST resource that prints out a simple "Hello world!" message.
+	 */</jd>
+	<ja>@RestResource</ja>(
+		path=<js>"/helloWorld"</js>,
+		label=<js>"Hello World example"</js>,
+		description=<js>"Simplest possible REST resource"</js>
+	)
+	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
+	
+		<jd>/** GET request handler */</jd>
+		<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/*"</js>)
+		<jk>public</jk> String sayHello() {
+			<jk>return</jk> <js>"Hello world!"</js>;
+		}
+	}		
+	</p>
+	<p>
+		The {@link com.ibm.juno.microservice.Resource} and {@link com.ibm.juno.microservice.ResourceGroup} classes
+		are powerful servlets designed specifically for creating REST APIs using nothing more than serialized and parsed POJOs.
+	</p>
+	<h6 class='topic'>Additional Information</h6>
+	<ul class='javahierarchy'>
+		<li class='p'><a href='../server/package-summary.html#TOC'><l>com.ibm.juno.core.server</l></a> - Juno Server API Javadocs.
+	</ul>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="RestMicroservice"></a>
+<h2 class='topic' onclick='toggle(this)'>6 - RestMicroservice</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.microservice.RestMicroservice} class is the main application entrypoint for REST microservices. 
+	</p>
+	<p>
+		The class hierarchy is:
+	</p>
+	<ul class='javahierarchy'>
+		<li class='a'>{@link com.ibm.juno.microservice.Microservice} - Abstract class that defines simple start/stop methods and access to the manifest file, config file, and arguments.
+			<ul>
+				<li class='c'>{@link com.ibm.juno.microservice.RestMicroservice} - Specialized microservice for starting up REST interfaces using Jetty and specifying REST servlets
+					through the manifest file or config file.
+			</ul>
+	</ul>
+	<p>
+		Refer to the Javadocs for these class for more information.
+	</p>
+	
+<!-- ======================================================================================================== -->
+	<a id="RestMicroservice_Extending"></a>
+	<h3 class='topic' onclick='toggle(this)'>6.1 - Extending RestMicroservice</h3>
+<div class='topic'>
+		<p>
+			This example shows how the {@link com.ibm.juno.microservice.RestMicroservice} class
+			can be extended to implement lifecycle listener methods or override existing methods.
+			We'll create a new class <l>com.ibm.SampleCustomRestMicroservice</l>.
+		</p>
+		<p>
+			First, the manifest file needs to be modified to point to our new microservice:
+		</p>
+		<p class='bcode'>
+	<mk>Main-Class:</mk> com.ibm.SampleCustomRestMicroservice
+		</p>
+		<p>
+			Then we define the following class:
+		</p>
+		<p class='bcode'>
+	<jd>/**
+	 * Sample subclass of a RestMicroservice that provides customized behavior.
+	 * This class must be specified in the Main-Class entry in the manifest file and optionally
+	 * 	a Main-ConfigFile entry.
+	 */</jd>
+	<jk>public class</jk> SampleCustomRestMicroservice <jk>extends</jk> RestMicroservice {
+	
+		<jd>/**
+		 * Must implement a main method and call start()!
+		 */</jd>
+		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
+			<jk>new</jk> SampleCustomRestMicroservice(args).start();
+		}
+	
+		<jd>/**
+		 * Must implement a constructor!
+		 * 
+		 * <ja>@param</ja> args Command line arguments. 
+		 * <ja>@throws</ja> Exception 
+		 */</jd>
+		<jk>public</jk> SampleCustomRestMicroservice(String[] args) <jk>throws</jk> Exception {
+			<jk>super</jk>(args);
+		}
+	
+		<jc>//--------------------------------------------------------------------------------
+		// Methods on Microservice that can be overridden and customized.
+		//--------------------------------------------------------------------------------</jc>
+	
+		<ja>@Override</ja> <jc>/* Microservice */</jc>
+		<jk>protected void</jk> start() <jk>throws</jk> Exception {
+			<jk>super</jk>.start();
+		}
+	
+		<ja>@Override</ja> <jc>/* Microservice */</jc>
+		<jk>public void</jk> stop() {
+			<jk>super</jk>.stop();
+		}
+	
+		<ja>@Override</ja> <jc>/* Microservice */</jc>
+		<jk>public void</jk> kill() {
+			<jk>super</jk>.kill();
+		}
+	
+		<ja>@Override</ja> <jc>/* Microservice */</jc>
+		<jk>public void</jk> onStart() {
+			System.<jsf>err</jsf>.println(<js>"onStart() called!"</js>);
+		}
+	
+		<ja>@Override</ja> <jc>/* Microservice */</jc>
+		<jk>public void</jk> onStop() {
+			System.<jsf>err</jsf>.println(<js>"onStop() called!"</js>);
+		}
+	
+		<jc>//--------------------------------------------------------------------------------
+		// Methods on RestMicroservice that can be overridden and customized.
+		//--------------------------------------------------------------------------------</jc>
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> initLogging() <jk>throws</jk> Exception {
+			<jk>super</jk>.initLogging();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected</jk> Server createServer() <jk>throws</jk> Exception {
+			<jk>return super</jk>.createServer();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> startServer() <jk>throws</jk> Exception {
+			<jk>super</jk>.startServer();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> onCreateServer() {
+			System.<jsf>err</jsf>.println(<js>"onCreateServer() called!"</js>);
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> onStartServer() {
+			System.<jsf>err</jsf>.println(<js>"onStartServer() called!"</js>);
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> onPostStartServer() {
+			System.<jsf>err</jsf>.println(<js>"onPostStartServer() called!"</js>);
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> onStopServer() {
+			System.<jsf>err</jsf>.println(<js>"onStopServer() called!"</js>);
+		}
+	
+		<ja>@Override</ja> <jc>/* RestMicroservice */</jc>
+		<jk>protected void</jk> onPostStopServer() {
+			System.<jsf>err</jsf>.println(<js>"onPostStopServer() called!"</js>);
+		}
+	}
+		</p>
+	</div>	
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigEdit.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigEdit.html b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigEdit.html
new file mode 100755
index 0000000..59874e1
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigEdit.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2015. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
+	<style type='text/css'>
+		@import '$R{servletURI}/style.css';
+	</style>
+</head>
+<body>
+	<h3 class='title'>$R{servletLabel}</h3>
+	<h5 class='description'>Edit config file</h5>
+	<p class='links'><a href='$R{requestParentURI}'>up</a> - <a href='$R{servletURI}?method=OPTIONS'>options</a></p>
+	<form id='form' action='$R{servletURI}' method='POST' enctype='application/x-www-form-urlencoded'>	
+		<div class='data'>
+			<table>
+				<tr><td colspan='2' align='right'><button type='submit'>Submit</button><button type='reset'>Reset</button></td></tr>
+				<tr><th colspan='2'>Contents</th></tr>
+				<tr><td colspan='2'><textarea name='contents' rows='40' cols='120' style='white-space: pre; word-wrap: normal; overflow-x: scroll;'>$A{contents}</textarea></td></tr>
+			</table>
+		</div>
+	</form>	
+</body>
+</html>
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigResource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigResource.java
new file mode 100755
index 0000000..5aa0049
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/ConfigResource.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+import static javax.servlet.http.HttpServletResponse.*;
+import static com.ibm.juno.server.annotation.VarCategory.*;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Map;
+
+import com.ibm.juno.core.ObjectMap;
+import com.ibm.juno.core.ini.*;
+import com.ibm.juno.microservice.Resource;
+import com.ibm.juno.server.*;
+import com.ibm.juno.server.annotation.*;
+
+/**
+ * Shows contents of the microservice configuration file.
+ */
+@RestResource(
+	path="/config",
+	label="Configuration",
+	description="Contents of configuration file.",
+	properties={
+		@Property(name=HTMLDOC_links, value="{up:'$R{requestParentURI}',options:'$R{servletURI}?method=OPTIONS',edit:'$R{servletURI}/edit'}"),
+	}
+)
+public class ConfigResource extends Resource {
+	private static final long serialVersionUID = 1L;
+
+	/** 
+	 * [GET /] - Show contents of config file.
+	 *  
+	 * @return The config file.  
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/", description="Show contents of config file.")
+	public ConfigFile getConfigContents() throws Exception {
+		return getConfig();
+	}
+
+	/** 
+	 * [GET /edit] - Show config file edit page. 
+	 * 
+	 * @param req The HTTP request.
+	 * @return The config file as a reader resource.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/edit", description="Show config file edit page.")
+	public ReaderResource getConfigEditPage(RestRequest req) throws Exception {
+		// Note that we don't want variables in the config file to be resolved,
+		// so we need to escape any $ characters we see.
+		req.setAttribute("contents", getConfig().toString().replaceAll("\\$", "\\\\\\$"));
+		return req.getReaderResource("ConfigEdit.html", true);
+	}
+
+	/** 
+	 * [GET /{section}] - Show config file section.
+	 *  
+	 * @param section The section name. 
+	 * @return The config file section.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/{section}",
+		description="Show config file section.",
+		input={
+			@Var(category=ATTR, name="section", description="Section name.")
+		}
+	)
+	public ObjectMap getConfigSection(@Attr("section") String section) throws Exception {
+		return getSection(section);
+	}
+
+	/** 
+	 * [GET /{section}/{key}] - Show config file entry. 
+	 * 
+	 * @param section The section name. 
+	 * @param key The section key.
+	 * @return The value of the config file entry.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="GET", path="/{section}/{key}",
+		description="Show config file entry.",
+		input={
+			@Var(category=ATTR, name="section", description="Section name."),
+			@Var(category=ATTR, name="key", description="Entry name.")
+		}
+	)
+	public String getConfigEntry(@Attr("section") String section, @Attr("key") String key) throws Exception {
+		return getSection(section).getString(key);
+	}
+
+	/** 
+	 * [POST /] - Sets contents of config file from a FORM post. 
+	 * 
+	 * @param contents The new contents of the config file.
+	 * @return The new config file contents.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="POST", path="/",
+		description="Sets contents of config file from a FORM post.",
+		input={
+			@Var(category=PARAM, name="contents", description="New contents in INI file format.")
+		}
+	)
+	public ConfigFile setConfigContentsFormPost(@Param("contents") String contents) throws Exception {
+		return setConfigContents(new StringReader(contents));
+	}
+
+	/** 
+	 * [PUT /] - Sets contents of config file. 
+	 * 
+	 * @param contents The new contents of the config file. 
+	 * @return The new config file contents.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="PUT", path="/",
+		description="Sets contents of config file.",
+		input={
+			@Var(category=CONTENT, description="New contents in INI file format.")
+		}
+	)
+	public ConfigFile setConfigContents(@Content Reader contents) throws Exception {
+		ConfigFile cf2 = ConfigMgr.DEFAULT.create().load(contents);
+		return getConfig().merge(cf2).save();
+	}
+
+	/** 
+	 * [PUT /{section}] - Add or overwrite a config file section. 
+	 * 
+	 * @param section The section name. 
+	 * @param contents The new contents of the config file section.
+	 * @return The new section.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="PUT", path="/{section}",
+		description="Add or overwrite a config file section.",
+		input={
+			@Var(category=ATTR, name="section", description="Section name."),
+			@Var(category=CONTENT, description="New contents for section as a simple map with string keys and values.")
+		}
+	)
+	public ObjectMap setConfigSection(@Attr("section") String section, @Content Map<String,String> contents) throws Exception {
+		getConfig().setSection(section, contents);
+		return getSection(section);
+	}
+
+	/** 
+	 * [PUT /{section}/{key}] - Add or overwrite a config file entry. 
+	 * 
+	 * @param section The section name. 
+	 * @param key The section key.
+	 * @param value The new value.
+	 * @return The new value.
+	 * @throws Exception 
+	 */
+	@RestMethod(name="PUT", path="/{section}/{key}",
+		description="Add or overwrite a config file entry.",
+		input={
+			@Var(category=ATTR, name="section", description="Section name."),
+			@Var(category=ATTR, name="key", description="Entry name."),
+			@Var(category=CONTENT, description="New value as a string.")
+		}
+	)
+	public String setConfigSection(@Attr("section") String section, @Attr("key") String key, @Content String value) throws Exception {
+		getConfig().put(section, key, value, false);
+		return getSection(section).getString(key);
+	}
+
+	private ObjectMap getSection(String name) {
+		ObjectMap m = getConfig().getSectionMap(name);
+		if (m == null)
+			throw new RestException(SC_NOT_FOUND, "Section not found.");
+		return m;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/DirectoryResource.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/DirectoryResource.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/DirectoryResource.java
new file mode 100755
index 0000000..961827d
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/DirectoryResource.java
@@ -0,0 +1,354 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import static com.ibm.juno.core.html.HtmlDocSerializerProperties.*;
+import static com.ibm.juno.core.html.HtmlSerializerProperties.*;
+import static com.ibm.juno.server.RestServletProperties.*;
+import static java.util.logging.Level.*;
+import static javax.servlet.http.HttpServletResponse.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.logging.*;
+
+import javax.servlet.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.BeanProperty;
+import com.ibm.juno.core.filters.DateFilter;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.microservice.*;
+import com.ibm.juno.server.*;
+import com.ibm.juno.server.annotation.*;
+import com.ibm.juno.server.converters.*;
+
+/**
+ * REST resource that allows access to a file system directory.
+ * <p>
+ * 	The root directory is specified in one of two ways:
+ * </p>
+ * <ul>
+ * 	<li>Specifying the location via a <l>DirectoryResource.rootDir</l> property.
+ * 	<li>Overriding the {@link #getRootDir()} method.
+ * </ul>
+ * <p>
+ * 	Read/write access control is handled through the following properties:
+ * </p>
+ * <ul>
+ * 	<li><l>DirectoryResource.allowViews</l> - If <jk>true</jk>, allows view and download access to files.
+ * 	<li><l>DirectoryResource.allowPuts</l> - If <jk>true</jk>, allows files to be created or overwritten.
+ * 	<li><l>DirectoryResource.allowDeletes</l> - If <jk>true</jk>, allows files to be deleted.
+ * </ul>
+ * <p>
+ * 	Access can also be controlled by overriding the {@link #checkAccess(RestRequest)} method.
+ * </p>
+ */
+@RestResource(
+	label="File System Explorer",
+	description="Contents of $A{path}",
+	messages="nls/DirectoryResource",
+	properties={
+		@Property(name=HTML_uriAnchorText, value=PROPERTY_NAME),
+		@Property(name=HTMLDOC_links, value="{up:'$R{requestParentURI}',options:'?method=OPTIONS',source:'$R{servletParentURI}/source?classes=(com.ibm.juno.server.samples.DirectoryResource)'}"),
+		@Property(name=REST_allowMethodParam, value="*"),
+		@Property(name="DirectoryResource.rootDir", value=""),
+		@Property(name="DirectoryResource.allowViews", value="false"),
+		@Property(name="DirectoryResource.allowDeletes", value="false"),
+		@Property(name="DirectoryResource.allowPuts", value="false")
+	}
+)
+public class DirectoryResource extends Resource {
+	private static final long serialVersionUID = 1L;
+
+	private File rootDir;     // The root directory
+
+	// Settings enabled through servlet init parameters
+	private boolean allowDeletes, allowPuts, allowViews;
+
+	private static Logger logger = Logger.getLogger(DirectoryResource.class.getName());
+
+	@Override /* Servlet */
+	public void init() throws ServletException {
+		ObjectMap p = getProperties();
+		rootDir = new File(p.getString("DirectoryResource.rootDir"));
+		allowViews = p.getBoolean("DirectoryResource.allowViews", false);
+		allowDeletes = p.getBoolean("DirectoryResource.allowDeletes", false);
+		allowPuts = p.getBoolean("DirectoryResource.allowPuts", false);
+	}
+
+	/** 
+	 * Returns the root directory defined by the 'rootDir' init parameter.
+	 * Subclasses can override this method to provide their own root directory. 
+	 * @return The root directory. 
+	 */
+	protected File getRootDir() {
+		if (rootDir == null) {
+			rootDir = new File(getProperties().getString("rootDir"));
+			if (! rootDir.exists())
+				if (! rootDir.mkdirs())
+					throw new RuntimeException("Could not create root dir");
+		}
+		return rootDir;
+	}
+
+	/** 
+	 * [GET /*]
+	 *  On directories, returns a directory listing.
+	 *  On files, returns information about the file.
+	 *  
+	 * @param req - The HTTP request.
+	 * @return Either a FileResource or list of FileResources depending on whether it's a 
+	 * 	file or directory.
+	 * @throws Exception - If file could not be read or access was not granted.
+	 */
+	@RestMethod(name="GET", path="/*", 
+		description="On directories, returns a directory listing.\nOn files, returns information about the file.",
+		converters={Queryable.class}
+	)
+	public Object doGet(RestRequest req) throws Exception {
+		checkAccess(req);
+
+		String pathInfo = req.getPathInfo();
+		File f = pathInfo == null ? rootDir : new File(rootDir.getAbsolutePath() + pathInfo);
+
+		if (!f.exists())
+			throw new RestException(SC_NOT_FOUND, "File not found");
+
+		req.setAttribute("path", f.getAbsolutePath());
+
+		if (f.isDirectory()) {
+			List<FileResource> l = new LinkedList<FileResource>();
+			for (File fc : f.listFiles()) {
+				URL fUrl = new URL(req.getRequestURL().append("/").append(fc.getName()).toString());
+				l.add(new FileResource(fc, fUrl));
+			}
+			return l;
+		}
+
+		return new FileResource(f, new URL(req.getRequestURL().toString()));
+	}
+
+	/** 
+	 * [DELETE /*]
+	 *  Delete a file on the file system.
+	 *  
+	 * @param req - The HTTP request.
+	 * @return The message <js>"File deleted"</js> if successful.
+	 * @throws Exception - If file could not be read or access was not granted.
+	 */
+	@RestMethod(name="DELETE", path="/*",
+		description="Delete a file on the file system."
+	)
+	public Object doDelete(RestRequest req) throws Exception {
+		checkAccess(req);
+
+		File f = new File(rootDir.getAbsolutePath() + req.getPathInfo());
+		deleteFile(f);
+
+		if (req.getHeader("Accept").contains("text/html"))
+			return new Redirect();
+		return "File deleted";
+	}
+
+	/** 
+	 * [PUT /*]
+	 * Add or overwrite a file on the file system.
+	 *  
+	 * @param req - The HTTP request.
+	 * @return The message <js>"File added"</js> if successful.
+	 * @throws Exception - If file could not be read or access was not granted.
+	 */
+	@RestMethod(name="PUT", path="/*", 
+		description="Add or overwrite a file on the file system."
+	)
+	public Object doPut(RestRequest req) throws Exception {
+		checkAccess(req);
+
+		File f = new File(rootDir.getAbsolutePath() + req.getPathInfo());
+		String parentSubPath = f.getParentFile().getAbsolutePath().substring(rootDir.getAbsolutePath().length());
+		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f));
+		IOPipe.create(req.getInputStream(), bos).closeOut().run();
+		if (req.getContentType().contains("html"))
+			return new Redirect(parentSubPath);
+		return "File added";
+	}
+
+	/** 
+	 * [VIEW /*]
+	 * 	View the contents of a file.
+	 * 	Applies to files only.
+	 *  
+	 * @param req - The HTTP request.
+	 * @param res - The HTTP response.
+	 * @return A Reader containing the contents of the file.
+	 * @throws Exception - If file could not be read or access was not granted.
+	 */
+	@RestMethod(name="VIEW", path="/*",
+		description="View the contents of a file.\nApplies to files only."
+	)
+	public Reader doView(RestRequest req, RestResponse res) throws Exception {
+		checkAccess(req);
+
+		File f = new File(rootDir.getAbsolutePath() + req.getPathInfo());
+
+		if (!f.exists())
+			throw new RestException(SC_NOT_FOUND, "File not found");
+
+		if (f.isDirectory())
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "VIEW not available on directories");
+
+		res.setContentType("text/plain");
+		return new FileReader(f);
+	}
+	
+	/** 
+	 * [DOWNLOAD /*]
+	 * 	Download the contents of a file.
+	 * 	Applies to files only.
+	 *  
+	 * @param req - The HTTP request.
+	 * @param res - The HTTP response.
+	 * @return A Reader containing the contents of the file.
+	 * @throws Exception - If file could not be read or access was not granted.
+	 */
+	@RestMethod(name="DOWNLOAD", path="/*",
+		description="Download the contents of a file.\nApplies to files only."
+	)
+	public Reader doDownload(RestRequest req, RestResponse res) throws Exception {
+		checkAccess(req);
+
+		File f = new File(rootDir.getAbsolutePath() + req.getPathInfo());
+
+		if (!f.exists())
+			throw new RestException(SC_NOT_FOUND, "File not found");
+
+		if (f.isDirectory())
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "DOWNLOAD not available on directories");
+
+		res.setContentType("application");
+		return new FileReader(f);
+	}
+	
+	/**
+	 * Verify that the specified request is allowed.
+	 * Subclasses can override this method to provide customized behavior.
+	 * Method should throw a {@link RestException} if the request should be disallowed.
+	 * 
+	 * @param req The HTTP request.
+	 */
+	protected void checkAccess(RestRequest req) {
+		String method = req.getMethod();
+		if (method.equals("VIEW") && ! allowViews)
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "VIEW not enabled");
+		if (method.equals("PUT") && ! allowPuts)
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "PUT not enabled");
+		if (method.equals("DELETE") && ! allowDeletes)
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "DELETE not enabled");
+		if (method.equals("DOWNLOAD") && ! allowViews)
+			throw new RestException(SC_METHOD_NOT_ALLOWED, "DOWNLOAD not enabled");
+	}
+
+	/** File POJO */
+	public class FileResource {
+		private File f;
+		private URL url;
+
+		/** 
+		 * Constructor.
+		 * @param f - The file.
+		 * @param url - The URL of the file resource. 
+		 */
+		public FileResource(File f, URL url) {
+			this.f = f;
+			this.url = url;
+		}
+
+		// Bean property getters
+
+		/**
+		 * @return The URL of the file resource.
+		 */
+		public URL getUrl() {
+			return url;
+		}
+
+		/**
+		 * @return The file type.
+		 */
+		public String getType() {
+			return (f.isDirectory() ? "dir" : "file");
+		}
+
+		/**
+		 * @return The file name.
+		 */
+		public String getName() {
+			return f.getName();
+		}
+
+		/**
+		 * @return The file size.
+		 */
+		public long getSize() {
+			return f.length();
+		}
+
+		/**
+		 * @return The file last modified timestamp.
+		 */
+		@BeanProperty(filter=DateFilter.ISO8601DTP.class)
+		public Date getLastModified() {
+			return new Date(f.lastModified());
+		}
+
+		/**
+		 * @return A hyperlink to view the contents of the file.
+		 * @throws Exception If access is not allowed.
+		 */
+		public URL getView() throws Exception {
+			if (allowViews && f.canRead() && ! f.isDirectory())
+				return new URL(url + "?method=VIEW");
+			return null;
+		}
+
+		/**
+		 * @return A hyperlink to download the contents of the file.
+		 * @throws Exception If access is not allowed.
+		 */
+		public URL getDownload() throws Exception {
+			if (allowViews && f.canRead() && ! f.isDirectory())
+				return new URL(url + "?method=DOWNLOAD");
+			return null;
+		}
+
+		/**
+		 * @return A hyperlink to delete the file.
+		 * @throws Exception If access is not allowed.
+		 */
+		public URL getDelete() throws Exception {
+			if (allowDeletes && f.canWrite())
+				return new URL(url + "?method=DELETE");
+			return null;
+		}
+	}
+
+	/** Utility method */
+	private void deleteFile(File f) {
+		try {
+			if (f.isDirectory())
+				for (File fc : f.listFiles())
+					deleteFile(fc);
+			f.delete();
+		} catch (Exception e) {
+			logger.log(WARNING, "Cannot delete file '" + f.getAbsolutePath() + "'", e);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogEntryFormatter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogEntryFormatter.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogEntryFormatter.java
new file mode 100755
index 0000000..dc612ad
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogEntryFormatter.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * The source code for this program is not published or otherwise
+ * divested of its trade secrets, irrespective of what has been
+ * deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Formatter;
+import java.util.logging.LogRecord;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.ibm.juno.core.utils.StringUtils;
+
+/**
+ * Log entry formatter.
+ * <p>
+ * 	Uses three simple parameter for configuring log entry formats:
+ * 	<ul>
+ * 		<li><code>dateFormat</code> - A {@link SimpleDateFormat} string describing the format for dates.
+ * 		<li><code>format</code> - A string with <code>{...}</code> replacement variables representing predefined fields.
+ * 		<li><code>useStackTraceHashes</code> - A setting that causes duplicate stack traces to be replaced with 8-character hash strings.
+ * 	</ul>
+ * <p>
+ * 	This class converts the format strings into a regular expression that can be used to parse the resulting log file.
+ *
+ * @author jbognar
+ */
+public class LogEntryFormatter extends Formatter {
+
+	private ConcurrentHashMap<String,AtomicInteger> hashes;
+	private DateFormat df;
+	private String format;
+	private Pattern rePattern;
+	private Map<String,Integer> fieldIndexes;
+
+	/**
+	 * Create a new formatter.
+	 * 
+	 * @param format The log entry format.  e.g. <js>"[{date} {level}] {msg}%n"</js>
+	 * 	The string can contain any of the following variables:
+	 * 		<ol>
+	 * 			<li><js>"{date}"</js> - The date, formatted per <js>"Logging/dateFormat"</js>.
+	 * 			<li><js>"{class}"</js> - The class name.
+	 * 			<li><js>"{method}"</js> - The method name.
+	 * 			<li><js>"{logger}"</js> - The logger name.
+	 * 			<li><js>"{level}"</js> - The log level name.
+	 * 			<li><js>"{msg}"</js> - The log message.
+	 * 			<li><js>"{threadid}"</js> - The thread ID.
+	 * 			<li><js>"{exception}"</js> - The localized exception message.
+	 *		</ol>
+	 * @param dateFormat The {@link SimpleDateFormat} format to use for dates.  e.g. <js>"yyyy.MM.dd hh:mm:ss"</js>.
+	 * @param useStackTraceHashes If <jk>true</jk>, only print unique stack traces once and then refer to them by a
+	 * 	simple 8 character hash identifier.
+	 */
+	public LogEntryFormatter(String format, String dateFormat, boolean useStackTraceHashes) {
+		this.df = new SimpleDateFormat(dateFormat);
+		if (useStackTraceHashes)
+			hashes = new ConcurrentHashMap<String,AtomicInteger>();
+
+		fieldIndexes = new HashMap<String,Integer>();
+
+		format = format
+			.replaceAll("\\{date\\}", "%1\\$s")
+			.replaceAll("\\{class\\}", "%2\\$s")
+			.replaceAll("\\{method\\}", "%3\\$s")
+			.replaceAll("\\{logger\\}", "%4\\$s")
+			.replaceAll("\\{level\\}", "%5\\$s")
+			.replaceAll("\\{msg\\}", "%6\\$s")
+			.replaceAll("\\{threadid\\}", "%7\\$s")
+			.replaceAll("\\{exception\\}", "%8\\$s");
+
+		this.format = format;
+
+		// Construct a regular expression to match this log entry.
+		int index = 1;
+		StringBuilder re = new StringBuilder();
+		int S1 = 1; // Looking for %
+		int S2 = 2; // Found %, looking for number.
+		int S3 = 3; // Found number, looking for $.
+		int S4 = 4; // Found $, looking for s.
+		int state = 1;
+		int i1 = 0;
+		for (int i = 0; i < format.length(); i++) {
+			char c = format.charAt(i);
+			if (state == S1) {
+				if (c == '%')
+					state = S2;
+				else {
+					if (! (Character.isLetterOrDigit(c) || Character.isWhitespace(c)))
+						re.append('\\');
+					re.append(c);
+				}
+			} else if (state == S2) {
+				if (Character.isDigit(c)) {
+					i1 = i;
+					state = S3;
+				} else {
+					re.append("\\%").append(c);
+					state = S1;
+				}
+			} else if (state == S3) {
+				if (c == '$') {
+					state = S4;
+				} else {
+					re.append("\\%").append(format.substring(i1, i));
+					state = S1;
+				}
+			} else if (state == S4) {
+				if (c == 's') {
+					int group = Integer.parseInt(format.substring(i1, i-1));
+					switch (group) {
+						case 1:
+							fieldIndexes.put("date", index++);
+							re.append("(" + dateFormat.replaceAll("[mHhsSdMy]", "\\\\d").replaceAll("\\.", "\\\\.") + ")");
+							break;
+						case 2:
+							fieldIndexes.put("class", index++);
+							re.append("([\\p{javaJavaIdentifierPart}\\.]+)");
+							break;
+						case 3:
+							fieldIndexes.put("method", index++);
+							re.append("([\\p{javaJavaIdentifierPart}\\.]+)");
+							break;
+						case 4:
+							fieldIndexes.put("logger", index++);
+							re.append("([\\w\\d\\.\\_]+)");
+							break;
+						case 5:
+							fieldIndexes.put("level", index++);
+							re.append("(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)");
+							break;
+						case 6:
+							fieldIndexes.put("msg", index++);
+							re.append("(.*)");
+							break;
+						case 7:
+							fieldIndexes.put("threadid", index++);
+							re.append("(\\\\d+)");
+							break;
+						case 8:
+							fieldIndexes.put("exception", index++);
+							re.append("(.*)");
+							break;
+					}
+				} else {
+					re.append("\\%").append(format.substring(i1, i));
+				}
+				state = S1;
+			}
+		}
+
+		// The log parser
+		String sre = re.toString();
+		if (sre.endsWith("\\%n"))
+			sre = sre.substring(0, sre.length()-3);
+
+		// Replace instances of %n.
+		sre = sre.replaceAll("\\\\%n", "\\\\n");
+
+		rePattern = Pattern.compile(sre);
+		fieldIndexes = Collections.unmodifiableMap(fieldIndexes);
+	}
+
+	/**
+	 * Returns the regular expression pattern used for matching log entries.
+	 * 
+	 * @return The regular expression pattern used for matching log entries.
+	 */
+	public Pattern getLogEntryPattern() {
+		return rePattern;
+	}
+
+	/**
+	 * Returns the {@link DateFormat} used for matching dates.
+	 * 
+	 * @return The {@link DateFormat} used for matching dates.
+	 */
+	public DateFormat getDateFormat() {
+		return df;
+	}
+
+	/**
+	 * Given a matcher that has matched the pattern specified by {@link #getLogEntryPattern()},
+	 * returns the field value from the match.
+	 * 
+	 * @param fieldName The field name.  Possible values are:
+	 * 	<ul>
+	 * 		<li><js>"date"</js>
+	 * 		<li><js>"class"</js>
+	 * 		<li><js>"method"</js>
+	 * 		<li><js>"logger"</js>
+	 * 		<li><js>"level"</js>
+	 * 		<li><js>"msg"</js>
+	 * 		<li><js>"threadid"</js>
+	 * 		<li><js>"exception"</js>
+	 *	</ul>
+	 * @param m The matcher. 
+	 * @return The field value, or <jk>null</jk> if the specified field does not exist.
+	 */
+	public String getField(String fieldName, Matcher m) {
+		Integer i = fieldIndexes.get(fieldName);
+		return (i == null ? null : m.group(i));
+	}
+
+	@Override /* Formatter */
+	public String format(LogRecord r) {
+		String msg = formatMessage(r);
+		Throwable t = r.getThrown();
+		String hash = null;
+		int c = 0;
+		if (hashes != null && t != null) {
+			hash = hashCode(t);
+			hashes.putIfAbsent(hash, new AtomicInteger(0));
+			c = hashes.get(hash).incrementAndGet();
+			if (c == 1) {
+				msg = '[' + hash + '.' + c + "] " + msg;
+			} else {
+				msg = '[' + hash + '.' + c + "] " + msg + ", " + t.getLocalizedMessage();
+				t = null;
+			}
+		}
+		String s = String.format(format,
+			df.format(new Date(r.getMillis())),
+			r.getSourceClassName(),
+			r.getSourceMethodName(),
+			r.getLoggerName(),
+			r.getLevel(),
+			msg,
+			r.getThreadID(),
+			r.getThrown() == null ? "" : r.getThrown().getMessage());
+		if (t != null)
+			s += String.format("%n%s", StringUtils.getStackTrace(r.getThrown()));
+		return s;
+	}
+
+	private String hashCode(Throwable t) {
+		int i = 0;
+		while (t != null) {
+			for (StackTraceElement e : t.getStackTrace())
+				i ^= e.hashCode();
+			t = t.getCause();
+		}
+		return Integer.toHexString(i);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogParser.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogParser.java
new file mode 100755
index 0000000..f5b969b
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/resources/LogParser.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:
+ * Use, duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.microservice.resources;
+
+import java.io.*;
+import java.nio.charset.*;
+import java.text.*;
+import java.util.*;
+import java.util.regex.*;
+
+
+/**
+ * Utility class for reading log files.
+ * <p>
+ * Provides the capability of returning splices of log files based on dates and filtering based
+ * on thread and logger names.
+ */
+public class LogParser implements Iterable<LogParser.Entry>, Iterator<LogParser.Entry> {
+	private BufferedReader br;
+	private LogEntryFormatter formatter;
+	private Date start, end;
+	private Set<String> loggerFilter, severityFilter;
+	private String threadFilter;
+	private Entry next;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param formatter The log entry formatter. 
+	 * @param f The log file.
+	 * @param start Don't return rows before this date.  If <jk>null</jk>, start from the beginning of the file.
+	 * @param end Don't return rows after this date.  If <jk>null</jk>, go to the end of the file.
+	 * @param thread Only return log entries with this thread name.
+	 * @param loggers Only return log entries produced by these loggers (simple class names).
+	 * @param severity Only return log entries with the specified severity.
+	 * @throws IOException
+	 */
+	public LogParser(LogEntryFormatter formatter, File f, Date start, Date end, String thread, String[] loggers, String[] severity) throws IOException {
+		br = new BufferedReader(new InputStreamReader(new FileInputStream(f), Charset.defaultCharset()));
+		this.formatter = formatter;
+		this.start = start;
+		this.end = end;
+		this.threadFilter = thread;
+		if (loggers != null)
+			this.loggerFilter = new HashSet<String>(Arrays.asList(loggers));
+		if (severity != null)
+			this.severityFilter = new HashSet<String>(Arrays.asList(severity));
+
+		// Find the first line.
+		String line;
+		while (next == null && (line = br.readLine()) != null) {
+			Entry e = new Entry(line);
+			if (e.matches())
+				next = e;
+		}
+	}
+
+	@Override /* Iterator */
+	public boolean hasNext() {
+		return next != null;
+	}
+
+	@Override /* Iterator */
+	public Entry next() {
+		Entry current = next;
+		Entry prev = next;
+		try {
+			next = null;
+			String line = null;
+			while (next == null && (line = br.readLine()) != null) {
+				Entry e = new Entry(line);
+				if (e.isRecord) {
+					if (e.matches())
+						next = e;
+					prev = null;
+ 				} else {
+					if (prev != null)
+						prev.addText(e.line);
+				}
+			}
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return current;
+	}
+
+	@Override /* Iterator */
+	public void remove() {
+		throw new NoSuchMethodError();
+	}
+
+	@Override /* Iterable */
+	public Iterator<Entry> iterator() {
+		return this;
+	}
+
+	/**
+	 * Closes the underlying reader.
+	 * 
+	 * @throws IOException 
+	 */
+	public void close() throws IOException {
+		br.close();
+	}
+
+	/**
+	 * Serializes the contents of the parsed log file to the specified writer
+	 * and then closes the underlying reader.
+	 * 
+	 * @param w The writer to write the log file to. 
+	 * @throws IOException 
+	 */
+	public void writeTo(Writer w) throws IOException {
+		try {
+			if (! hasNext())
+				w.append("[EMPTY]"); //$NON-NLS-1$
+			else for (LogParser.Entry le : this)
+				le.append(w);
+		} finally {
+			close();
+		}
+	}
+
+	/**
+	 * Represents a single line from the log file.
+	 */
+	@SuppressWarnings("javadoc")
+	public class Entry {
+		public Date date;
+		public String severity, logger;
+		protected String line, text;
+		protected String thread;
+		protected List<String> additionalText;
+		protected boolean isRecord;
+
+		Entry(String line) throws IOException {
+			try {
+				this.line = line;
+				Matcher m = formatter.getLogEntryPattern().matcher(line);
+				if (m.matches()) {
+					isRecord = true;
+					String s = formatter.getField("date", m);
+					if (s != null)
+						date = formatter.getDateFormat().parse(s);
+					thread = formatter.getField("thread", m);
+					severity = formatter.getField("level", m);
+					logger = formatter.getField("logger", m);
+					text = formatter.getField("msg", m);
+					if (logger != null && logger.indexOf('.') > -1)
+						logger = logger.substring(logger.lastIndexOf('.')+1);
+				}
+			} catch (ParseException e) {
+				throw new IOException(e);
+			}
+		}
+
+		private void addText(String t) {
+			if (additionalText == null)
+				additionalText = new LinkedList<String>();
+			additionalText.add(t);
+		}
+
+		public String getText() {
+			if (additionalText == null)
+				return text;
+			int i = text.length();
+			for (String s : additionalText)
+				i += s.length() + 1;
+			StringBuilder sb = new StringBuilder(i);
+			sb.append(text);
+			for (String s : additionalText)
+				sb.append('\n').append(s);
+			return sb.toString();
+		}
+
+		public String getThread() {
+			return thread;
+		}
+
+		public Writer appendHtml(Writer w) throws IOException {
+			w.append(toHtml(line)).append("<br>"); //$NON-NLS-1$
+			if (additionalText != null)
+				for (String t : additionalText)
+					w.append(toHtml(t)).append("<br>"); //$NON-NLS-1$
+			return w;
+		}
+
+		protected Writer append(Writer w) throws IOException {
+			w.append(line).append('\n');
+			if (additionalText != null)
+				for (String t : additionalText)
+					w.append(t).append('\n');
+			return w;
+		}
+
+		private boolean matches() {
+			if (! isRecord)
+				return false;
+			if (start != null && date.before(start))
+				return false;
+			if (end != null && date.after(end))
+				return false;
+			if (threadFilter != null && ! threadFilter.equals(thread))
+				return false;
+			if (loggerFilter != null && ! loggerFilter.contains(logger))
+				return false;
+			if (severityFilter != null && ! severityFilter.contains(severity))
+				return false;
+			return true;
+		}
+	}
+
+	private String toHtml(String s) {
+		if (s.indexOf('<') != -1)
+			return s.replaceAll("<", "&lt;");  //$NON-NLS-1$//$NON-NLS-2$
+		return s;
+	}
+}
+


[32/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class
new file mode 100755
index 0000000..5a154d2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class
new file mode 100755
index 0000000..a151fc3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class
new file mode 100755
index 0000000..a09f698
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class
new file mode 100755
index 0000000..3e26446
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class
new file mode 100755
index 0000000..442972d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class
new file mode 100755
index 0000000..c7034a5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class
new file mode 100755
index 0000000..7ce45da
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class
new file mode 100755
index 0000000..cc1ea6d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..99e8745
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.8.3
+Created-By: pwa6470_27sr1-20140411_01 (SR1) (IBM Corporation)
+Bundle-ManifestVersion: 2
+Bundle-Name: Juno Cloud API - Core
+Bundle-SymbolicName: com.ibm.team.juno
+Bundle-Version: 5.2.0.0
+Bundle-Vendor: IBM
+DynamicImport-Package: com.hp.hpl.jena.rdf.model,com.hp.hpl.jena.share
+ d
+Export-Package: com.ibm.juno.core,com.ibm.juno.core.annotation,com.ibm
+ .juno.core.csv,com.ibm.juno.core.dto,com.ibm.juno.core.dto.atom,com.i
+ bm.juno.core.dto.cognos,com.ibm.juno.core.dto.jsonschema,com.ibm.juno
+ .core.encoders,com.ibm.juno.core.filter,com.ibm.juno.core.filters,com
+ .ibm.juno.core.html,com.ibm.juno.core.html.annotation,com.ibm.juno.co
+ re.html.dto,com.ibm.juno.core.ini,com.ibm.juno.core.jena,com.ibm.juno
+ .core.jena.annotation,com.ibm.juno.core.jso,com.ibm.juno.core.json,co
+ m.ibm.juno.core.json.annotation,com.ibm.juno.core.parser,com.ibm.juno
+ .core.plaintext,com.ibm.juno.core.serializer,com.ibm.juno.core.soap,c
+ om.ibm.juno.core.urlencoding,com.ibm.juno.core.urlencoding.annotation
+ ,com.ibm.juno.core.utils,com.ibm.juno.core.xml,com.ibm.juno.core.xml.
+ annotation
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Built-By: jbognar
+Build-Date: December 30 2015
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class
new file mode 100755
index 0000000..813762c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java
new file mode 100755
index 0000000..7030b8b
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java
@@ -0,0 +1,1804 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.utils.ClassUtils.*;
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.lang.reflect.*;
+import java.text.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.filter.Filter;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.ClassUtils.ClassComparator;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Core class of the Juno architecture.
+ * <p>
+ * 	This class servers multiple purposes:
+ * 	<ul>
+ * 		<li>Provides the ability to wrap beans inside {@link Map} interfaces.
+ * 		<li>Serves as a repository for metadata on POJOs, such as associated {@link Filter filters}, {@link PropertyNamer property namers}, etc...
+ * 			which are used to tailor how POJOs are serialized and parsed.
+ * 		<li>Serves as a common utility class for all {@link Serializer Serializers} and {@link Parser Parsers}
+ * 				for serializing and parsing Java beans.
+ * 	</ul>
+ *
+ *
+ * <h5 class='topic'>Bean Contexts</h5>
+ * <p>
+ * 	Typically, it will be sufficient to use the existing {@link #DEFAULT} contexts for creating
+ * 	bean maps.  However, if you want to tweak any of the settings on the context, you must
+ * 	either clone the default context or create a new one from scratch (whichever is simpler for you).
+ * 	You'll notice that this context class uses a fluent interface for defining settings.
+ * <p>
+ * 	Bean context factories can be locked using the {@link BeanContextFactory#lock()} method.  This makes the context settings
+ * 	read-only.  Attempting to change a setting on a locked context will cause a {@link LockedException}
+ * 	to be thrown.  The default context is locked by default.  Cloning a locked context using the
+ * 	{@link #clone()} method produces a new unlocked context.  Locking a context is optional, although
+ * 	it can prevent errors where bean contexts, parsers, or serializers start behaving differently
+ * 	because a setting was changed.  As a general rule, if you want to change a setting on an existing
+ * 	context, you should clone it, modify the setting(s), and then lock the new context.
+ *
+ *
+ * <h5 class='topic'>BeanContext settings</h5>
+ * 	<code>BeanContexts</code> have several settings that can be used to tweak behavior on how beans are handled.
+ * <p>
+ * 	Some settings (e.g. {@link BeanContextProperties#BEAN_beansRequireDefaultConstructor}) are used to differentiate between bean and non-bean classes.
+ * 	Attempting to create a bean map around one of these objects will throw a {@link BeanRuntimeException}.
+ * 	The purpose for this behavior is so that the serializers can identify these non-bean classes and convert them to plain strings using the {@link Object#toString()} method.
+ * <p>
+ * 	Some settings (e.g. {@link BeanContextProperties#BEAN_beanFieldVisibility}) are used to determine what kinds of properties are detected on beans.
+ * <p>
+ * 	Some settings (e.g. {@link BeanContextProperties#BEAN_beanMapPutReturnsOldValue}) change the runtime behavior of bean maps.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * 	This class has configurable properties that can be set through the {@link BeanContextFactory#setProperty(String, Object)} method.
+ * <p>
+ * 	See {@link BeanContextProperties} for settings applicable to this class.
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct a context from scratch.</jc>
+ * 	BeanContext beanContext = <jk>new</jk> BeanContextFactory()
+ * 		.setProperty(BeanContextProperties.<jsf>BEAN_beansRequireDefaultConstructor</jsf>, <jk>true</jk>)
+ * 		.addNotBeanClasses(Foo.<jk>class</jk>)
+ * 		.getBeanContext();
+ *
+ * 	<jc>// Clone an existing context factory.</jc>
+ * 	BeanContext beanContext = otherBeanContextFactory.clone()
+ * 		.setProperty(BeanContextProperties.<jsf>BEAN_beansRequireDefaultConstructor</jsf>, <jk>true</jk>)
+ * 		.addNotBeanClasses(Foo.<jk>class</jk>)
+ * 		.getBeanContext();
+ * </p>
+ *
+ *
+ * <h5 class='topic'>Bean Maps</h5>
+ * <p>
+ * 	{@link BeanMap BeanMaps} are wrappers around Java beans that allow properties to be retrieved and
+ * 	set using the common {@link Map#put(Object,Object)} and {@link Map#get(Object)} methods.<br>
+ * 	<br>
+ * 	Bean maps are created in two ways...
+ * 	<ol>
+ * 		<li> {@link BeanContext#forBean(Object) BeanContext.forBean()} - Wraps an existing bean inside a {@code Map} wrapper.
+ * 		<li> {@link BeanContext#newBeanMap(Class) BeanContext.newInstance()} - Create a new bean instance wrapped in a {@code Map} wrapper.
+ * 	</ol>
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// A sample bean class</jc>
+ * 	<jk>public class</jk> Person {
+ * 		<jk>public</jk> String getName();
+ * 		<jk>public void</jk> setName(String name);
+ * 		<jk>public int</jk> getAge();
+ * 		<jk>public void</jk> setAge(<jk>int</jk> age);
+ * 	}
+ *
+ * 	<jc>// Wrap an existing bean in a new bean map</jc>
+ * 	BeanMap&lt;Person&gt; m1 = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> Person());
+ * 	m1.put(<js>"name"</js>, <js>"John Smith"</js>);
+ * 	m1.put(<js>"age"</js>, 45);
+ *
+ * 	<jc>// Create a new bean instance wrapped in a new bean map</jc>
+ * 	BeanMap&lt;Person&gt; m2 = BeanContext.<jsf>DEFAULT</jsf>.newInstance(Person.<jk>class</jk>);
+ * 	m2.put(<js>"name"</js>, <js>"John Smith"</js>);
+ * 	m2.put(<js>"age"</js>, 45);
+ * 	Person p = m2.getBean();  <jc>// Get the bean instance that was created.</jc>
+ * </p>
+ *
+ *
+ * <h5 class='topic'>Bean Annotations</h5>
+ * <p>
+ * 	This package contains annotations that can be applied to
+ * 	class definitions to override what properties are detected on a bean.
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Bean class definition where only property 'name' is detected.</jc>
+ * 	<ja>&#64;Bean</ja>(properties={<js>"name"</js>})
+ * 	<jk>public class</jk> Person {
+ * 		<jk>public</jk> String getName();
+ * 		<jk>public void</jk> setName(String name);
+ * 		<jk>public int</jk> getAge();
+ * 		<jk>public void</jk> setAge(<jk>int</jk> age);
+ * 	}
+ * <p>
+ * 	See {@link Bean @Bean} and {@link BeanProperty @BeanProperty} for more information.
+ *
+ *
+ * <h5 class='topic'>Beans with read-only properties</h5>
+ * <p>
+ * 	Bean maps can also be defined on top of beans with read-only properties by adding a
+ * 	{@link BeanConstructor @BeanConstructor} annotation to one of the constructors on the
+ * 	bean class.  This will allow read-only properties to be set through constructor arguments.
+ * <p>
+ * 	When the <code>@BeanConstructor</code> annotation is present, bean instantiation is delayed until the call to {@link BeanMap#getBean()}.
+ * 	Until then, bean property values are stored in a local cache until <code>getBean()</code> is called.
+ * 	Because of this additional caching step, parsing into read-only beans tends to be slower and use
+ * 	more memory than parsing into beans with writable properties.
+ * <p>
+ * 	Attempting to call {@link BeanMap#put(String,Object)} on a read-only property after calling {@link BeanMap#getBean()}
+ * 	will result in a {@link BeanRuntimeException} being thrown.
+ * 	Multiple calls to {@link BeanMap#getBean()} will return the same bean instance.
+ * <p>
+ * 	Beans can be defined with a combination of read-only and read-write properties.
+ * <p>
+ * 	See {@link BeanConstructor @BeanConstructor} for more information.
+ *
+ *
+ * <h5 class='topic'>Filters</h5>
+ * <p>
+ * 	{@link Filter Filters} are used to tailor how beans and non-beans are handled.<br>
+ * 	There are two subclasses of filters:
+ * 	<ol>
+ * 		<li>{@link BeanFilter} - Allows you to tailor handling of bean classes.
+ * 			This class can be considered a programmatic equivalent to the {@link Bean} annotation when
+ * 			annotating classes are not possible (e.g. you don't have access to the source).
+ * 		<li>{@link PojoFilter} - Allows you to convert objects to serializable forms.
+ * 	</ol>
+ * <p>
+ * 	See {@link com.ibm.juno.core.filter} for more information.
+ *
+ *
+ * <h5 class='topic'>ClassMetas</h5>
+ * <p>
+ * 	The {@link ClassMeta} class is a wrapper around {@link Class} object that provides cached information
+ * 	about that class (e.g. whether it's a {@link Map} or {@link Collection} or bean).
+ * <p>
+ * 	As a general rule, it's best to reuse bean contexts (and therefore serializers and parsers too)
+ * 	whenever possible since it takes some time to populate the internal {@code ClassMeta} object cache.
+ * 	By reusing bean contexts, the class type metadata only needs to be calculated once which significantly
+ * 	improves performance.
+ * <p>
+ * 	See {@link ClassMeta} for more information.
+ *
+ * @author Barry M. Caceres
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({"unchecked","rawtypes"})
+public final class BeanContext {
+
+	// Cache of all instances of classMetaCache for all bean contexts keyed by
+	// the hashcode of the bean context during creation.
+	// TODO - Convert these to soft references.
+	private static final ConcurrentHashMap<BeanContext,Map<Class,ClassMeta>> cmCacheCache = new ConcurrentHashMap<BeanContext,Map<Class,ClassMeta>>();
+
+	/** Default context.  All default settings. */
+	public static final BeanContext DEFAULT = new BeanContextFactory().getBeanContext();
+
+	final boolean
+		beansRequireDefaultConstructor,
+		beansRequireSerializable,
+		beansRequireSettersForGetters,
+		beansRequireSomeProperties,
+		beanMapPutReturnsOldValue,
+		useInterfaceProxies,
+		ignoreUnknownBeanProperties,
+		ignoreUnknownNullBeanProperties,
+		ignorePropertiesWithoutSetters,
+		ignoreInvocationExceptionsOnGetters,
+		ignoreInvocationExceptionsOnSetters,
+		useJavaBeanIntrospector;
+
+	final Visibility
+		beanConstructorVisibility,
+		beanClassVisibility,
+		beanMethodVisibility,
+		beanFieldVisibility;
+
+	final int b;
+	final BeanFilter[] beanFilters;
+	final PojoFilter[] pojoFilters;
+	final Class[] notBeanClasses;
+	final String[] notBeanPackages;
+	final Map<Class<?>,Class<?>> implClasses = new TreeMap<Class<?>, Class<?>>(new ClassComparator());
+	final Map<String,String> uriVars = new TreeMap<String,String>();
+	final Class[] implKeyClasses, implValueClasses;
+	final String[] uriKeys, uriVals;
+	final Map<Class,ClassMeta> cmCache;
+	final ClassMeta<Object> cmObject;  // Reusable ClassMeta that represents general Objects.
+	final ClassMeta<String> cmString;  // Reusable ClassMeta that represents general Strings.
+	final String[] notBeanPackageNames, notBeanPackagePrefixes;
+	final int hashCode;
+	final ClassLoader classLoader;
+
+	// Optional default parser set by setDefaultParser().
+	final ReaderParser defaultParser;
+
+	// Holds pending ClassMetas (created, but not yet initialized).
+	final Deque<ClassMeta> pendingClassMetas = new LinkedList<ClassMeta>();
+
+
+	BeanContext(BeanContextFactory bc) {
+		beansRequireDefaultConstructor = bc.beansRequireDefaultConstructor;
+		beansRequireSerializable = bc.beansRequireSerializable;
+		beansRequireSettersForGetters = bc.beansRequireSettersForGetters;
+		beansRequireSomeProperties = bc.beansRequireSomeProperties;
+		beanMapPutReturnsOldValue = bc.beanMapPutReturnsOldValue;
+		useInterfaceProxies = bc.useInterfaceProxies;
+		ignoreUnknownBeanProperties = bc.ignoreUnknownBeanProperties;
+		ignoreUnknownNullBeanProperties = bc.ignoreUnknownNullBeanProperties;
+		ignorePropertiesWithoutSetters = bc.ignorePropertiesWithoutSetters;
+		ignoreInvocationExceptionsOnGetters = bc.ignoreInvocationExceptionsOnGetters;
+		ignoreInvocationExceptionsOnSetters = bc.ignoreInvocationExceptionsOnSetters;
+		useJavaBeanIntrospector = bc.useJavaBeanIntrospector;
+		beanConstructorVisibility = bc.beanConstructorVisibility;
+		beanClassVisibility = bc.beanClassVisibility;
+		beanMethodVisibility = bc.beanMethodVisibility;
+		beanFieldVisibility = bc.beanFieldVisibility;
+
+		b =
+			(beansRequireDefaultConstructor ? 1<<1 : 0)
+				+ (beansRequireSerializable ? 1<<2 : 0)
+				+ (beansRequireSettersForGetters ? 1<<3 : 0)
+				+ (beansRequireSomeProperties ? 1<<4 : 0)
+				+ (beanMapPutReturnsOldValue ? 1<<5 : 0)
+				+ (useJavaBeanIntrospector ? 1<<6 : 0)
+				+ (useInterfaceProxies ? 1<<8 : 0)
+				+ (ignoreUnknownBeanProperties ? 1<<9 : 0)
+				+ (ignoreUnknownNullBeanProperties ? 1<<10 : 0)
+				+ (ignorePropertiesWithoutSetters ? 1<<11 : 0)
+				+ (ignoreInvocationExceptionsOnGetters ? 1<<12 : 0)
+				+ (ignoreInvocationExceptionsOnSetters ? 1<<13 : 0);
+
+		LinkedList<BeanFilter> lbf = new LinkedList<BeanFilter>();
+		LinkedList<PojoFilter> lpf = new LinkedList<PojoFilter>();
+ 		for (Class<?> c : bc.filters) {
+			if (isParentClass(Filter.class, c)) {
+				try {
+					if (isParentClass(BeanFilter.class, c)) {
+						BeanFilter f = (BeanFilter)c.newInstance();
+						f.setBeanContext(this);
+						lbf.add(f);
+					} else if (isParentClass(PojoFilter.class, c)) {
+						PojoFilter f = (PojoFilter)c.newInstance();
+						f.setBeanContext(this);
+						lpf.add(f);
+					}
+				} catch (Exception e) {
+					throw new RuntimeException(e);
+				}
+			} else {
+				if (! c.getClass().isInterface()) {
+					List<SurrogateFilter<?,?>> l = SurrogateFilter.findFilters(c);
+					if (! l.isEmpty()) {
+						for (SurrogateFilter<?,?> f : l) {
+							f.setBeanContext(this);
+							lpf.add(f);
+						}
+						continue;
+					}
+				}
+				BeanFilter f = new InterfaceBeanFilter(c);
+				f.setBeanContext(this);
+				lbf.add(f);
+			}
+		}
+ 		beanFilters = lbf.toArray(new BeanFilter[0]);
+ 		pojoFilters = lpf.toArray(new PojoFilter[0]);
+		notBeanClasses = bc.notBeanClasses.toArray(new Class[0]);
+		notBeanPackages = bc.notBeanPackages.toArray(new String[0]);
+		implClasses.putAll(bc.implClasses);
+		uriVars.putAll(bc.uriVars);
+		implKeyClasses = implClasses.keySet().toArray(new Class[0]);
+		implValueClasses = implClasses.values().toArray(new Class[0]);
+		uriKeys = uriVars.keySet().toArray(new String[0]);
+		uriVals = uriVars.values().toArray(new String[0]);
+
+		List<String> l1 = new LinkedList<String>();
+		List<String> l2 = new LinkedList<String>();
+		for (String s : notBeanPackages) {
+			if (s.endsWith(".*"))
+				l2.add(s.substring(0, s.length()-2));
+			else
+				l1.add(s);
+		}
+		notBeanPackageNames = l1.toArray(new String[l1.size()]);
+		notBeanPackagePrefixes = l2.toArray(new String[l2.size()]);
+
+		defaultParser = bc.defaultParser;
+
+		int h = b;
+		for (BeanFilter f : beanFilters)
+			h = hash(h, f.hashCode());
+		for (PojoFilter f : pojoFilters)
+			h = hash(h, f.hashCode());
+		h = hash(h, beanConstructorVisibility.hashCode());
+		h = hash(h, beanClassVisibility.hashCode());
+		h = hash(h, beanMethodVisibility.hashCode());
+		h = hash(h, beanFieldVisibility.hashCode());
+		for (Class c : notBeanClasses)
+			h += c.hashCode();
+		for (String s : notBeanPackages)
+			h += s.hashCode();
+		for (Map.Entry<Class<?>,Class<?>> e : implClasses.entrySet()) {
+			h += e.getKey().hashCode();
+			h += e.getValue().hashCode();
+		}
+		for (Map.Entry<String,String> e : uriVars.entrySet()) {
+			h += e.getKey().hashCode();
+			h += e.getValue().hashCode();
+		}
+		hashCode = h;
+
+		Map<Class,ClassMeta> cmc = cmCacheCache.get(this);
+		if (cmc == null) {
+			cmc = new ConcurrentHashMap<Class,ClassMeta>();
+			cmc.put(Object.class, new ClassMeta(Object.class, this));
+			cmc.put(String.class, new ClassMeta(String.class, this));
+			Map<Class,ClassMeta> cmc2 = cmCacheCache.putIfAbsent(this, cmc);
+			cmc = (cmc2 == null ? cmc : cmc2);
+		}
+		cmCache = cmc;
+		cmObject = cmc.get(Object.class);
+		cmString = cmc.get(String.class);
+
+		classLoader = bc.classLoader;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified bean context shares the same cache as this bean context.
+	 * Useful for testing purposes.
+	 *
+	 * @param bc The bean context to compare to.
+	 * @return <jk>true</jk> if the bean contexts have equivalent settings and thus share caches.
+	 */
+	public boolean hasSameCache(BeanContext bc) {
+		return bc.cmCache == this.cmCache;
+	}
+
+
+	/**
+	 * Bean property getter:  <property>ignoreUnknownBeanProperties</property>.
+	 * See {@link BeanContextProperties#BEAN_ignoreUnknownBeanProperties}.
+	 *
+	 * @return The value of the <property>ignoreUnknownBeanProperties</property> property on this bean.
+	 */
+	public boolean isIgnoreUnknownBeanProperties() {
+		return ignoreUnknownBeanProperties;
+	}
+
+
+	/**
+	 * Determines whether the specified class is ignored as a bean class based on the various
+	 * 	exclusion parameters specified on this context class.
+	 *
+	 * @param c The class type being tested.
+	 * @return <jk>true</jk> if the specified class matches any of the exclusion parameters.
+	 */
+	protected boolean isNotABean(Class<?> c) {
+		if (c.isArray() || c.isPrimitive() || c.isEnum() || c.isAnnotation())
+			return true;
+		Package p = c.getPackage();
+		if (p != null) {
+			for (String p2 : notBeanPackageNames)
+				if (p.getName().equals(p2))
+					return true;
+			for (String p2 : notBeanPackagePrefixes)
+				if (p.getName().startsWith(p2))
+					return true;
+		}
+		for (Class exclude : notBeanClasses)
+			if (isParentClass(exclude, c))
+				return true;
+		return false;
+	}
+
+	/**
+	 * Prints meta cache statistics to <code>System.out</code>.
+	 */
+	protected static void dumpCacheStats() {
+		try {
+			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()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Wraps an object inside a {@link BeanMap} object (i.e. a modifiable {@link Map}).
+	 * <p>
+	 * 	If object is not a true bean, then throws a {@link BeanRuntimeException} with an explanation of why it's not a bean.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a bean map around a bean instance</jc>
+	 * 	BeanMap&lt;Person&gt; bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> Person());
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class of the object being wrapped.
+	 * @param o The object to wrap in a map interface.  Must not be null.
+	 * @return The wrapped object.
+	 */
+	public <T> BeanMap<T> forBean(T o) {
+		return this.forBean(o, (Class<T>)o.getClass());
+	}
+
+	/**
+	 * Determines whether the specified object matches the requirements on this context of being a bean.
+	 *
+	 * @param o The object being tested.
+	 * @return <jk>true</jk> if the specified object is considered a bean.
+	 */
+	public boolean isBean(Object o) {
+		if (o == null)
+			return false;
+		return isBean(o.getClass());
+	}
+
+	/**
+	 * Determines whether the specified class matches the requirements on this context of being a bean.
+	 *
+	 * @param c The class being tested.
+	 * @return <jk>true</jk> if the specified class is considered a bean.
+	 */
+	public boolean isBean(Class<?> c) {
+		return getBeanMeta(c) != null;
+	}
+
+	/**
+	 * Wraps an object inside a {@link BeanMap} object (i.e.: a modifiable {@link Map})
+	 * defined as a bean for one of its class, a super class, or an implemented interface.
+	 * <p>
+	 * 	If object is not a true bean, throws a {@link BeanRuntimeException} with an explanation of why it's not a bean.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a bean map for new bean using only properties defined in a superclass</jc>
+	 * 	BeanMap&lt;MySubBean&gt; bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> MySubBean(), MySuperBean.<jk>class</jk>);
+	 *
+	 * 	<jc>// Construct a bean map for new bean using only properties defined in an interface</jc>
+	 * 	BeanMap&lt;MySubBean&gt; bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> MySubBean(), MySuperInterface.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class of the object being wrapped.
+	 * @param o The object to wrap in a bean interface.  Must not be null.
+	 * @param c The superclass to narrow the bean properties to.  Must not be null.
+	 * @return The bean representation, or <jk>null</jk> if the object is not a true bean.
+	 * @throws NullPointerException If either parameter is null.
+	 * @throws IllegalArgumentException If the specified object is not an an instance of the specified class.
+	 * @throws BeanRuntimeException If specified object is not a bean according to the bean rules
+	 * 		specified in this context class.
+	 */
+	public <T> BeanMap<T> forBean(T o, Class<? super T> c) throws BeanRuntimeException {
+		assertFieldNotNull(o, "o");
+		assertFieldNotNull(c, "c");
+
+		if (! c.isInstance(o))
+			illegalArg("The specified object is not an instance of the specified class.  class=''{0}'', objectClass=''{1}'', object=''{2}''", c.getName(), o.getClass().getName(), 0);
+
+		ClassMeta cm = getClassMeta(c);
+
+		BeanMeta m = cm.getBeanMeta();
+		if (m == null)
+			throw new BeanRuntimeException(c, "Class is not a bean.  Reason=''{0}''", cm.getNotABeanReason());
+		return new BeanMap<T>(o, m);
+	}
+
+	/**
+	 * Creates a new {@link BeanMap} object (i.e. a modifiable {@link Map}) of the given class with uninitialized property values.
+	 * <p>
+	 * 	If object is not a true bean, then throws a {@link BeanRuntimeException} with an explanation of why it's not a bean.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a new bean map wrapped around a new Person object</jc>
+	 * 	BeanMap&lt;Person&gt; bm = BeanContext.<jsf>DEFAULT</jsf>.newBeanMap(Person.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class of the object being wrapped.
+	 * @param c The name of the class to create a new instance of.
+	 * @return A new instance of the class.
+	 */
+	public <T> BeanMap<T> newBeanMap(Class<T> c) {
+		return newBeanMap(null, c);
+	}
+
+	/**
+	 * Same as {@link #newBeanMap(Class)}, except used for instantiating inner member classes that must
+	 * 	be instantiated within another class instance.
+	 *
+	 * @param <T> The class of the object being wrapped.
+	 * @param c The name of the class to create a new instance of.
+	 * @param outer If class is a member class, this is the instance of the containing class.
+	 * 	Should be <jk>null</jk> if not a member class.
+	 * @return A new instance of the class.
+	 */
+	public <T> BeanMap<T> newBeanMap(Object outer, Class<T> c) {
+		BeanMeta m = getBeanMeta(c);
+		if (m == null)
+			return null;
+		T bean = null;
+		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>(bean, m);
+	}
+
+	/**
+	 * Creates a new empty bean of the specified type, except used for instantiating inner member classes that must
+	 * 	be instantiated within another class instance.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Construct a new instance of the specified bean class</jc>
+	 * 	Person p = BeanContext.<jsf>DEFAULT</jsf>.newBean(Person.<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param <T> The class type of the bean being created.
+	 * @param c The class type of the bean being created.
+	 * @return A new bean object.
+	 * @throws BeanRuntimeException If the specified class is not a valid bean.
+	 */
+	public <T> T newBean(Class<T> c) throws BeanRuntimeException {
+		return newBean(null, c);
+	}
+
+	/**
+	 * Same as {@link #newBean(Class)}, except used for instantiating inner member classes that must
+	 * 	be instantiated within another class instance.
+	 *
+	 * @param <T> The class type of the bean being created.
+	 * @param c The class type of the bean being created.
+	 * @param outer If class is a member class, this is the instance of the containing class.
+	 * 	Should be <jk>null</jk> if not a member class.
+	 * @return A new bean object.
+	 * @throws BeanRuntimeException If the specified class is not a valid bean.
+	 */
+	public <T> T newBean(Object outer, Class<T> c) throws BeanRuntimeException {
+		ClassMeta<T> cm = getClassMeta(c);
+		BeanMeta m = cm.getBeanMeta();
+		if (m == null)
+			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.beanFilter != null && cm.beanFilter.getSubTypeProperty() != null)
+					return null;
+				throw new BeanRuntimeException(c, "Class does not have a no-arg constructor.");
+			}
+			return o;
+		} catch (BeanRuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new BeanRuntimeException(e);
+		}
+	}
+
+	/**
+	 * Returns the {@link BeanMeta} class for the specified class.
+	 *
+	 * @param <T> The class type to get the meta-data on.
+	 * @param c The class to get the meta-data on.
+	 * @return The {@link BeanMeta} for the specified class, or <jk>null</jk> if the class
+	 * 	is not a bean per the settings on this context.
+	 */
+	public <T> BeanMeta<T> getBeanMeta(Class<T> c) {
+		if (c == null)
+			return null;
+		return getClassMeta(c).getBeanMeta();
+	}
+
+	/**
+	 * Returns the class type bound to this bean context if the specified class type
+	 * 	is from another bean context.
+	 * <p>
+	 * For example, this method allows you to pass in an object from <code>BeanContext.<jsf>DEFAULT</jsf>.getMapClassMeta(...)</code>
+	 * 	to any of the <code>ReaderParser.parse(Reader, ClassMeta, ParserContext)</code> methods, and the parsers
+	 * 	will use this method to replace the class type with the one registered with the parser.
+	 * This ensures that registered filters are applied correctly.
+	 *
+	 * @param <T> The class type.
+	 * @param cm The class type.
+	 * @return The class type bound by this bean context.
+	 */
+	public <T> ClassMeta<T> normalizeClassMeta(ClassMeta<T> cm) {
+		if (cm == null)
+			return (ClassMeta<T>)object();
+		if (cm.beanContext == this || cm.beanContext.equals(this))
+			return cm;
+		if (cm.isMap()) {
+			ClassMeta<Map> cm2 = (ClassMeta<Map>)cm;
+			cm2 = getMapClassMeta(cm2.getInnerClass(), cm2.getKeyType().getClass(), cm2.getValueType().getClass());
+			return (ClassMeta<T>)cm2;
+		}
+		if (cm.isCollection()) {
+			ClassMeta<Collection> cm2 = (ClassMeta<Collection>)cm;
+			cm2 = getCollectionClassMeta(cm2.getInnerClass(), cm2.getElementType().getClass());
+		}
+		return getClassMeta(cm.getInnerClass());
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Class} object.
+	 *
+	 * @param <T> The class type being wrapped.
+	 * @param c The class being wrapped.
+	 * 	of type {@link Class} or {@link ClassMeta}.
+	 * @return If the class is not an array, returns a cached {@link ClassMeta} object.
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.<br>
+	 */
+	public <T> ClassMeta<T> getClassMeta(Class<T> c) {
+
+		// If this is an array, then we want it wrapped in an uncached ClassMeta object.
+		// Note that if it has a pojo filter, we still want to cache it so that
+		// we can cache something like byte[] with ByteArrayBase64Filter.
+		if (c.isArray() && findPojoFilter(c) == null)
+			return new ClassMeta(c, this);
+
+		ClassMeta<T> cm = cmCache.get(c);
+		if (cm == null) {
+
+			synchronized (this) {
+
+				// Make sure someone didn't already set it while this thread was blocked.
+				cm = cmCache.get(c);
+				if (cm == null) {
+
+					// Note:  Bean properties add the possibility that class reference loops exist.
+					// To handle this possibility, we create a set of pending ClassMetas, and
+					// call init (which finds the bean properties) after it's been added to the pending set.
+					for (ClassMeta pcm : pendingClassMetas)
+						if (pcm.innerClass == c)
+							return pcm;
+
+					cm = new ClassMeta<T>(c, this, true);
+					pendingClassMetas.addLast(cm);
+					try {
+						cm.init();
+					} finally {
+						pendingClassMetas.removeLast();
+					}
+					cmCache.put(c, cm);
+				}
+			}
+		}
+		return cm;
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Map} object.
+	 *
+	 * @param <K> The map key class type.
+	 * @param <V> The map value class type.
+	 * @param <T> The map class type.
+	 * @param c The map class type.
+	 * @param keyType The map key class type.
+	 * @param valueType The map value class type.
+	 * @return If the key and value types are OBJECT, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, ClassMeta<K> keyType, ClassMeta<V> valueType) {
+		if (keyType.isObject() && valueType.isObject())
+			return getClassMeta(c);
+		return new ClassMeta(c, this).setKeyType(keyType).setValueType(valueType);
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Map} object.
+	 *
+	 * @param <K> The map key class type.
+	 * @param <V> The map value class type.
+	 * @param <T> The map class type.
+	 * @param c The map class type.
+	 * @param keyType The map key class type.
+	 * @param valueType The map value class type.
+	 * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, Class<K> keyType, Class<V> valueType) {
+		return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType));
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Map} object.
+	 *
+	 * @param <T> The map class type.
+	 * @param c The map class type.
+	 * @param keyType The map key class type.
+	 * @param valueType The map value class type.
+	 * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <T extends Map> ClassMeta<T> getMapClassMeta(Class<T> c, Type keyType, Type valueType) {
+		return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType));
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Collection} object.
+	 *
+	 * @param <E> The collection element class type.
+	 * @param <T> The collection class type.
+	 * @param c The collection class type.
+	 * @param elementType The collection element class type.
+	 * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, ClassMeta<E> elementType) {
+		if (elementType.isObject())
+			return getClassMeta(c);
+		return new ClassMeta(c, this).setElementType(elementType);
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Collection} object.
+	 *
+	 * @param <E> The collection element class type.
+	 * @param <T> The collection class type.
+	 * @param c The collection class type.
+	 * @param elementType The collection element class type.
+	 * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, Class<E> elementType) {
+		return getCollectionClassMeta(c, getClassMeta(elementType));
+	}
+
+	/**
+	 * Construct a {@code ClassMeta} wrapper around a {@link Collection} object.
+	 *
+	 * @param <T> The collection class type.
+	 * @param c The collection class type.
+	 * @param elementType The collection element class type.
+	 * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br>
+	 * 	Otherwise, returns a new {@link ClassMeta} object every time.
+	 */
+	public <T extends Collection> ClassMeta<T> getCollectionClassMeta(Class<T> c, Type elementType) {
+		return getCollectionClassMeta(c, getClassMeta(elementType));
+	}
+
+	/**
+	 * Constructs a ClassMeta object given the specified object and parameters.
+	 *
+	 * @param o The parent class type.
+	 * 	Can be any of the following types:
+	 * 	<ul>
+	 * 		<li>{@link ClassMeta} object, which just returns the same object.
+	 * 		<li>{@link Class} object (e.g. <code>String.<jk>class</jk></code>).
+	 * 		<li>{@link Type} object (e.g. {@link ParameterizedType} or {@link GenericArrayType}.
+	 * 		<li>Anything else is interpreted as {@code getClassMeta(o.getClass(), parameters);}
+	 * 	</ul>
+	 * @return A ClassMeta object, or <jk>null</jk> if the object is null.
+	 */
+	public ClassMeta getClassMeta(Type o) {
+		return getClassMeta(o, null);
+	}
+
+	ClassMeta getClassMeta(Type o, Map<Class<?>,Class<?>[]> typeVarImpls) {
+		if (o == null)
+			return null;
+
+		if (o instanceof ClassMeta)
+			return (ClassMeta)o;
+
+		Class c = null;
+		if (o instanceof Class) {
+			c = (Class)o;
+		} else if (o instanceof ParameterizedType) {
+			// A parameter (e.g. <String>.
+			c = (Class<?>)((ParameterizedType)o).getRawType();
+		} else if (o instanceof GenericArrayType) {
+			// An array parameter (e.g. <byte[]>.
+			GenericArrayType gat = (GenericArrayType)o;
+			Type gatct = gat.getGenericComponentType();
+			if (gatct instanceof Class) {
+				Class gatctc = (Class)gatct;
+				c = Array.newInstance(gatctc, 0).getClass();
+			} else if (gatct instanceof ParameterizedType) {
+				Class gatctc = (Class<?>)((ParameterizedType)gatct).getRawType();
+				c = Array.newInstance(gatctc, 0).getClass();
+			} else {
+				return null;
+			}
+		} else if (o instanceof TypeVariable) {
+			if (typeVarImpls != null) {
+				TypeVariable t = (TypeVariable) o;
+				String varName = t.getName();
+				int varIndex = -1;
+				Class gc = (Class)t.getGenericDeclaration();
+				TypeVariable[] tv = gc.getTypeParameters();
+				for (int i = 0; i < tv.length; i++) {
+					if (tv[i].getName().equals(varName)) {
+						varIndex = i;
+					}
+				}
+				if (varIndex != -1) {
+
+					// If we couldn't find a type variable implementation, that means
+					// the type was defined at runtime (e.g. Bean b = new Bean<Foo>();)
+					// in which case the type is lost through erasure.
+					// Assume java.lang.Object as the type.
+					if (! typeVarImpls.containsKey(gc))
+						return object();
+
+					return getClassMeta(typeVarImpls.get(gc)[varIndex]);
+				}
+			}
+			// We don't know the bounded type, so just resolve to Object.
+			return object();
+		} else {
+			// This can happen when trying to resolve the "E getFirst()" method on LinkedList, whose type is a TypeVariable
+			// These should just resolve to Object.
+			return object();
+		}
+
+		ClassMeta rawType = getClassMeta(c);
+
+		// If this is a Map or Collection, and the parameter types aren't part
+		// of the class definition itself (e.g. class AddressBook extends List<Person>),
+		// then we need to figure out the parameters.
+		if (rawType.isMap() || rawType.isCollection()) {
+			ClassMeta[] params = findParameters(o, c);
+			if (params == null)
+				return rawType;
+			if (rawType.isMap()) {
+				if (params.length != 2)
+					return rawType;
+				if (params[0].isObject() && params[1].isObject())
+					return rawType;
+				return new ClassMeta(rawType.innerClass, this).setKeyType(params[0]).setValueType(params[1]);
+			}
+			if (rawType.isCollection()) {
+				if (params.length != 1)
+					return rawType;
+				if (params[0].isObject())
+					return rawType;
+				return new ClassMeta(rawType.innerClass, this).setElementType(params[0]);
+			}
+		}
+
+		return rawType;
+	}
+
+	/**
+	 * Given an array of {@link Class} objects, returns an array of corresponding {@link ClassMeta} objects.
+	 * Constructs a new array on each call.
+	 *
+	 * @param classes The array of classes to get class metas for.
+	 * @return An array of {@link ClassMeta} objects corresponding to the classes.  Never <jk>null</jk>.
+	 */
+	public ClassMeta<?>[] getClassMetas(Class<?>[] classes) {
+		assertFieldNotNull(classes, "classes");
+		ClassMeta<?>[] cm = new ClassMeta<?>[classes.length];
+		for (int i = 0; i < classes.length; i++)
+			cm[i] = getClassMeta(classes[i]);
+		return cm;
+	}
+
+	ClassMeta[] findParameters(Type o, Class c) {
+		if (o == null)
+			o = c;
+
+		// Loop until we find a ParameterizedType
+		if (! (o instanceof ParameterizedType)) {
+			loop: do {
+				o = c.getGenericSuperclass();
+				if (o instanceof ParameterizedType)
+					break loop;
+				for (Type t : c.getGenericInterfaces()) {
+					o = t;
+					if (o instanceof ParameterizedType)
+						break loop;
+				}
+				c = c.getSuperclass();
+			} while (c != null);
+		}
+
+		if (o instanceof ParameterizedType) {
+			ParameterizedType pt = (ParameterizedType)o;
+			if (! pt.getRawType().equals(Enum.class)) {
+				List<ClassMeta<?>> l = new LinkedList<ClassMeta<?>>();
+				for (Type pt2 : pt.getActualTypeArguments()) {
+					if (pt2 instanceof WildcardType || pt2 instanceof TypeVariable)
+						return null;
+					l.add(getClassMeta(pt2, null));
+				}
+				if (l.isEmpty())
+					return null;
+				return l.toArray(new ClassMeta[l.size()]);
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * Shortcut for calling {@code getClassMeta(o.getClass())}.
+	 *
+	 * @param <T> The class of the object being passed in.
+	 * @param o The class to find the class type for.
+	 * @return The ClassMeta object, or <jk>null</jk> if {@code o} is <jk>null</jk>.
+	 */
+	public <T> ClassMeta<T> getClassMetaForObject(T o) {
+		if (o == null)
+			return null;
+		return (ClassMeta<T>)getClassMeta(o.getClass());
+	}
+
+
+	/**
+	 * Used for determining the class type on a method or field where a {@code @BeanProperty} annotation
+	 * 	may be present.
+	 *
+	 * @param <T> The class type we're wrapping.
+	 * @param p The property annotation on the type if there is one.
+	 * @param t The type.
+	 * @param typeVarImpls Contains known resolved type parameters on the specified class so
+	 * 	that we can result {@code ParameterizedTypes} and {@code TypeVariables}.<br>
+	 * 	Can be <jk>null</jk> if the information is not known.
+	 * @return The new {@code ClassMeta} object wrapped around the {@code Type} object.
+	 */
+	protected <T> ClassMeta<T> getClassMeta(BeanProperty p, Type t, Map<Class<?>,Class<?>[]> typeVarImpls) {
+		ClassMeta<T> cm = getClassMeta(t, typeVarImpls);
+		ClassMeta<T> cm2 = cm;
+		if (p != null) {
+
+			if (p.type() != Object.class)
+				cm2 = getClassMeta(p.type(), typeVarImpls);
+
+			if (cm2.isMap()) {
+				Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class, Object.class} : p.params());
+				if (pParams.length != 2)
+					throw new RuntimeException("Invalid number of parameters specified for Map (must be 2): " + pParams.length);
+				ClassMeta<?> keyType = resolveType(pParams[0], cm2.getKeyType(), cm.getKeyType());
+				ClassMeta<?> valueType = resolveType(pParams[1], cm2.getValueType(), cm.getValueType());
+				if (keyType.isObject() && valueType.isObject())
+					return cm2;
+				return new ClassMeta<T>(cm2.innerClass, this).setKeyType(keyType).setValueType(valueType);
+			}
+
+			if (cm2.isCollection()) {
+				Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class} : p.params());
+				if (pParams.length != 1)
+					throw new RuntimeException("Invalid number of parameters specified for Collection (must be 1): " + pParams.length);
+				ClassMeta<?> elementType = resolveType(pParams[0], cm2.getElementType(), cm.getElementType());
+				if (elementType.isObject())
+					return cm2;
+				return new ClassMeta<T>(cm2.innerClass, this).setElementType(elementType);
+			}
+
+			return cm2;
+		}
+
+		return cm;
+	}
+
+	private ClassMeta<?> resolveType(Type...t) {
+		for (Type tt : t) {
+			if (tt != null) {
+				ClassMeta<?> cm = getClassMeta(tt);
+				if (tt != cmObject)
+					return cm;
+			}
+		}
+		return cmObject;
+	}
+
+	/**
+	 * Converts class name strings to ClassMeta objects.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <ul>
+	 * 	<li>{@code java.lang.String}
+	 * 	<li>{@code com.ibm.sample.MyBean[]}
+	 * 	<li>{@code java.util.HashMap<java.lang.String,java.lang.Integer>}
+	 * 	<li>{@code [Ljava.lang.String;} (i.e. the value of <code>String[].<jk>class</jk>.getName()</code>
+	 * </ul>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param s The class name.
+	 * @return The ClassMeta corresponding to the class name string.
+	 */
+	public ClassMeta<?> getClassMetaFromString(String s) {
+		int d = 0;
+		if (s == null || s.isEmpty())
+			return null;
+
+		// Check for Class.getName() on array class types.
+		if (s.charAt(0) == '[') {
+			try {
+				return getClassMeta(findClass(s));
+			} catch (ClassNotFoundException e) {
+				throw new RuntimeException(e);
+			}
+		}
+
+		int i1 = 0;
+		int i2 = 0;
+		int dim = 0;
+		List<ClassMeta<?>> p = null;
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (c == '<') {
+				if (d == 0) {
+					i1 = i;
+					i2 = i+1;
+					p = new LinkedList<ClassMeta<?>>();
+				}
+				d++;
+			} else if (c == '>') {
+				d--;
+				if (d == 0 && p != null)
+					p.add(getClassMetaFromString(s.substring(i2, i)));
+			} else if (c == ',' && d == 1) {
+				if (p != null)
+					p.add(getClassMetaFromString(s.substring(i2, i)));
+				i2 = i+1;
+			}
+			if (c == '[') {
+				if (i1 == 0)
+					i1 = i;
+				dim++;
+			}
+		}
+		if (i1 == 0)
+			i1 = s.length();
+		try {
+			String name = s.substring(0, i1).trim();
+			char x = name.charAt(0);
+			Class<?> c = null;
+			if (x >= 'b' && x <= 's') {
+				if (x == 'b' && name.equals("boolean"))
+					c = boolean.class;
+				else if (x == 'b' && name.equals("byte"))
+					c = byte.class;
+				else if (x == 'c' && name.equals("char"))
+					c = char.class;
+				else if (x == 'd' && name.equals("double"))
+					c = double.class;
+				else if (x == 'i' && name.equals("int"))
+					c = int.class;
+				else if (x == 'l' && name.equals("long"))
+					c = long.class;
+				else if (x == 's' && name.equals("short"))
+					c = short.class;
+				else
+					c = findClass(name);
+			} else {
+				c = findClass(name);
+			}
+
+			ClassMeta<?> cm = getClassMeta(c);
+
+			if (p != null) {
+				if (cm.isMap())
+					cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1));
+				if (cm.isCollection())
+					cm = new ClassMeta(c, this).setElementType(p.get(0));
+			}
+
+			while (dim > 0) {
+				cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this);
+				dim--;
+			}
+
+			return cm;
+		} catch (ClassNotFoundException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private Class<?> findClass(String name) throws ClassNotFoundException {
+		return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader);
+	}
+
+	/**
+	 * Returns the {@link PojoFilter} associated with the specified class, or <jk>null</jk> if there is no
+	 * pojo filter associated with the class.
+	 *
+	 * @param <T> The class associated with the filter.
+	 * @param c The class associated with the filter.
+	 * @return The filter associated with the class, or null if there is no association.
+	 */
+	protected <T> PojoFilter findPojoFilter(Class<T> c) {
+		// Note:  On first
+		if (c != null)
+			for (PojoFilter f : pojoFilters)
+				if (isParentClass(f.forClass(), c))
+					return f;
+		return null;
+	}
+
+	/**
+	 * Checks whether a class has a {@link PojoFilter} associated with it in this bean context.
+	 * @param c The class to check.
+	 * @return <jk>true</jk> if the specified class or one of its subclasses has a {@link PojoFilter} associated with it.
+	 */
+	protected boolean hasChildPojoFilters(Class<?> c) {
+		if (c != null)
+			for (PojoFilter f : pojoFilters)
+				if (isParentClass(c, f.forClass()))
+					return true;
+		return false;
+	}
+
+	/**
+	 * Returns the {@link BeanFilter} associated with the specified class, or <jk>null</jk> if there is no
+	 * bean filter associated with the class.
+	 *
+	 * @param <T> The class associated with the filter.
+	 * @param c The class associated with the filter.
+	 * @return The filter associated with the class, or null if there is no association.
+	 */
+	protected <T> BeanFilter findBeanFilter(Class<T> c) {
+		if (c != null)
+			for (BeanFilter f : beanFilters)
+				if (isParentClass(f.forClass(), c))
+					return f;
+		return null;
+	}
+
+	/**
+	 * Gets the no-arg constructor for the specified class.
+	 *
+	 * @param <T> The class to check.
+	 * @param c The class to check.
+	 * @param v The minimum visibility for the constructor.
+	 * @return The no arg constructor, or <jk>null</jk> if the class has no no-arg constructor.
+	 */
+	protected <T> Constructor<? extends T> getImplClassConstructor(Class<T> c, Visibility v) {
+		if (implClasses.isEmpty())
+			return null;
+		Class cc = c;
+		while (cc != null) {
+			Class implClass = implClasses.get(cc);
+			if (implClass != null)
+				return ClassMeta.findNoArgConstructor(implClass, v);
+			for (Class ic : cc.getInterfaces()) {
+				implClass = implClasses.get(ic);
+				if (implClass != null)
+					return ClassMeta.findNoArgConstructor(implClass, v);
+			}
+			cc = cc.getSuperclass();
+		}
+		return null;
+	}
+
+	/**
+	 * Converts the specified value to the specified class type.
+	 * <p>
+	 * 	See {@link #convertToType(Object, ClassMeta)} for the list of valid conversions.
+	 *
+	 * @param <T> The class type to convert the value to.
+	 * @param value The value to convert.
+	 * @param type The class type to convert the value to.
+	 * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.
+	 * @return The converted value.
+	 */
+	public <T> T convertToType(Object value, Class<T> type) throws InvalidDataConversionException {
+		// Shortcut for most common case.
+		if (value != null && value.getClass() == type)
+			return (T)value;
+		return convertToType(null, value, getClassMeta(type));
+	}
+
+	/**
+	 * Same as {@link #convertToType(Object, Class)}, except used for instantiating inner member classes that must
+	 * 	be instantiated within another class instance.
+	 *
+	 * @param <T> The class type to convert the value to.
+	 * @param outer If class is a member class, this is the instance of the containing class.
+	 * 	Should be <jk>null</jk> if not a member class.
+	 * @param value The value to convert.
+	 * @param type The class type to convert the value to.
+	 * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.
+	 * @return The converted value.
+	 */
+	public <T> T convertToType(Object outer, Object value, Class<T> type) throws InvalidDataConversionException {
+		return convertToType(outer, value, getClassMeta(type));
+	}
+
+	/**
+	 * Returns a reusable {@link ClassMeta} representation for the class <code>Object</code>.
+	 * <p>
+	 * This <code>ClassMeta</code> is often used to represent "any object type" when an object type
+	 * 	is not known.
+	 * <p>
+	 * This method is identical to calling <code>getClassMeta(Object.<jk>class</jk>)</code> but uses
+	 * 	a cached copy to avoid a hashmap lookup.
+	 *
+	 * @return The {@link ClassMeta} object associated with the <code>Object</code> class.
+	 */
+	public ClassMeta<Object> object() {
+		return cmObject;
+	}
+
+	/**
+	 * Returns a reusable {@link ClassMeta} representation for the class <code>String</code>.
+	 * <p>
+	 * This <code>ClassMeta</code> is often used to represent key types in maps.
+	 * <p>
+	 * This method is identical to calling <code>getClassMeta(String.<jk>class</jk>)</code> but uses
+	 * 	a cached copy to avoid a hashmap lookup.
+	 *
+	 * @return The {@link ClassMeta} object associated with the <code>String</code> class.
+	 */
+	public ClassMeta<String> string() {
+		return cmString;
+	}
+
+	/**
+	 * Casts the specified value into the specified type.
+	 * <p>
+	 * 	If the value isn't an instance of the specified type, then converts
+	 * 	the value if possible.<br>
+	 * <p>
+	 * 	The following conversions are valid:
+	 * 	<table class='styled'>
+	 * 		<tr><th>Convert to type</th><th>Valid input value types</th><th>Notes</th></tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				A class that is the normal type of a registered {@link PojoFilter}.
+	 * 			</td>
+	 * 			<td>
+	 * 				A value whose class matches the filtered type of that registered {@link PojoFilter}.
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				A class that is the filtered type of a registered {@link PojoFilter}.
+	 * 			</td>
+	 * 			<td>
+	 * 				A value whose class matches the normal type of that registered {@link PojoFilter}.
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code Number} (e.g. {@code Integer}, {@code Short}, {@code Float},...)<br>
+	 * 				<code>Number.<jsf>TYPE</jsf></code> (e.g. <code>Integer.<jsf>TYPE</jsf></code>, <code>Short.<jsf>TYPE</jsf></code>, <code>Float.<jsf>TYPE</jsf></code>,...)
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code Number}, {@code String}, <jk>null</jk>
+	 * 			</td>
+	 * 			<td>
+	 * 				For primitive {@code TYPES}, <jk>null</jk> returns the JVM default value for that type.
+	 * 			</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code Map} (e.g. {@code Map}, {@code HashMap}, {@code TreeMap}, {@code ObjectMap})
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code Map}
+	 * 			</td>
+	 * 			<td>
+	 * 				If {@code Map} is not constructible, a {@code ObjectMap} is created.
+	 * 			</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 			{@code Collection} (e.g. {@code List}, {@code LinkedList}, {@code HashSet}, {@code ObjectList})
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code Collection<Object>}<br>
+	 * 				{@code Object[]}
+	 * 			</td>
+	 * 			<td>
+	 * 				If {@code Collection} is not constructible, a {@code ObjectList} is created.
+	 * 			</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code X[]} (array of any type X)<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code List<X>}<br>
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code X[][]} (multi-dimensional arrays)<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code List<List<X>>}<br>
+	 * 				{@code List<X[]>}<br>
+	 * 				{@code List[]<X>}<br>
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code Enum}<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code String}<br>
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				Bean<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				{@code Map}<br>
+	 * 			</td>
+	 * 			<td>&nbsp;</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				{@code String}<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				Anything<br>
+	 * 			</td>
+	 * 			<td>
+	 * 				Arrays are converted to JSON arrays<br>
+	 * 			</td>
+	 * 		</tr>
+	 * 		<tr>
+	 * 			<td>
+	 * 				Anything with one of the following methods:<br>
+	 * 				<code><jk>public static</jk> T fromString(String)</code><br>
+	 * 				<code><jk>public static</jk> T valueOf(String)</code><br>
+	 * 				<code><jk>public<jk> T(String)</code><br>
+	 * 			</td>
+	 * 			<td>
+	 * 				<code>String</code><br>
+	 * 			</td>
+	 * 			<td>
+	 * 				<br>
+	 * 			</td>
+	 * 		</tr>
+	 * 	</table>
+	 *
+	 * @param <T> The class type to convert the value to.
+	 * @param value The value to be converted.
+	 * @param type The target object type.
+	 * @return The converted type.
+	 * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.
+	 */
+	public <T> T convertToType(Object value, ClassMeta<T> type) throws InvalidDataConversionException {
+		return convertToType(null, value, type);
+	}
+
+	/**
+	 * Same as {@link #convertToType(Object, ClassMeta)}, except used for instantiating inner member classes that must
+	 * 	be instantiated within another class instance.
+	 *
+	 * @param <T> The class type to convert the value to.
+	 * @param outer If class is a member class, this is the instance of the containing class.
+	 * 	Should be <jk>null</jk> if not a member class.
+	 * @param value The value to convert.
+	 * @param type The class type to convert the value to.
+	 * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.
+	 * @return The converted value.
+	 */
+	public <T> T convertToType(Object outer, Object value, ClassMeta<T> type) throws InvalidDataConversionException {
+		if (type == null)
+			type = (ClassMeta<T>)object();
+
+		try {
+			// Handle the case of a null value.
+			if (value == null) {
+
+				// If it's a primitive, then use the converters to get the default value for the primitive type.
+				if (type.isPrimitive())
+					return type.getPrimitiveDefault();
+
+				// Otherwise, just return null.
+				return null;
+			}
+
+			Class<T> tc = type.getInnerClass();
+
+			// If no conversion needed, then just return the value.
+			// Don't include maps or collections, because child elements may need conversion.
+			if (tc.isInstance(value))
+				if (! ((type.isMap() && type.getValueType().isNotObject()) || (type.isCollection() && type.getElementType().isNotObject())))
+					return (T)value;
+
+			if (type.getPojoFilter() != null) {
+				PojoFilter f = type.getPojoFilter();
+				Class<?> nc = f.getNormalClass(), fc = f.getFilteredClass();
+				if (isParentClass(nc, tc) && isParentClass(fc, value.getClass()))
+					return (T)f.unfilter(value, type);
+			}
+
+			ClassMeta<?> vt = getClassMetaForObject(value);
+			if (vt.getPojoFilter() != null) {
+				PojoFilter f = vt.getPojoFilter();
+				Class<?> nc = f.getNormalClass(), fc = f.getFilteredClass();
+				if (isParentClass(nc, vt.getInnerClass()) && isParentClass(fc, tc))
+					return (T)f.filter(value);
+			}
+
+			if (type.isPrimitive()) {
+				if (value.toString().isEmpty())
+					return type.getPrimitiveDefault();
+
+				if (type.isNumber()) {
+					if (value instanceof Number) {
+						Number n = (Number)value;
+						if (tc == Integer.TYPE)
+							return (T)Integer.valueOf(n.intValue());
+						if (tc == Short.TYPE)
+							return (T)Short.valueOf(n.shortValue());
+						if (tc == Long.TYPE)
+							return (T)Long.valueOf(n.longValue());
+						if (tc == Float.TYPE)
+							return (T)Float.valueOf(n.floatValue());
+						if (tc == Double.TYPE)
+							return (T)Double.valueOf(n.doubleValue());
+						if (tc == Byte.TYPE)
+							return (T)Byte.valueOf(n.byteValue());
+					} else {
+						String n = null;
+						if (value instanceof Boolean)
+							n = ((Boolean)value).booleanValue() ? "1" : "0";
+						else
+							n = value.toString();
+						if (tc == Integer.TYPE)
+							return (T)Integer.valueOf(n);
+						if (tc == Short.TYPE)
+							return (T)Short.valueOf(n);
+						if (tc == Long.TYPE)
+							return (T)Long.valueOf(n);
+						if (tc == Float.TYPE)
+							return (T)new Float(n);
+						if (tc == Double.TYPE)
+							return (T)new Double(n);
+						if (tc == Byte.TYPE)
+							return (T)Byte.valueOf(n);
+					}
+				} else if (type.isChar()) {
+					String s = value.toString();
+					return (T)Character.valueOf(s.length() == 0 ? 0 : s.charAt(0));
+				} else if (type.isBoolean()) {
+					if (value instanceof Number) {
+						int i = ((Number)value).intValue();
+						return (T)(i == 0 ? Boolean.FALSE : Boolean.TRUE);
+					}
+					return (T)Boolean.valueOf(value.toString());
+				}
+			}
+
+			if (type.isNumber()) {
+				if (value instanceof Number) {
+				Number n = (Number)value;
+				if (tc == Integer.class)
+					return (T)Integer.valueOf(n.intValue());
+				if (tc == Short.class)
+					return (T)Short.valueOf(n.shortValue());
+				if (tc == Long.class)
+					return (T)Long.valueOf(n.longValue());
+				if (tc == Float.class)
+					return (T)Float.valueOf(n.floatValue());
+				if (tc == Double.class)
+					return (T)Double.valueOf(n.doubleValue());
+				if (tc == Byte.class)
+					return (T)Byte.valueOf(n.byteValue());
+				} else {
+					if (value.toString().isEmpty())
+						return null;
+					String n = null;
+					if (value instanceof Boolean)
+						n = ((Boolean)value).booleanValue() ? "1" : "0";
+					else
+						n = value.toString();
+					if (tc == Integer.class)
+						return (T)Integer.valueOf(n);
+					if (tc == Short.class)
+						return (T)Short.valueOf(n);
+					if (tc == Long.class)
+						return (T)Long.valueOf(n);
+					if (tc == Float.class)
+						return (T)new Float(n);
+					if (tc == Double.class)
+						return (T)new Double(n);
+					if (tc == Byte.class)
+						return (T)Byte.valueOf(n);
+				}
+			}
+
+			if (type.isChar()) {
+				String s = value.toString();
+				return (T)Character.valueOf(s.length() == 0 ? 0 : s.charAt(0));
+			}
+
+			// Handle setting of array properties
+			if (type.isArray()) {
+				if (value instanceof List)
+					return (T)toArray(type, (List)value);
+				else if (value.getClass().isArray())
+					return (T)toArray(type, Arrays.asList((Object[])value));
+				else if (StringUtils.startsWith(value.toString(), '['))
+					return (T)toArray(type, new ObjectList(value.toString()).setBeanContext(this));
+			}
+
+			// Target type is some sort of Map that needs to be converted.
+			if (type.isMap()) {
+				try {
+					if (value instanceof Map) {
+						Map m = type.canCreateNewInstance(outer) ? (Map)type.newInstance(outer) : new ObjectMap(this);
+						ClassMeta keyType = type.getKeyType(), valueType = type.getValueType();
+						for (Map.Entry e : (Set<Map.Entry>)((Map)value).entrySet()) {
+							Object k = e.getKey();
+							if (keyType.isNotObject()) {
+								if (keyType.isString())
+									k = k.toString();
+								else
+									k = convertToType(m, k, keyType);
+							}
+							Object v = e.getValue();
+							if (valueType.isNotObject())
+								v = convertToType(m, v, valueType);
+							m.put(k, v);
+						}
+						return (T)m;
+					} else if (!type.canCreateNewInstanceFromString(outer)) {
+						ObjectMap m = new ObjectMap(value.toString(), defaultParser);
+						return convertToType(outer, m, type);
+					}
+				} catch (Exception e) {
+					throw new InvalidDataConversionException(value.getClass(), tc, e);
+				}
+			}
+
+			// Target type is some sort of Collection
+			if (type.isCollection()) {
+				try {
+					Collection l = type.canCreateNewInstance(outer) ? (Collection)type.newInstance(outer) : new ObjectList(this);
+					ClassMeta elementType = type.getElementType();
+
+					if (value.getClass().isArray())
+						for (Object o : (Object[])value)
+							l.add(elementType.isObject() ? o : convertToType(l, o, elementType));
+					else if (value instanceof Collection)
+						for (Object o : (Collection)value)
+							l.add(elementType.isObject() ? o : convertToType(l, o, elementType));
+					else if (value instanceof Map)
+						l.add(elementType.isObject() ? value : convertToType(l, value, elementType));
+					else if (! value.toString().isEmpty())
+						throw new InvalidDataConversionException(value.getClass(), tc, null);
+					return (T)l;
+				} catch (InvalidDataConversionException e) {
+					throw e;
+				} catch (Exception e) {
+					throw new InvalidDataConversionException(value.getClass(), tc, e);
+				}
+			}
+
+			if (type.isString()) {
+				Class<?> c = value.getClass();
+				if (c.isArray()) {
+					if (c.getComponentType().isPrimitive()) {
+						ObjectList l = new ObjectList(this);
+						int size = Array.getLength(value);
+						for (int i = 0; i < size; i++)
+							l.add(Array.get(value, i));
+						return (T)l.toString();
+					}
+					return (T)new ObjectList((Object[])value).setBeanContext(this).toString();
+				}
+				return (T)value.toString();
+			}
+
+			if (type.isCharSequence()) {
+				Class<?> c = value.getClass();
+				if (c.isArray()) {
+					if (c.getComponentType().isPrimitive()) {
+						ObjectList l = new ObjectList(this);
+						int size = Array.getLength(value);
+						for (int i = 0; i < size; i++)
+							l.add(Array.get(value, i));
+						value = l;
+					}
+					value = new ObjectList((Object[])value).setBeanContext(this);
+				}
+
+				return type.newInstanceFromString(outer, value.toString());
+			}
+
+			if (type.isBoolean()) {
+				if (value instanceof Number)
+					return (T)(Boolean.valueOf(((Number)value).intValue() != 0));
+				return (T)Boolean.valueOf(value.toString());
+			}
+
+			// It's a bean being initialized with a Map
+			if (type.isBean() && value instanceof Map)
+				return newBeanMap(tc).load((Map<?,?>) value).getBean();
+
+			if (type.canCreateNewInstanceFromObjectMap(outer) && value instanceof ObjectMap)
+				return type.newInstanceFromObjectMap(outer, (ObjectMap)value);
+
+			if (type.canCreateNewInstanceFromString(outer))
+				return type.newInstanceFromString(outer, value.toString());
+
+			if (type.isBean())
+				return newBeanMap(type.getInnerClass()).load(value.toString()).getBean();
+
+		} catch (Exception e) {
+			throw new InvalidDataConversionException(value, type.getInnerClass(), e);
+		}
+
+		throw new InvalidDataConversionException(value, type.getInnerClass(), null);
+	}
+
+	/**
+	 * Converts the contents of the specified list into an array.
+	 * <p>
+	 * 	Works on both object and primitive arrays.
+	 * <p>
+	 * 	In the case of multi-dimensional arrays, the incoming list must
+	 * 	contain elements of type n-1 dimension.  i.e. if {@code type} is <code><jk>int</jk>[][]</code>
+	 * 	then {@code list} must have entries of type <code><jk>int</jk>[]</code>.
+	 *
+	 * @param type The type to convert to.  Must be an array type.
+	 * @param list The contents to populate the array with.
+	 * @return A new object or primitive array.
+	 */
+	public Object toArray(ClassMeta<?> type, Collection<?> list) {
+		if (list == null)
+			return null;
+		ClassMeta<?> componentType = type.getElementType();
+		Object array = Array.newInstance(componentType.getInnerClass(), list.size());
+		int i = 0;
+		for (Object o : list) {
+			if (! type.getInnerClass().isInstance(o)) {
+				if (componentType.isArray() && o instanceof Collection)
+					o = toArray(componentType, (Collection<?>)o);
+				else if (o == null && componentType.isPrimitive())
+					o = componentType.getPrimitiveDefault();
+				else
+					o = convertToType(null, o, componentType);
+			}
+			try {
+				Array.set(array, i++, o);
+			} catch (IllegalArgumentException e) {
+				e.printStackTrace();
+				throw e;
+			}
+		}
+		return array;
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return hashCode;
+	}
+
+	private int hash(int h1, int h2) {
+		return Integer.rotateLeft(h1, 1) + h2;
+	}
+
+	@Override /* Object */
+	public boolean equals(Object o) {
+		if (o instanceof BeanContext) {
+			BeanContext bcs = (BeanContext)o;
+			if (hashCode != bcs.hashCode
+					|| b != bcs.b
+					|| beanFilters.length != bcs.beanFilters.length
+					|| pojoFilters.length != bcs.pojoFilters.length
+					|| notBeanClasses.length != bcs.notBeanClasses.length
+					|| implKeyClasses.length != bcs.implKeyClasses.length
+					|| implValueClasses.length != bcs.implValueClasses.length
+					|| uriKeys.length != bcs.uriKeys.length
+					|| uriVals.length != bcs.uriVals.length
+					|| beanConstructorVisibility != bcs.beanConstructorVisibility
+					|| beanClassVisibility != bcs.beanClassVisibility
+					|| beanMethodVisibility != bcs.beanMethodVisibility
+					|| beanFieldVisibility != bcs.beanFieldVisibility)
+				return false;
+			for (int i = 0; i < beanFilters.length; i++)
+				if (! beanFilters[i].isSameAs(bcs.beanFilters[i]))
+					return false;
+			for (int i = 0; i < pojoFilters.length; i++)
+				if (! pojoFilters[i].isSameAs(bcs.pojoFilters[i]))
+					return false;
+			for (int i = 0; i < notBeanClasses.length; i++)
+				if (! notBeanClasses[i].equals(bcs.notBeanClasses[i]))
+					return false;
+			for (int i = 0; i < notBeanPackages.length; i++)
+				if (! notBeanPackages[i].equals(bcs.notBeanPackages[i]))
+					return false;
+			for (int i = 0; i < implKeyClasses.length; i++)
+				if (! implKeyClasses[i].equals(bcs.implKeyClasses[i]))
+					return false;
+			for (int i = 0; i < implValueClasses.length; i++)
+				if (! implValueClasses[i].equals(bcs.implValueClasses[i]))
+					return false;
+			for (int i = 0; i < uriKeys.length; i++)
+				if (! uriKeys[i].equals(bcs.uriKeys[i]))
+					return false;
+			for (int i = 0; i < uriVals.length; i++)
+				if (! uriVals[i].equals(bcs.uriVals[i]))
+					return false;
+			return true;
+		}
+		return false;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		ObjectMap m = new ObjectMap()
+			.append("id", System.identityHashCode(this))
+			.append("beansRequireDefaultConstructor", beansRequireDefaultConstructor)
+			.append("beansRequireSerializable", beansRequireSerializable)
+			.append("beansRequireSettersForGetters", beansRequireSettersForGetters)
+			.append("beansRequireSomeProperties", beansRequireSomeProperties)
+			.append("beanMapPutReturnsOldValue", beanMapPutReturnsOldValue)
+			.append("useInterfaceProxies", useInterfaceProxies)
+			.append("ignoreUnknownBeanProperties", ignoreUnknownBeanProperties)
+			.append("ignoreUnknownNullBeanProperties", ignoreUnknownNullBeanProperties)
+			.append("ignorePropertiesWithoutSetters", ignorePropertiesWithoutSetters)
+			.append("ignoreInvocationExceptionsOnGetters", ignoreInvocationExceptionsOnGetters)
+			.append("ignoreInvocationExceptionsOnSetters", ignoreInvocationExceptionsOnSetters)
+			.append("useJavaBeanIntrospector", useJavaBeanIntrospector)
+			.append("beanFilters", beanFilters)
+			.append("pojoFilters", pojoFilters)
+			.append("notBeanPackages", notBeanPackages)
+			.append("notBeanClasses", notBeanClasses)
+			.append("implClasses", implClasses)
+			.append("uriVars", uriVars);
+		try {
+			return m.toString(JsonSerializer.DEFAULT_LAX_READABLE);
+		} catch (SerializeException e) {
+			return e.getLocalizedMessage();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class
new file mode 100755
index 0000000..261d824
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class differ


[30/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java
new file mode 100755
index 0000000..ea9fc3c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java
@@ -0,0 +1,803 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.Visibility.*;
+import static com.ibm.juno.core.utils.ClassUtils.*;
+import static com.ibm.juno.core.utils.CollectionUtils.*;
+import static com.ibm.juno.core.utils.ReflectionUtils.*;
+
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+import java.net.*;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.annotation.URI;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.jena.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Contains metadata about a bean property.
+ * <p>
+ * 	Contains information such as type of property (e.g. field/getter/setter), class type of property value,
+ * 	and whether any filters are associated with this property.
+ * <p>
+ * 	Developers will typically not need access to this class.  The information provided by it is already
+ * 	exposed through several methods on the {@link BeanMap} API.
+ *
+ * @param <T> The class type of the bean that this metadata applies to.
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class BeanPropertyMeta<T> {
+
+	private Field field;
+	private Method getter, setter;
+	private boolean isConstructorArg, isBeanUri, isUri;
+
+	private final BeanMeta<T> beanMeta;
+
+	private String name;
+	private ClassMeta<?>
+		rawTypeMeta,                           // The real class type of the bean property.
+		typeMeta;                              // The filtered class type of the bean property.
+	private String[] properties;
+	private PojoFilter filter;      // PojoFilter defined only via @BeanProperty annotation.
+
+	/** HTML related metadata on this bean property. */
+	protected HtmlBeanPropertyMeta<T> htmlMeta;
+
+	/** XML related metadata on this bean property. */
+	protected XmlBeanPropertyMeta<T> xmlMeta;
+
+	/** RDF related metadata on this bean property. */
+	protected RdfBeanPropertyMeta<T> rdfMeta;  //
+
+	BeanPropertyMeta(BeanMeta<T> beanMeta, String name) {
+		this.beanMeta = beanMeta;
+		this.name = name;
+	}
+
+	BeanPropertyMeta(BeanMeta<T> beanMeta, String name, ClassMeta<?> rawTypeMeta) {
+		this(beanMeta, name);
+		this.rawTypeMeta = rawTypeMeta;
+	}
+
+	BeanPropertyMeta(BeanMeta<T> beanMeta, String name, Method getter, Method setter) {
+		this(beanMeta, name);
+		setGetter(getter);
+		setSetter(setter);
+	}
+
+	/**
+	 * Returns the name of this bean property.
+	 *
+	 * @return The name of the bean property.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Returns the bean meta that this property belongs to.
+	 *
+	 * @return The bean meta that this property belongs to.
+	 */
+	@BeanIgnore
+	public BeanMeta<T> getBeanMeta() {
+		return beanMeta;
+	}
+
+	/**
+	 * Returns the getter method for this property.
+	 *
+	 * @return The getter method for this bean property, or <jk>null</jk> if there is no getter method.
+	 */
+	public Method getGetter() {
+		return getter;
+	}
+
+	/**
+	 * Returns the setter method for this property.
+	 *
+	 * @return The setter method for this bean property, or <jk>null</jk> if there is no setter method.
+	 */
+	public Method getSetter() {
+		return setter;
+	}
+
+	/**
+	 * Returns the field for this property.
+	 *
+	 * @return The field for this bean property, or <jk>null</jk> if there is no field associated with this bean property.
+	 */
+	public Field getField() {
+		return field;
+	}
+
+	/**
+	 * Returns the {@link ClassMeta} of the class of this property.
+	 * <p>
+	 * If this property or the property type class has a {@link PojoFilter} associated with it, this
+	 * 	method returns the filtered class meta.
+	 * This matches the class type that is used by the {@link #get(BeanMap)} and {@link #set(BeanMap, Object)} methods.
+	 *
+	 * @return The {@link ClassMeta} of the class of this property.
+	 */
+	public ClassMeta<?> getClassMeta() {
+		if (typeMeta == null)
+			typeMeta = (filter != null ? filter.getFilteredClassMeta() : rawTypeMeta.getFilteredClassMeta());
+		return typeMeta;
+	}
+
+	/**
+	 * Sets the getter method for this property.
+	 *
+	 * @param getter The getter method to associate with this property.
+	 * @return This object (for method chaining).
+	 */
+	BeanPropertyMeta<T> setGetter(Method getter) {
+		setAccessible(getter);
+		this.getter = getter;
+		return this;
+	}
+
+	/**
+	 * Sets the setter method for this property.
+	 *
+	 * @param setter The setter method to associate with this property.
+	 * @return This object (for method chaining).
+	 */
+	BeanPropertyMeta<T> setSetter(Method setter) {
+		setAccessible(setter);
+		this.setter = setter;
+		return this;
+	}
+
+	/**
+	 * Sets the field for this property.
+	 *
+	 * @param field The field to associate with this property.
+	 * @return This object (for method chaining).
+	 */
+	BeanPropertyMeta<T> setField(Field field) {
+		setAccessible(field);
+		this.field = field;
+		return this;
+	}
+
+	/**
+	 * Marks this property as only settable through a constructor arg.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	BeanPropertyMeta<T> setAsConstructorArg() {
+		this.isConstructorArg = true;
+		return this;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this bean property is marked with {@link BeanProperty#beanUri()} as <jk>true</jk>.
+	 *
+	 * @return <jk>true</jk> if this bean property is marked with {@link BeanProperty#beanUri()} as <jk>true</jk>.
+	 */
+	public boolean isBeanUri() {
+		return isBeanUri;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this bean property is a URI.
+	 * <p>
+	 * A bean property can be considered a URI if any of the following are true:
+	 * <ul>
+	 * 	<li>Property class type is {@link URL} or {@link URI}.
+	 * 	<li>Property class type is annotated with {@link com.ibm.juno.core.annotation.URI}.
+	 * 	<li>Property getter, setter, or field is annotated with {@link com.ibm.juno.core.annotation.URI}.
+	 * </ul>
+	 *
+	 * @return <jk>true</jk> if this bean property is a URI.
+	 */
+	public boolean isUri() {
+		return isUri;
+	}
+
+	/**
+	 * Returns the override list of properties defined through a {@link BeanProperty#properties()} annotation
+	 *  on this property.
+	 *
+	 * @return The list of override properties, or <jk>null</jk> if annotation not specified.
+	 */
+	public String[] getProperties() {
+		return properties;
+	}
+
+	/**
+	 * Returns the HTML-related metadata on this bean property.
+	 *
+	 * @return The HTML-related metadata on this bean property.  Never <jk>null</jk>/.
+	 */
+	public HtmlBeanPropertyMeta<T> getHtmlMeta() {
+		return htmlMeta;
+	}
+
+	/**
+	 * Returns the XML-related metadata on this bean property.
+	 *
+	 * @return The XML-related metadata on this bean property.  Never <jk>null</jk>/.
+	 */
+	public XmlBeanPropertyMeta<T> getXmlMeta() {
+		return xmlMeta;
+	}
+
+	/**
+	 * Returns the RDF-related metadata on this bean property.
+	 *
+	 * @return The RDF-related metadata on this bean property.  Never <jk>null</jk>/.
+	 */
+	public RdfBeanPropertyMeta<T> getRdfMeta() {
+		return rdfMeta;
+	}
+
+	boolean validate() throws Exception {
+
+		BeanContext f = beanMeta.ctx;
+		Map<Class<?>,Class<?>[]> typeVarImpls = beanMeta.typeVarImpls;
+
+		if (field == null && getter == null)
+			return false;
+
+		if (field == null && setter == null && f.beansRequireSettersForGetters && ! isConstructorArg)
+			return false;
+
+		if (field != null) {
+			BeanProperty p = field.getAnnotation(BeanProperty.class);
+			rawTypeMeta = f.getClassMeta(p, field.getGenericType(), typeVarImpls);
+			isUri |= (rawTypeMeta.isUri() || field.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class));
+			if (p != null) {
+				filter = getPropertyPojoFilter(p);
+				if (p.properties().length != 0)
+					properties = p.properties();
+				isBeanUri |= p.beanUri();
+			}
+		}
+
+		if (getter != null) {
+			BeanProperty p = getter.getAnnotation(BeanProperty.class);
+			if (rawTypeMeta == null)
+				rawTypeMeta = f.getClassMeta(p, getter.getGenericReturnType(), typeVarImpls);
+			isUri |= (rawTypeMeta.isUri() || getter.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class));
+			if (p != null) {
+				if (filter == null)
+					filter = getPropertyPojoFilter(p);
+				if (properties != null && p.properties().length != 0)
+					properties = p.properties();
+				isBeanUri |= p.beanUri();
+			}
+		}
+
+		if (setter != null) {
+			BeanProperty p = setter.getAnnotation(BeanProperty.class);
+			if (rawTypeMeta == null)
+				rawTypeMeta = f.getClassMeta(p, setter.getGenericParameterTypes()[0], typeVarImpls);
+			isUri |= (rawTypeMeta.isUri() || setter.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class));
+			if (p != null) {
+			if (filter == null)
+				filter = getPropertyPojoFilter(p);
+				if (properties != null && p.properties().length != 0)
+					properties = p.properties();
+				isBeanUri |= p.beanUri();
+			}
+		}
+
+		if (rawTypeMeta == null)
+			return false;
+
+		// Do some annotation validation.
+		Class<?> c = rawTypeMeta.getInnerClass();
+		if (getter != null && ! isParentClass(getter.getReturnType(), c))
+			return false;
+		if (setter != null && ! isParentClass(setter.getParameterTypes()[0], c))
+			return false;
+		if (field != null && ! isParentClass(field.getType(), c))
+			return false;
+
+		htmlMeta = new HtmlBeanPropertyMeta(this);
+		xmlMeta = new XmlBeanPropertyMeta(this);
+		rdfMeta = new RdfBeanPropertyMeta(this);
+
+		return true;
+	}
+
+	private PojoFilter getPropertyPojoFilter(BeanProperty p) throws Exception {
+		Class<? extends PojoFilter> c = p.filter();
+		if (c == PojoFilter.NULL.class)
+			return null;
+		try {
+			PojoFilter f = c.newInstance();
+			f.setBeanContext(this.beanMeta.ctx);
+			return f;
+		} catch (Exception e) {
+			throw new BeanRuntimeException(this.beanMeta.c, "Could not instantiate PojoFilter ''{0}'' for bean property ''{1}''", c.getName(), this.name).initCause(e);
+		}
+	}
+
+	/**
+	 * Equivalent to calling {@link BeanMap#get(Object)}, but is faster since it avoids looking up the property meta.
+	 *
+	 * @param m The bean map to get the filtered value from.
+	 * @return The property value.
+	 */
+	public Object get(BeanMap<T> m) {
+		try {
+			// Read-only beans have their properties stored in a cache until getBean() is called.
+			Object bean = m.bean;
+			if (bean == null)
+				return m.propertyCache.get(name);
+
+			Object o = null;
+
+			if (getter == null && field == null)
+				throw new BeanRuntimeException(beanMeta.c, "Getter or public field not defined on property ''{0}''", name);
+
+			if (getter != null)
+				o = getter.invoke(bean, (Object[])null);
+
+			else if (field != null)
+				o = field.get(bean);
+
+			o = filter(o);
+			if (o == null)
+				return null;
+			if (properties != null) {
+				if (rawTypeMeta.isArray()) {
+					Object[] a = (Object[])o;
+					List l = new ArrayList(a.length);
+					ClassMeta childType = rawTypeMeta.getElementType();
+					for (Object c : a)
+						l.add(applyChildPropertiesFilter(childType, c));
+					return l;
+				} else if (rawTypeMeta.isCollection()) {
+					Collection c = (Collection)o;
+					List l = new ArrayList(c.size());
+					ClassMeta childType = rawTypeMeta.getElementType();
+					for (Object cc : c)
+						l.add(applyChildPropertiesFilter(childType, cc));
+					return l;
+				} else {
+					return applyChildPropertiesFilter(rawTypeMeta, o);
+				}
+			}
+			return o;
+		} catch (SerializeException e) {
+			throw new BeanRuntimeException(e);
+		} catch (Throwable e) {
+			if (beanMeta.ctx.ignoreInvocationExceptionsOnGetters) {
+				if (rawTypeMeta.isPrimitive())
+					return rawTypeMeta.getPrimitiveDefault();
+				return null;
+			}
+			throw new BeanRuntimeException(beanMeta.c, "Exception occurred while getting property ''{0}''", name).initCause(e);
+		}
+	}
+
+	/**
+	 * Equivalent to calling {@link BeanMap#put(Object, Object)}, but is faster since it avoids
+	 * 	looking up the property meta.
+	 *
+	 * @param m The bean map to set the property value on.
+	 * @param value The value to set.
+	 * @return The previous property value.
+	 * @throws BeanRuntimeException If property could not be set.
+	 */
+	public Object set(BeanMap<T> m, Object value) throws BeanRuntimeException {
+		try {
+			// Comvert to raw form.
+			value = unfilter(value);
+			BeanContext bc = this.beanMeta.ctx;
+
+		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.subTypeIdProperty != 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);
+
+			throw new BeanRuntimeException("Non-existent bean instance on bean.");
+		}
+
+			boolean isMap = rawTypeMeta.isMap();
+			boolean isCollection = rawTypeMeta.isCollection();
+
+		if (field == null && setter == null && ! (isMap || isCollection)) {
+			if ((value == null && bc.ignoreUnknownNullBeanProperties) || bc.ignorePropertiesWithoutSetters)
+				return null;
+			throw new BeanRuntimeException(beanMeta.c, "Setter or public field not defined on property ''{0}''", name);
+		}
+
+		Object bean = m.getBean(true);  // Don't use getBean() because it triggers array creation!
+
+		try {
+
+			Object r = beanMeta.ctx.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null;
+				Class<?> propertyClass = rawTypeMeta.getInnerClass();
+
+			if (value == null && (isMap || isCollection)) {
+				if (setter != null) {
+					setter.invoke(bean, new Object[] { null });
+					return r;
+				} else if (field != null) {
+					field.set(bean, null);
+					return r;
+				}
+				throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' to null because no setter or public field is defined", name);
+			}
+
+			if (isMap) {
+
+				if (! (value instanceof Map)) {
+					if (value instanceof CharSequence)
+						value = new ObjectMap((CharSequence)value).setBeanContext(beanMeta.ctx);
+					else
+						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
+				}
+
+				Map valueMap = (Map)value;
+				Map propMap = (Map)r;
+					ClassMeta<?> valueType = rawTypeMeta.getValueType();
+
+				// If the property type is abstract, then we either need to reuse the existing
+				// map (if it's not null), or try to assign the value directly.
+					if (! rawTypeMeta.canCreateNewInstance()) {
+					if (propMap == null) {
+						if (setter == null && field == null)
+							throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined, and the current value is null", name, propertyClass.getName(), findClassName(value));
+
+						if (propertyClass.isInstance(valueMap)) {
+							if (! valueType.isObject()) {
+								for (Map.Entry e : (Set<Map.Entry>)valueMap.entrySet()) {
+									Object v = e.getValue();
+									if (v != null && ! valueType.getInnerClass().isInstance(v))
+										throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because the value types in the assigned map do not match the specified ''elementClass'' attribute on the property, and the property value is currently null", name, propertyClass.getName(), findClassName(value));
+								}
+							}
+							if (setter != null)
+								setter.invoke(bean, valueMap);
+							else
+								field.set(bean, valueMap);
+							return r;
+						}
+						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{2}'' to object of type ''{2}'' because the assigned map cannot be converted to the specified type because the property type is abstract, and the property value is currently null", name, propertyClass.getName(), findClassName(value));
+					}
+				} else {
+					if (propMap == null) {
+						propMap = (Map)propertyClass.newInstance();
+						if (setter != null)
+							setter.invoke(bean, propMap);
+						else if (field != null)
+							field.set(bean, propMap);
+						else
+							throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined on this property, and the existing property value is null", name, propertyClass.getName(), findClassName(value));
+					} else {
+						propMap.clear();
+					}
+				}
+
+				// Set the values.
+				for (Map.Entry e : (Set<Map.Entry>)valueMap.entrySet()) {
+					Object k = e.getKey();
+					Object v = e.getValue();
+					if (! valueType.isObject())
+						v = beanMeta.ctx.convertToType(v, valueType);
+					propMap.put(k, v);
+				}
+
+			} else if (isCollection) {
+
+				if (! (value instanceof Collection)) {
+					if (value instanceof CharSequence)
+						value = new ObjectList((CharSequence)value).setBeanContext(beanMeta.ctx);
+					else
+						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
+				}
+
+				Collection valueList = (Collection)value;
+				Collection propList = (Collection)r;
+					ClassMeta elementType = rawTypeMeta.getElementType();
+
+				// If the property type is abstract, then we either need to reuse the existing
+				// collection (if it's not null), or try to assign the value directly.
+					if (! rawTypeMeta.canCreateNewInstance()) {
+					if (propList == null) {
+						if (setter == null && field == null)
+							throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined, and the current value is null", name, propertyClass.getName(), findClassName(value));
+
+						if (propertyClass.isInstance(valueList)) {
+							if (! elementType.isObject()) {
+									List l = new ObjectList(valueList);
+									for (ListIterator<Object> i = l.listIterator(); i.hasNext(); ) {
+										Object v = i.next();
+										if (v != null && (! elementType.getInnerClass().isInstance(v))) {
+											i.set(bc.convertToType(v, elementType));
+										}
+									}
+									valueList = l;
+								}
+							if (setter != null)
+								setter.invoke(bean, valueList);
+							else
+								field.set(bean, valueList);
+							return r;
+						}
+						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because the assigned map cannot be converted to the specified type because the property type is abstract, and the property value is currently null", name, propertyClass.getName(), findClassName(value));
+					}
+					propList.clear();
+				} else {
+					if (propList == null) {
+						propList = (Collection)propertyClass.newInstance();
+						if (setter != null)
+							setter.invoke(bean, propList);
+						else if (field != null)
+							field.set(bean, propList);
+						else
+							throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is defined on this property, and the existing property value is null", name, propertyClass.getName(), findClassName(value));
+					} else {
+						propList.clear();
+					}
+				}
+
+				// Set the values.
+				for (Object v : valueList) {
+					if (! elementType.isObject())
+						v = beanMeta.ctx.convertToType(v, elementType);
+					propList.add(v);
+				}
+
+			} else {
+				if (filter != null && value != null && isParentClass(filter.getFilteredClass(), value.getClass())) {
+						value = filter.unfilter(value, rawTypeMeta);
+				} else {
+						value = beanMeta.ctx.convertToType(value, rawTypeMeta);
+					}
+				if (setter != null)
+					setter.invoke(bean, new Object[] { value });
+				else if (field != null)
+					field.set(bean, value);
+			}
+
+			return r;
+
+		} catch (BeanRuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			if (beanMeta.ctx.ignoreInvocationExceptionsOnSetters) {
+					if (rawTypeMeta.isPrimitive())
+						return rawTypeMeta.getPrimitiveDefault();
+				return null;
+			}
+			throw new BeanRuntimeException(beanMeta.c, "Error occurred trying to set property ''{0}''", name).initCause(e);
+		}
+		} catch (ParseException e) {
+			throw new BeanRuntimeException(e);
+		}
+	}
+
+	/**
+	 * Sets an array field on this bean.
+	 * Works on both <code>Object</code> and primitive arrays.
+	 *
+	 * @param bean The bean of the field.
+	 * @param l The collection to use to set the array field.
+	 * @throws IllegalArgumentException Thrown by method invocation.
+	 * @throws IllegalAccessException Thrown by method invocation.
+	 * @throws InvocationTargetException Thrown by method invocation.
+	 */
+	protected void setArray(T bean, List l) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+		Object array = ArrayUtils.toArray(l, this.rawTypeMeta.getElementType().getInnerClass());
+		if (setter != null)
+			setter.invoke(bean, array);
+		else if (field != null)
+			field.set(bean, array);
+		else
+			throw new BeanRuntimeException(beanMeta.c, "Attempt to initialize array property ''{0}'', but no setter or field defined.", name);
+	}
+
+	/**
+	 * Adds a value to a {@link Collection} or array property.
+	 * Note that adding values to an array property is inefficient for large
+	 * arrays since it must copy the array into a larger array on each operation.
+	 *
+	 * @param m The bean of the field being set.
+	 * @param value The value to add to the field.
+	 * @throws BeanRuntimeException If field is not a collection or array.
+	 */
+	public void add(BeanMap<T> m, Object value) throws BeanRuntimeException {
+
+		BeanContext bc = beanMeta.ctx;
+
+		// Read-only beans get their properties stored in a cache.
+		if (m.bean == null) {
+			if (! m.propertyCache.containsKey(name))
+				m.propertyCache.put(name, new ObjectList(bc));
+			((ObjectList)m.propertyCache.get(name)).add(value);
+			return;
+		}
+
+		boolean isCollection = rawTypeMeta.isCollection();
+		boolean isArray = rawTypeMeta.isArray();
+
+		if (! (isCollection || isArray))
+			throw new BeanRuntimeException(beanMeta.c, "Attempt to add element to property ''{0}'' which is not a collection or array", name);
+
+		Object bean = m.getBean(true);
+
+		ClassMeta<?> elementType = rawTypeMeta.getElementType();
+
+		try {
+			Object v = bc.convertToType(value, elementType);
+
+			if (isCollection) {
+				Collection c = null;
+				if (getter != null) {
+					c = (Collection)getter.invoke(bean, (Object[])null);
+				} else if (field != null) {
+					c = (Collection)field.get(bean);
+				} else {
+					throw new BeanRuntimeException(beanMeta.c, "Attempt to append to collection property ''{0}'', but no getter or field defined.", name);
+				}
+
+				if (c != null) {
+					c.add(v);
+					return;
+				}
+
+				if (rawTypeMeta.canCreateNewInstance())
+					c = (Collection)rawTypeMeta.newInstance();
+				else
+					c = new ObjectList(bc);
+
+				c.add(v);
+
+				if (setter != null)
+					setter.invoke(bean, c);
+				else if (field != null)
+					field.set(bean, c);
+				else
+					throw new BeanRuntimeException(beanMeta.c, "Attempt to initialize collection property ''{0}'', but no setter or field defined.", name);
+
+			} else /* isArray() */ {
+
+				if (m.arrayPropertyCache == null)
+					m.arrayPropertyCache = new TreeMap<String,List<?>>();
+
+				List l = m.arrayPropertyCache.get(name);
+				if (l == null) {
+					l = new LinkedList();  // ArrayLists and LinkLists appear to perform equally.
+					m.arrayPropertyCache.put(name, l);
+
+					// Copy any existing array values into the temporary list.
+					Object oldArray;
+				if (getter != null)
+						oldArray = getter.invoke(bean, (Object[])null);
+				else if (field != null)
+						oldArray = field.get(bean);
+				else
+					throw new BeanRuntimeException(beanMeta.c, "Attempt to append to array property ''{0}'', but no getter or field defined.", name);
+					ArrayUtils.copyToList(oldArray, l);
+				}
+
+				// Add new entry to our array.
+				l.add(v);
+			}
+
+		} catch (BeanRuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new BeanRuntimeException(e);
+		}
+	}
+
+	/**
+	 * Returns all instances of the specified annotation in the hierarchy of this bean property.
+	 * <p>
+	 * Searches through the class hierarchy (e.g. superclasses, interfaces, packages) for all
+	 * instances of the specified annotation.
+	 *
+	 * @param a The class to find annotations for.
+	 * @return A list of annotations ordered in child-to-parent order.  Never <jk>null</jk>.
+	 */
+	public <A extends Annotation> List<A> findAnnotations(Class<A> a) {
+		List<A> l = new LinkedList<A>();
+		if (field != null) {
+			addIfNotNull(l, field.getAnnotation(a));
+			appendAnnotations(a, field.getType(), l);
+		}
+		if (getter != null) {
+			addIfNotNull(l, getter.getAnnotation(a));
+			appendAnnotations(a, getter.getReturnType(), l);
+		}
+		if (setter != null) {
+			addIfNotNull(l, setter.getAnnotation(a));
+			appendAnnotations(a, setter.getReturnType(), l);
+		}
+		appendAnnotations(a, this.getBeanMeta().getClassMeta().getInnerClass(), l);
+		return l;
+	}
+
+	private Object filter(Object o) throws SerializeException {
+		// First use filter defined via @BeanProperty.
+		if (filter != null)
+			return filter.filter(o);
+		if (o == null)
+			return null;
+		// Otherwise, look it up via bean context.
+		if (rawTypeMeta.hasChildPojoFilters()) {
+			Class c = o.getClass();
+			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+			PojoFilter f = cm.getPojoFilter();
+			if (f != null)
+				return f.filter(o);
+		}
+		return o;
+	}
+
+	private Object unfilter(Object o) throws ParseException {
+		if (filter != null)
+			return filter.unfilter(o, rawTypeMeta);
+		if (o == null)
+			return null;
+		if (rawTypeMeta.hasChildPojoFilters()) {
+			Class c = o.getClass();
+			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+			PojoFilter f = cm.getPojoFilter();
+			if (f != null)
+				return f.unfilter(o, rawTypeMeta);
+		}
+		return o;
+	}
+
+	private Object applyChildPropertiesFilter(ClassMeta cm, Object o) {
+		if (o == null)
+			return null;
+		if (cm.isBean())
+			return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties));
+		if (cm.isMap())
+			return new FilteredMap((Map)o, properties);
+		if (cm.isObject()) {
+			if (o instanceof Map)
+				return new FilteredMap((Map)o, properties);
+			BeanMeta bm = this.getBeanMeta().ctx.getBeanMeta(o.getClass());
+			if (bm != null)
+				return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties));
+		}
+		return o;
+	}
+
+	private String findClassName(Object o) {
+		if (o == null)
+			return null;
+		if (o instanceof Class)
+			return ((Class<?>)o).getName();
+		return o.getClass().getName();
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return name + ": " + this.rawTypeMeta.getInnerClass().getName() + ", field=["+field+"], getter=["+getter+"], setter=["+setter+"]";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class
new file mode 100755
index 0000000..4b8f78d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java
new file mode 100755
index 0000000..3e628aa
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+/**
+ * Provides an {@link InvocationHandler} for creating beans from bean interfaces.
+ * <p>
+ * 	If the {@code useInterfaceProxies} setting is enabled in {@link BeanContext}, this
+ * 	is the class that creates instances of beans from interfaces.
+ *
+ * @author Barry M. Caceres
+ * @param <T> The interface class
+ */
+public class BeanProxyInvocationHandler<T> implements InvocationHandler {
+
+	private final BeanMeta<T> meta;						// The BeanMeta for this instance
+	private Map<String, Object> beanProps;		// The map of property names to bean property values.
+
+	/**
+	 * Constructs with the specified {@link BeanMeta}.
+	 *
+	 * @param meta The bean meta data.
+	 */
+	public BeanProxyInvocationHandler(BeanMeta<T> meta) {
+		this.meta = meta;
+		this.beanProps = new HashMap<String, Object>();
+	}
+
+	/**
+	 * Implemented to handle the method called.
+	 */
+	@Override /* InvocationHandler */
+	public Object invoke(Object proxy, Method method, Object[] args) {
+		Class<?>[] paramTypes = method.getParameterTypes();
+		if (method.getName().equals("equals") && (paramTypes.length == 1) && (paramTypes[0] == java.lang.Object.class)) {
+			Object arg = args[0];
+			if (arg == null)
+				return false;
+			if (proxy == arg)
+				return true;
+			if (proxy.getClass() == arg.getClass()) {
+				InvocationHandler ih = Proxy.getInvocationHandler(arg);
+				if (ih instanceof BeanProxyInvocationHandler) {
+					return this.beanProps.equals(((BeanProxyInvocationHandler<?>)ih).beanProps);
+				}
+			}
+			BeanMap<Object> bean = this.meta.ctx.forBean(arg);
+			return this.beanProps.equals(bean);
+		}
+
+		if (method.getName().equals("hashCode") && (paramTypes.length == 0))
+			return Integer.valueOf(this.beanProps.hashCode());
+
+		if (method.getName().equals("toString") && (paramTypes.length == 0))
+			return this.beanProps.toString();
+
+		String prop = this.meta.getterProps.get(method);
+		if (prop != null)
+			return this.beanProps.get(prop);
+
+		prop = this.meta.setterProps.get(method);
+		if (prop != null) {
+			this.beanProps.put(prop, args[0]);
+			return null;
+		}
+
+		throw new UnsupportedOperationException("Unsupported bean method.  method=[ " + method + " ]");
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class
new file mode 100755
index 0000000..e3247f1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java
new file mode 100755
index 0000000..f931e98
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import java.text.*;
+
+/**
+ * General bean runtime operation exception.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class BeanRuntimeException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param message The error message.
+	 */
+	public BeanRuntimeException(String message) {
+		super(message);
+	}
+
+	/**
+	 * Shortcut for calling <code><jk>new</jk> BeanRuntimeException(String.format(c.getName() + <js>": "</js> + message, args));</code>
+	 *
+	 * @param c The class name of the bean that caused the exception.
+	 * @param message The error message.
+	 * @param args Arguments passed in to the {@code String.format()} method.
+	 */
+	public BeanRuntimeException(Class<?> c, String message, Object... args) {
+		this(c.getName() + ": " + (args.length == 0 ? message : MessageFormat.format(message, args)));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The initial cause of the exception.
+	 */
+	public BeanRuntimeException(Throwable cause) {
+		super(cause == null ? null : cause.getLocalizedMessage());
+		initCause(cause);
+	}
+
+	/**
+	 * Sets the inner cause for this exception.
+	 *
+	 * @param cause The inner cause.
+	 * @return This object (for method chaining).
+	 */
+	@Override /* Throwable */
+	public synchronized BeanRuntimeException initCause(Throwable cause) {
+		super.initCause(cause);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class
new file mode 100755
index 0000000..6ff209f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class
new file mode 100755
index 0000000..28f91ed
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class
new file mode 100755
index 0000000..7e0e41a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java
new file mode 100755
index 0000000..a95bfdb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java
@@ -0,0 +1,1262 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core;
+
+import static com.ibm.juno.core.ClassMeta.ClassCategory.*;
+import static com.ibm.juno.core.ClassMeta.ClassCategory.URI;
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.lang.reflect.Proxy;
+import java.net.*;
+import java.net.URI;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.filter.Filter;
+import com.ibm.juno.core.html.*;
+import com.ibm.juno.core.jena.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.urlencoding.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * A wrapper class around the {@link Class} object that provides cached information
+ * about that class.
+ *
+ * <p>
+ * 	Instances of this class can be created through the {@link BeanContext#getClassMeta(Class)} method.
+ * <p>
+ * 	The {@link BeanContext} class will cache and reuse instances of this class except for the following class types:
+ * <ul>
+ * 	<li>Arrays
+ * 	<li>Maps with non-Object key/values.
+ * 	<li>Collections with non-Object key/values.
+ * </ul>
+ * <p>
+ * 	This class is tied to the {@link BeanContext} class because it's that class that makes the determination
+ * 	of what is a bean.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ * @param <T> The class type of the wrapped class.
+ */
+@Bean(properties={"innerClass","classCategory","elementType","keyType","valueType","notABeanReason","initException","beanMeta"})
+public final class ClassMeta<T> implements Type {
+
+	/** Class categories. */
+	enum ClassCategory {
+		MAP, COLLECTION, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, ARRAY, ENUM, BEAN, UNKNOWN, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM
+	}
+
+	final BeanContext beanContext;                    // The bean context that created this object.
+	ClassCategory classCategory = UNKNOWN;            // The class category.
+	final Class<T> innerClass;                        // The class being wrapped.
+	ClassMeta<?>
+		filteredClassMeta,                             // The filtered class type (in class has filter associated with it.
+		elementType = null,                            // If ARRAY or COLLECTION, the element class type.
+		keyType = null,                                // If MAP, the key class type.
+		valueType = null;                              // If MAP, the value class type.
+	InvocationHandler invocationHandler;              // The invocation handler for this class (if it has one).
+	volatile BeanMeta<T> beanMeta;                    // The bean meta for this bean class (if it's a bean).
+	Method valueOfMethod;                             // The static valueOf(String) or fromString(String) method (if it has one).
+	Constructor<? extends T> noArgConstructor;        // The no-arg constructor for this class (if it has one).
+	Constructor<T> stringConstructor;                 // The X(String) constructor (if it has one).
+	Constructor<T> objectMapConstructor;              // The X(ObjectMap) constructor (if it has one).
+	Method toObjectMapMethod;                         // The toObjectMap() method (if it has one).
+	Method namePropertyMethod;                        // The method to set the name on an object (if it has one).
+	Method parentPropertyMethod;                      // The method to set the parent on an object (if it has one).
+	String notABeanReason;                            // If this isn't a bean, the reason why.
+	PojoFilter<T,?> pojoFilter;                       // The object filter associated with this bean (if it has one).
+	BeanFilter<? extends T> beanFilter;               // The bean filter associated with this bean (if it has one).
+	boolean
+		isDelegate,                                    // True if this class extends Delegate.
+		isAbstract,                                    // True if this class is abstract.
+		isMemberClass;                                 // True if this is a non-static member class.
+
+	private XmlClassMeta xmlMeta;                      // Class-related metadata from the @Xml annotation found on this class or parent class.
+	private JsonClassMeta jsonMeta;                    // Class-related metadata from the @Json annotation found on this class or parent class.
+	private HtmlClassMeta htmlMeta;                    // Class-related metadata from the @Html annotation found on this class or parent class.
+	private UrlEncodingClassMeta urlEncodingMeta;      // Class-related metadata from the @UrlEncoding annotation found on this class or parent class.
+	private RdfClassMeta rdfMeta;                      // Class-related metadata from the @Rdf annotation found on this class or parent class.
+
+	private Throwable initException;                  // Any exceptions thrown in the init() method.
+	private boolean hasChildPojoFilters;              // True if this class or any subclass of this class has a PojoFilter associated with it.
+	private Object primitiveDefault;                  // Default value for primitive type classes.
+	private Map<String,Method> remoteableMethods,     // Methods annotated with @Remoteable.  Contains all public methods if class is annotated with @Remotable.
+		publicMethods;                                 // All public methods, including static methods.
+
+	private static final Boolean BOOLEAN_DEFAULT = false;
+	private static final Character CHARACTER_DEFAULT = (char)0;
+	private static final Short SHORT_DEFAULT = (short)0;
+	private static final Integer INTEGER_DEFAULT = 0;
+	private static final Long LONG_DEFAULT = 0l;
+	private static final Float FLOAT_DEFAULT = 0f;
+	private static final Double DOUBLE_DEFAULT = 0d;
+	private static final Byte BYTE_DEFAULT = (byte)0;
+
+	/**
+	 * Shortcut for calling <code>ClassMeta(innerClass, beanContext, <jk>false</jk>)</code>.
+	 */
+	ClassMeta(Class<T> innerClass, BeanContext beanContext) {
+		this(innerClass, beanContext, false);
+	}
+
+	/**
+	 * Construct a new {@code ClassMeta} based on the specified {@link Class}.
+	 *
+	 * @param innerClass The class being wrapped.
+	 * @param beanContext The bean context that created this object.
+	 * @param delayedInit Don't call init() in constructor.
+	 * 	Used for delayed initialization when the possibility of class reference loops exist.
+	 */
+	ClassMeta(Class<T> innerClass, BeanContext beanContext, boolean delayedInit) {
+		this.innerClass = innerClass;
+		this.beanContext = beanContext;
+		if (! delayedInit)
+			init();
+	}
+
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	ClassMeta init() {
+
+		try {
+			Filter filter = findFilter(beanContext);
+			if (filter != null) {
+				if (filter.getType() == Filter.FilterType.BEAN)
+					beanFilter = (BeanFilter)filter;
+				else
+					pojoFilter = (PojoFilter)filter;
+				filteredClassMeta = (pojoFilter == null ? this : beanContext.getClassMeta(pojoFilter.getFilteredClass()));
+			} else {
+				filteredClassMeta = this;
+			}
+
+			if (innerClass != Object.class) {
+				this.noArgConstructor = beanContext.getImplClassConstructor(innerClass, Visibility.PUBLIC);
+				if (noArgConstructor == null)
+					noArgConstructor = findNoArgConstructor(innerClass, Visibility.PUBLIC);
+			}
+
+			this.hasChildPojoFilters = beanContext.hasChildPojoFilters(innerClass);
+
+			this.xmlMeta = new XmlClassMeta(innerClass);
+			this.jsonMeta = new JsonClassMeta(innerClass);
+			this.htmlMeta = new HtmlClassMeta(innerClass);
+			this.urlEncodingMeta = new UrlEncodingClassMeta(innerClass);
+			this.rdfMeta = new RdfClassMeta(innerClass);
+
+			Class c = innerClass;
+
+			if (c.isPrimitive()) {
+				if (c == Boolean.TYPE)
+					classCategory = BOOLEAN;
+				else if (c == Byte.TYPE || c == Short.TYPE || c == Integer.TYPE || c == Long.TYPE || c == Float.TYPE || c == Double.TYPE) {
+					if (c == Float.TYPE || c == Double.TYPE)
+						classCategory = DECIMAL;
+					else
+						classCategory = NUMBER;
+				}
+				else if (c == Character.TYPE)
+					classCategory = CHAR;
+			} else {
+				if (isParentClass(Delegate.class, c))
+					isDelegate = true;
+				if (c == Object.class)
+					classCategory = OBJ;
+				else if (c.isEnum())
+					classCategory = ENUM;
+				else if (isParentClass(CharSequence.class, c)) {
+					if (c.equals(String.class))
+						classCategory = STR;
+					else
+						classCategory = CHARSEQ;
+				}
+				else if (isParentClass(Number.class, c)) {
+					if (isParentClass(Float.class, c) || isParentClass(Double.class, c))
+						classCategory = DECIMAL;
+					else
+						classCategory = NUMBER;
+				}
+				else if (isParentClass(Collection.class, c))
+					classCategory = COLLECTION;
+				else if (isParentClass(Map.class, c)) {
+					if (isParentClass(BeanMap.class, c))
+						classCategory = BEANMAP;
+					else
+						classCategory = MAP;
+				}
+				else if (c == Character.class)
+					classCategory = CHAR;
+				else if (c == Boolean.class)
+					classCategory = BOOLEAN;
+				else if (isParentClass(Date.class, c) || isParentClass(Calendar.class, c))
+					classCategory = DATE;
+				else if (c.isArray())
+					classCategory = ARRAY;
+				else if (isParentClass(URL.class, c) || isParentClass(URI.class, c) || c.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class))
+					classCategory = URI;
+				else if (isParentClass(Reader.class, c))
+					classCategory = READER;
+				else if (isParentClass(InputStream.class, c))
+					classCategory = INPUTSTREAM;
+			}
+
+			isMemberClass = c.isMemberClass() && ! Modifier.isStatic(c.getModifiers());
+
+			// Find static fromString(String) or equivalent method.
+			// fromString() must be checked before valueOf() so that Enum classes can create their own
+			//		specialized fromString() methods to override the behavior of Enum.valueOf(String).
+			// valueOf() is used by enums.
+			// parse() is used by the java logging Level class.
+			// forName() is used by Class and Charset
+			for (String methodName : new String[]{"fromString","valueOf","parse","parseString","forName"}) {
+				if (this.valueOfMethod == null) {
+			for (Method m : c.getMethods()) {
+				int mod = m.getModifiers();
+				if (Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
+					String mName = m.getName();
+							if (mName.equals(methodName) && m.getReturnType() == innerClass) {
+						Class<?>[] args = m.getParameterTypes();
+						if (args.length == 1 && args[0] == String.class) {
+							this.valueOfMethod = m;
+							break;
+						}
+					}
+				}
+			}
+				}
+			}
+
+			// Find toObjectMap() method if present.
+			for (Method m : c.getMethods()) {
+				int mod = m.getModifiers();
+				if (Modifier.isPublic(mod) && ! Modifier.isStatic(mod)) {
+					String mName = m.getName();
+					if (mName.equals("toObjectMap")) {
+						if (m.getParameterTypes().length == 0 && m.getReturnType() == ObjectMap.class) {
+							this.toObjectMapMethod = m;
+							break;
+						}
+					}
+				}
+			}
+
+			// Find @NameProperty and @ParentProperty methods if present.
+			for (Method m : c.getDeclaredMethods()) {
+				if (m.isAnnotationPresent(ParentProperty.class) && m.getParameterTypes().length == 1) {
+					m.setAccessible(true);
+					parentPropertyMethod = m;
+				}
+				if (m.isAnnotationPresent(NameProperty.class) && m.getParameterTypes().length == 1) {
+					m.setAccessible(true);
+					namePropertyMethod = m;
+				}
+			}
+
+			// Find constructor(String) method if present.
+			for (Constructor cs : c.getConstructors()) {
+				int mod = cs.getModifiers();
+				if (Modifier.isPublic(mod)) {
+					Class<?>[] args = cs.getParameterTypes();
+					if (args.length == (isMemberClass ? 2 : 1)) {
+						Class<?> arg = args[(isMemberClass ? 1 : 0)];
+						if (arg == String.class)
+						this.stringConstructor = cs;
+						else if (ObjectMap.class.isAssignableFrom(arg))
+							this.objectMapConstructor = cs;
+					}
+				}
+			}
+
+			// Note:  Primitive types are normally abstract.
+			isAbstract = Modifier.isAbstract(c.getModifiers()) && ! isPrimitive();
+
+			// If this is an array, get the element type.
+			if (classCategory == ARRAY)
+				elementType = beanContext.getClassMeta(innerClass.getComponentType());
+
+			// If this is a MAP, see if it's parameterized (e.g. AddressBook extends HashMap<String,Person>)
+			else if (classCategory == MAP) {
+				ClassMeta[] parameters = beanContext.findParameters(innerClass, innerClass);
+				if (parameters != null && parameters.length == 2) {
+					keyType = parameters[0];
+					valueType = parameters[1];
+				} else {
+					keyType = beanContext.getClassMeta(Object.class);
+					valueType = beanContext.getClassMeta(Object.class);
+				}
+			}
+
+			// If this is a COLLECTION, see if it's parameterized (e.g. AddressBook extends LinkedList<Person>)
+			else if (classCategory == COLLECTION) {
+				ClassMeta[] parameters = beanContext.findParameters(innerClass, innerClass);
+				if (parameters != null && parameters.length == 1) {
+					elementType = parameters[0];
+				} else {
+					elementType = beanContext.getClassMeta(Object.class);
+				}
+			}
+
+			// If the category is unknown, see if it's a bean.
+			// Note that this needs to be done after all other initialization has been done.
+			else if (classCategory == UNKNOWN) {
+
+				BeanMeta newMeta = new BeanMeta(this, beanContext, beanFilter);
+				try {
+					notABeanReason = newMeta.init();
+				} catch (RuntimeException e) {
+					notABeanReason = e.getMessage();
+					throw e;
+				}
+				if (notABeanReason != null)
+					classCategory = OTHER;
+				else {
+					beanMeta = newMeta;
+					classCategory = BEAN;
+				}
+			}
+
+			if (c.isPrimitive()) {
+				if (c == Boolean.TYPE)
+					primitiveDefault = BOOLEAN_DEFAULT;
+				else if (c == Character.TYPE)
+					primitiveDefault = CHARACTER_DEFAULT;
+				else if (c == Short.TYPE)
+					primitiveDefault = SHORT_DEFAULT;
+				else if (c == Integer.TYPE)
+					primitiveDefault = INTEGER_DEFAULT;
+				else if (c == Long.TYPE)
+					primitiveDefault = LONG_DEFAULT;
+				else if (c == Float.TYPE)
+					primitiveDefault = FLOAT_DEFAULT;
+				else if (c == Double.TYPE)
+					primitiveDefault = DOUBLE_DEFAULT;
+				else if (c == Byte.TYPE)
+					primitiveDefault = BYTE_DEFAULT;
+			} else {
+				if (c == Boolean.class)
+					primitiveDefault = BOOLEAN_DEFAULT;
+				else if (c == Character.class)
+					primitiveDefault = CHARACTER_DEFAULT;
+				else if (c == Short.class)
+					primitiveDefault = SHORT_DEFAULT;
+				else if (c == Integer.class)
+					primitiveDefault = INTEGER_DEFAULT;
+				else if (c == Long.class)
+					primitiveDefault = LONG_DEFAULT;
+				else if (c == Float.class)
+					primitiveDefault = FLOAT_DEFAULT;
+				else if (c == Double.class)
+					primitiveDefault = DOUBLE_DEFAULT;
+				else if (c == Byte.class)
+					primitiveDefault = BYTE_DEFAULT;
+			}
+		} catch (NoClassDefFoundError e) {
+			this.initException = e;
+		} catch (RuntimeException e) {
+			this.initException = e;
+			throw e;
+		}
+
+		if (innerClass.getAnnotation(Remoteable.class) != null) {
+			remoteableMethods = getPublicMethods();
+		} else {
+			for (Method m : innerClass.getMethods()) {
+				if (m.getAnnotation(Remoteable.class) != null) {
+					if (remoteableMethods == null)
+						remoteableMethods = new LinkedHashMap<String,Method>();
+					remoteableMethods.put(ClassUtils.getMethodSignature(m), m);
+				}
+			}
+		}
+		if (remoteableMethods != null)
+			remoteableMethods = Collections.unmodifiableMap(remoteableMethods);
+
+		return this;
+	}
+
+	/**
+	 * Returns the category of this class.
+	 *
+	 * @return The category of this class.
+	 */
+	public ClassCategory getClassCategory() {
+		return classCategory;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a superclass of or the same as the specified class.
+	 *
+	 * @param c The comparison class.
+	 * @return <jk>true</jk> if this class is a superclass of or the same as the specified class.
+	 */
+	public boolean isAssignableFrom(Class<?> c) {
+		return isParentClass(innerClass, c);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class as subtypes defined through {@link Bean#subTypes} or {@link BeanFilter#getSubTypes()}.
+	 *
+	 * @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.
+	 * @return <jk>true</jk> if this class is a subclass of or the same as the specified class.
+	 */
+	public boolean isInstanceOf(Class<?> c) {
+		return isParentClass(c, innerClass);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class or any child classes has a {@link PojoFilter} associated with it.
+	 * <p>
+	 * Used when filtering bean properties to prevent having to look up filters if we know for certain
+	 * that no filters are associated with a bean property.
+	 *
+	 * @return <jk>true</jk> if this class or any child classes has a {@link PojoFilter} associated with it.
+	 */
+	public boolean hasChildPojoFilters() {
+		return hasChildPojoFilters;
+	}
+
+	private Filter findFilter(BeanContext context) {
+		try {
+			com.ibm.juno.core.annotation.Filter b = innerClass.getAnnotation(com.ibm.juno.core.annotation.Filter.class);
+			if (b != null) {
+				Class<? extends Filter> c = b.value();
+				if (c != Filter.NULL.class) {
+					Filter f = c.newInstance();
+					f.setBeanContext(context);
+					return f;
+				}
+			}
+			if (context == null)
+				return null;
+			Filter f = context.findBeanFilter(innerClass);
+			if (f != null)
+				return f;
+			f = context.findPojoFilter(innerClass);
+			if (f != null)
+				return f;
+			List<Bean> ba = ReflectionUtils.findAnnotations(Bean.class, innerClass);
+			if (! ba.isEmpty())
+				f = new AnnotationBeanFilter<T>(innerClass, ba);
+			return f;
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * Locates the no-arg constructor for the specified class.
+	 * Constructor must match the visibility requirements specified by parameter 'v'.
+	 * If class is abstract, always returns <jk>null</jk>.
+	 * Note that this also returns the 1-arg constructor for non-static member classes.
+	 *
+	 * @param c The class from which to locate the no-arg constructor.
+	 * @param v The minimum visibility.
+	 * @return The constructor, or <jk>null</jk> if no no-arg constructor exists with the required visibility.
+	 */
+	@SuppressWarnings({"rawtypes","unchecked"})
+	protected static <T> Constructor<? extends T> findNoArgConstructor(Class<T> c, Visibility v) {
+		int mod = c.getModifiers();
+		if (Modifier.isAbstract(mod))
+			return null;
+		boolean isMemberClass = c.isMemberClass() && ! Modifier.isStatic(mod);
+		for (Constructor cc : c.getConstructors()) {
+			mod = cc.getModifiers();
+			if (cc.getParameterTypes().length == (isMemberClass ? 1 : 0) && v.isVisible(mod))
+				return v.filter(cc);
+		}
+		return null;
+	}
+
+	/**
+	 * Set element type on non-cached <code>Collection</code> types.
+	 *
+	 * @param elementType The class type for elements in the collection class represented by this metadata.
+	 * @return This object (for method chaining).
+	 */
+	protected ClassMeta<T> setElementType(ClassMeta<?> elementType) {
+		this.elementType = elementType;
+		return this;
+	}
+
+	/**
+	 * Set key type on non-cached <code>Map</code> types.
+	 *
+	 * @param keyType The class type for keys in the map class represented by this metadata.
+	 * @return This object (for method chaining).
+	 */
+	protected ClassMeta<T> setKeyType(ClassMeta<?> keyType) {
+		this.keyType = keyType;
+		return this;
+	}
+
+	/**
+	 * Set value type on non-cached <code>Map</code> types.
+	 *
+	 * @param valueType The class type for values in the map class represented by this metadata.
+	 * @return This object (for method chaining).
+	 */
+	protected ClassMeta<T> setValueType(ClassMeta<?> valueType) {
+		this.valueType = valueType;
+		return this;
+	}
+
+	/**
+	 * Returns the {@link Class} object that this class type wraps.
+	 *
+	 * @return The wrapped class object.
+	 */
+	public Class<T> getInnerClass() {
+		return innerClass;
+	}
+
+	/**
+	 * Returns the generalized form of this class if there is an {@link PojoFilter} associated with it.
+	 *
+	 * @return The filtered class type, or this object if no filter is associated with the class.
+	 */
+	@BeanIgnore
+	public ClassMeta<?> getFilteredClassMeta() {
+		return filteredClassMeta;
+	}
+
+	/**
+	 * For array and {@code Collection} types, returns the class type of the components of the array or {@code Collection}.
+	 *
+	 * @return The element class type, or <jk>null</jk> if this class is not an array or Collection.
+	 */
+	public ClassMeta<?> getElementType() {
+		return elementType;
+	}
+
+	/**
+	 * For {@code Map} types, returns the class type of the keys of the {@code Map}.
+	 *
+	 * @return The key class type, or <jk>null</jk> if this class is not a Map.
+	 */
+	public ClassMeta<?> getKeyType() {
+		return keyType;
+	}
+
+	/**
+	 * For {@code Map} types, returns the class type of the values of the {@code Map}.
+	 *
+	 * @return The value class type, or <jk>null</jk> if this class is not a Map.
+	 */
+	public ClassMeta<?> getValueType() {
+		return valueType;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class implements {@link Delegate}, meaning
+	 * 	it's a representation of some other object.
+	 *
+	 * @return <jk>true</jk> if this class implements {@link Delegate}.
+	 */
+	public boolean isDelegate() {
+		return isDelegate;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link Map}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link Map}.
+	 */
+	public boolean isMap() {
+		return classCategory == MAP || classCategory == BEANMAP;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link BeanMap}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link BeanMap}.
+	 */
+	public boolean isBeanMap() {
+		return classCategory == BEANMAP;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link Collection}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link Collection}.
+	 */
+	public boolean isCollection() {
+		return classCategory == COLLECTION;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is an {@link Enum}.
+	 *
+	 * @return <jk>true</jk> if this class is an {@link Enum}.
+	 */
+	public boolean isEnum() {
+		return classCategory == ENUM;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is an array.
+	 *
+	 * @return <jk>true</jk> if this class is an array.
+	 */
+	public boolean isArray() {
+		return classCategory == ARRAY;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a bean.
+	 *
+	 * @return <jk>true</jk> if this class is a bean.
+	 */
+	public boolean isBean() {
+		return classCategory == BEAN;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is {@link Object}.
+	 *
+	 * @return <jk>true</jk> if this class is {@link Object}.
+	 */
+	public boolean isObject() {
+		return classCategory == OBJ;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is not {@link Object}.
+	 *
+	 * @return <jk>true</jk> if this class is not {@link Object}.
+	 */
+	public boolean isNotObject() {
+		return classCategory != OBJ;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link Number}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link Number}.
+	 */
+	public boolean isNumber() {
+		return classCategory == NUMBER || classCategory == DECIMAL;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link Float} or {@link Double}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link Float} or {@link Double}.
+	 */
+	public boolean isDecimal() {
+		return classCategory == DECIMAL;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link Boolean}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link Boolean}.
+	 */
+	public boolean isBoolean() {
+		return classCategory == BOOLEAN;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a subclass of {@link CharSequence}.
+	 *
+	 * @return <jk>true</jk> if this class is a subclass of {@link CharSequence}.
+	 */
+	public boolean isCharSequence() {
+		return classCategory == STR || classCategory == CHARSEQ;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link String}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link String}.
+	 */
+	public boolean isString() {
+		return classCategory == STR;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link Character}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link Character}.
+	 */
+	public boolean isChar() {
+		return classCategory == CHAR;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a primitive.
+	 *
+	 * @return <jk>true</jk> if this class is a primitive.
+	 */
+	public boolean isPrimitive() {
+		return innerClass.isPrimitive();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link Date} or {@link Calendar}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link Date} or {@link Calendar}.
+	 */
+	public boolean isDate() {
+		return classCategory == DATE;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link URI} or {@link URL}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link URI} or {@link URL}.
+	 */
+	public boolean isUri() {
+		return classCategory == URI;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link Reader}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link Reader}.
+	 */
+	public boolean isReader() {
+		return classCategory == READER;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is an {@link InputStream}.
+	 *
+	 * @return <jk>true</jk> if this class is an {@link InputStream}.
+	 */
+	public boolean isInputStream() {
+		return classCategory == INPUTSTREAM;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if instance of this object can be <jk>null</jk>.
+	 * <p>
+	 * 	Objects can be <jk>null</jk>, but primitives cannot, except for chars which can be represented
+	 * 	by <code>(<jk>char</jk>)0</code>.
+	 *
+	 * @return <jk>true</jk> if instance of this class can be null.
+	 */
+	public boolean isNullable() {
+		if (innerClass.isPrimitive())
+			return classCategory == CHAR;
+		return true;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class or one of it's methods are annotated with {@link Remoteable @Remotable}.
+	 *
+	 * @return <jk>true</jk> if this class is remoteable.
+	 */
+	public boolean isRemoteable() {
+		return remoteableMethods != null;
+	}
+
+	/**
+	 * All methods on this class annotated with {@link Remoteable @Remotable}, or all public methods if class is annotated.
+	 * Keys are method signatures (see {@link ClassUtils#getMethodSignature(Method)})
+	 *
+	 * @return All remoteable methods on this class.
+	 */
+	public Map<String,Method> getRemoteableMethods() {
+		return remoteableMethods;
+	}
+
+	/**
+	 * All public methods on this class including static methods.
+	 * Keys are method signatures (see {@link ClassUtils#getMethodSignature(Method)}).
+	 *
+	 * @return The public methods on this class.
+	 */
+	public Map<String,Method> getPublicMethods() {
+		if (publicMethods == null) {
+			synchronized(this) {
+				Map<String,Method> map = new LinkedHashMap<String,Method>();
+				for (Method m : innerClass.getMethods())
+					if (Modifier.isPublic(m.getModifiers()))
+						map.put(ClassUtils.getMethodSignature(m), m);
+				publicMethods = Collections.unmodifiableMap(map);
+			}
+		}
+		return publicMethods;
+	}
+
+	/**
+	 * Returns the {@link PojoFilter} associated with this class.
+	 *
+	 * @return The {@link PojoFilter} associated with this class, or <jk>null</jk> if there is no POJO filter
+	 * 	associated with this class.
+	 */
+	public PojoFilter<T,?> getPojoFilter() {
+		return pojoFilter;
+	}
+
+	/**
+	 * Returns the {@link BeanMeta} associated with this class.
+	 *
+	 * @return The {@link BeanMeta} associated with this class, or <jk>null</jk> if there is no bean meta
+	 * 	associated with this class.
+	 */
+	public BeanMeta<T> getBeanMeta() {
+		return beanMeta;
+	}
+
+	/**
+	 * Returns the no-arg constructor for this class.
+	 *
+	 * @return The no-arg constructor for this class, or <jk>null</jk> if it does not exist.
+	 */
+	public Constructor<? extends T> getConstructor() {
+		return noArgConstructor;
+	}
+
+	/**
+	 * Returns the <ja>@Xml</ja> annotation defined on this class, superclass, or interface of this class.
+	 *
+	 * @return XML metadata on this class.  Never <jk>null</jk>.
+	 */
+	public XmlClassMeta getXmlMeta() {
+		return xmlMeta;
+	}
+
+	/**
+	 * Returns metadata from the <ja>@Json</ja> annotation defined on this class, superclass, or interface of this class.
+	 *
+	 * @return JSON metadata on this class.  Never <jk>null</jk>.
+	 */
+	public JsonClassMeta getJsonMeta() {
+		return jsonMeta;
+	}
+
+	/**
+	 * Returns metadata from the <ja>@Html</ja> annotation defined on this class, superclass, or interface of this class.
+	 *
+	 * @return HTML metadata on this class.  Never <jk>null</jk>.
+	 */
+	public HtmlClassMeta getHtmlMeta() {
+		return htmlMeta;
+	}
+
+	/**
+	 * Returns metadata from the <ja>@UrlEncoding</ja> annotation defined on this class, superclass, or interface of this class.
+	 *
+	 * @return URL-Encoding metadata on this class.  Never <jk>null</jk>.
+	 */
+	public UrlEncodingClassMeta getUrlEncodingMeta() {
+		return urlEncodingMeta;
+	}
+
+	/**
+	 * Returns metadata from the <ja>@Rdf</ja> annotation defined on this class, superclass, or interface of this class.
+	 *
+	 * @return RDF metadata on this class.  Never <jk>null</jk>.
+	 */
+	public RdfClassMeta getRdfMeta() {
+		return rdfMeta;
+	}
+
+	/**
+	 * Returns the interface proxy invocation handler for this class.
+	 *
+	 * @return The interface proxy invocation handler, or <jk>null</jk> if it does not exist.
+	 */
+	public InvocationHandler getProxyInvocationHandler() {
+		if (invocationHandler == null && beanMeta != null && beanContext.useInterfaceProxies && innerClass.isInterface())
+			invocationHandler = new BeanProxyInvocationHandler<T>(beanMeta);
+		return invocationHandler;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class has a no-arg constructor or invocation handler.
+	 *
+	 * @return <jk>true</jk> if a new instance of this class can be constructed.
+	 */
+	public boolean canCreateNewInstance() {
+		if (isMemberClass)
+			return false;
+		if (noArgConstructor != null)
+			return true;
+		if (getProxyInvocationHandler() != null)
+			return true;
+		if (isArray() && elementType.canCreateNewInstance())
+			return true;
+		return false;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class has a no-arg constructor or invocation handler.
+	 * Returns <jk>false</jk> if this is a non-static member class and the outer object does not match
+	 * 	the class type of the defining class.
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @return <jk>true</jk> if a new instance of this class can be created within the context of the specified outer object.
+	 */
+	public boolean canCreateNewInstance(Object outer) {
+		if (isMemberClass)
+			return outer != null && noArgConstructor != null && noArgConstructor.getParameterTypes()[0] == outer.getClass();
+		return canCreateNewInstance();
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class can be instantiated as a bean.
+	 * Returns <jk>false</jk> if this is a non-static member class and the outer object does not match
+	 * 	the class type of the defining class.
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @return <jk>true</jk> if a new instance of this bean can be created within the context of the specified outer object.
+	 */
+	public boolean canCreateNewBean(Object outer) {
+		if (beanMeta == null)
+			return false;
+		// Beans with filters with subtype properties are assumed to be constructable.
+		if (beanFilter != null && beanFilter.getSubTypeProperty() != null)
+			return true;
+		if (beanMeta.constructor == null)
+			return false;
+		if (isMemberClass)
+			return outer != null && beanMeta.constructor.getParameterTypes()[0] == outer.getClass();
+		return true;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class can call the {@link #newInstanceFromString(Object, String)} method.
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @return <jk>true</jk> if this class has a no-arg constructor or invocation handler.
+	 */
+	public boolean canCreateNewInstanceFromString(Object outer) {
+		if (valueOfMethod != null)
+			return true;
+		if (stringConstructor != null) {
+			if (isMemberClass)
+				return outer != null && stringConstructor.getParameterTypes()[0] == outer.getClass();
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class can call the {@link #newInstanceFromString(Object, String)} method.
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @return <jk>true</jk> if this class has a no-arg constructor or invocation handler.
+	 */
+	public boolean canCreateNewInstanceFromObjectMap(Object outer) {
+		if (objectMapConstructor != null) {
+			if (isMemberClass)
+				return outer != null && objectMapConstructor.getParameterTypes()[0] == outer.getClass();
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class has an <code>ObjectMap toObjectMap()</code> method.
+	 *
+	 * @return <jk>true</jk> if class has a <code>toObjectMap()</code> method.
+	 */
+	public boolean hasToObjectMapMethod() {
+		return toObjectMapMethod != null;
+	}
+
+	/**
+	 * Returns the method annotated with {@link NameProperty @NameProperty}.
+	 *
+	 * @return The method annotated with {@link NameProperty @NameProperty} or <jk>null</jk> if method does not exist.
+	 */
+	public Method getNameProperty() {
+		return namePropertyMethod;
+ 	}
+
+	/**
+	 * Returns the method annotated with {@link ParentProperty @ParentProperty}.
+	 *
+	 * @return The method annotated with {@link ParentProperty @ParentProperty} or <jk>null</jk> if method does not exist.
+	 */
+	public Method getParentProperty() {
+		return parentPropertyMethod;
+ 	}
+
+	/**
+	 * Converts an instance of this class to an {@link ObjectMap}.
+	 *
+	 * @param t The object to convert to a map.
+	 * @return The converted object, or <jk>null</jk> if method does not have a <code>toObjectMap()</code> method.
+	 * @throws BeanRuntimeException Thrown by <code>toObjectMap()</code> method invocation.
+	 */
+	public ObjectMap toObjectMap(Object t) throws BeanRuntimeException {
+		try {
+			if (toObjectMapMethod != null)
+				return (ObjectMap)toObjectMapMethod.invoke(t);
+			return null;
+		} catch (Exception e) {
+			throw new BeanRuntimeException(e);
+		}
+	}
+
+	/**
+	 * Returns the reason why this class is not a bean, or <jk>null</jk> if it is a bean.
+	 *
+	 * @return The reason why this class is not a bean, or <jk>null</jk> if it is a bean.
+	 */
+	public synchronized String getNotABeanReason() {
+		return notABeanReason;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this class is abstract.
+	 * @return <jk>true</jk> if this class is abstract.
+	 */
+	public boolean isAbstract() {
+		return isAbstract;
+	}
+
+	/**
+	 * Returns any exception that was throw in the <code>init()</code> method.
+	 *
+	 * @return The cached exception.
+	 */
+	public Throwable getInitException() {
+		return initException;
+	}
+
+	/**
+	 * Returns the {@link BeanContext} that created this object.
+	 *
+	 * @return The bean context.
+	 */
+	public BeanContext getBeanContext() {
+		return beanContext;
+	}
+
+	/**
+	 * Returns the default value for primitives such as <jk>int</jk> or <jk>Integer</jk>.
+	 *
+	 * @return The default value, or <jk>null</jk> if this class type is not a primitive.
+	 */
+	@SuppressWarnings("unchecked")
+	public T getPrimitiveDefault() {
+		return (T)primitiveDefault;
+	}
+
+	/**
+	 * Create a new instance of the main class of this declared type from a <code>String</code> input.
+	 * <p>
+	 * In order to use this method, the class must have one of the following methods:
+	 * <ul>
+	 * 	<li><code><jk>public static</jk> T valueOf(String in);</code>
+	 * 	<li><code><jk>public static</jk> T fromString(String in);</code>
+	 * 	<li><code><jk>public</jk> T(String in);</code>
+	 * </ul>
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @param arg The input argument value.
+	 * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If the parameter type on the method was invalid.
+	 * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class, or
+	 * 	does not have one of the methods described above.
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 */
+	@SuppressWarnings("unchecked")
+	public T newInstanceFromString(Object outer, String arg) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
+		Method m = valueOfMethod;
+		if (m != null)
+			return (T)m.invoke(null, arg);
+		Constructor<T> c = stringConstructor;
+		if (c != null) {
+			if (isMemberClass)
+				return c.newInstance(outer, arg);
+			return c.newInstance(arg);
+		}
+		throw new InstantiationError("No string constructor or valueOf(String) method found for class '"+getInnerClass().getName()+"'");
+	}
+
+	/**
+	 * Create a new instance of the main class of this declared type from an <code>ObjectMap</code> input.
+	 * <p>
+	 * In order to use this method, the class must have one of the following methods:
+	 * <ul>
+	 * 	<li><code><jk>public</jk> T(ObjectMap in);</code>
+	 * </ul>
+	 *
+	 * @param outer The outer class object for non-static member classes.  Can be <jk>null</jk> for non-member or static classes.
+	 * @param arg The input argument value.
+	 * @return A new instance of the object.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If the parameter type on the method was invalid.
+	 * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class, or
+	 * 	does not have one of the methods described above.
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 */
+	public T newInstanceFromObjectMap(Object outer, ObjectMap arg) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
+		Constructor<T> c = objectMapConstructor;
+		if (c != null) {
+			if (isMemberClass)
+				return c.newInstance(outer, arg);
+			return c.newInstance(arg);
+		}
+		throw new InstantiationError("No map constructor method found for class '"+getInnerClass().getName()+"'");
+	}
+
+	/**
+	 * Create a new instance of the main class of this declared type.
+	 *
+	 * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If one of the following occurs:
+	 * 	<ul>
+	 * 		<li>The number of actual and formal parameters differ.
+	 * 		<li>An unwrapping conversion for primitive arguments fails.
+	 * 		<li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.
+	 * 		<li>The constructor pertains to an enum type.
+	 * 	</ul>
+	 * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class.
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 */
+	@SuppressWarnings("unchecked")
+	public T newInstance() throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+		if (isArray())
+			return (T)Array.newInstance(getInnerClass().getComponentType(), 0);
+		Constructor<? extends T> c = getConstructor();
+		if (c != null)
+			return c.newInstance((Object[])null);
+		InvocationHandler h = getProxyInvocationHandler();
+		if (h != null)
+			return (T)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { getInnerClass(), java.io.Serializable.class }, h);
+		if (isArray())
+			return (T)Array.newInstance(this.elementType.innerClass,0);
+		return null;
+	}
+
+	/**
+	 * Same as {@link #newInstance()} except for instantiating non-static member classes.
+	 *
+	 * @param outer The instance of the owning object of the member class instance.  Can be <jk>null</jk> if instantiating a non-member or static class.
+	 * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If one of the following occurs:
+	 * 	<ul>
+	 * 		<li>The number of actual and formal parameters differ.
+	 * 		<li>An unwrapping conversion for primitive arguments fails.
+	 * 		<li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.
+	 * 		<li>The constructor pertains to an enum type.
+	 * 	</ul>
+	 * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class.
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 */
+	public T newInstance(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+		if (isMemberClass)
+			return noArgConstructor.newInstance(outer);
+		return newInstance();
+	}
+
+	/**
+	 * Checks to see if the specified class type is the same as this one.
+	 *
+	 * @param t The specified class type.
+	 * @return <jk>true</jk> if the specified class type is the same as the class for this type.
+	 */
+	@Override /* Object */
+	public boolean equals(Object t) {
+		if (t == null || ! (t instanceof ClassMeta))
+			return false;
+		ClassMeta<?> t2 = (ClassMeta<?>)t;
+		return t2.getInnerClass() == this.getInnerClass();
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return toString(false);
+	}
+
+	/**
+	 * Same as {@link #toString()} except use simple class names.
+	 *
+	 * @param simple Print simple class names only (no package).
+	 * @return A new string.
+	 */
+	public String toString(boolean simple) {
+		return toString(new StringBuilder(), simple).toString();
+	}
+
+	/**
+	 * Appends this object as a readable string to the specified string builder.
+	 *
+	 * @param sb The string builder to append this object to.
+	 * @param simple Print simple class names only (no package).
+	 * @return The same string builder passed in (for method chaining).
+	 */
+	protected StringBuilder toString(StringBuilder sb, boolean simple) {
+		String name = innerClass.getName();
+		if (simple) {
+			int i = name.lastIndexOf('.');
+			name = name.substring(i == -1 ? 0 : i+1).replace('$', '.');
+		}
+		switch(classCategory) {
+			case ARRAY:
+				return elementType.toString(sb, simple).append('[').append(']');
+			case MAP:
+				return sb.append(name).append(keyType.isObject() && valueType.isObject() ? "" : "<"+keyType.toString(simple)+","+valueType.toString(simple)+">");
+			case BEANMAP:
+				return sb.append(BeanMap.class.getName()).append("<").append(name).append(">");
+			case COLLECTION:
+				return sb.append(name).append(elementType.isObject() ? "" : "<"+elementType.toString(simple)+">");
+			case OTHER:
+				if (simple)
+					return sb.append(name);
+				sb.append("OTHER-").append(name).append(",notABeanReason=").append(notABeanReason);
+				if (initException != null)
+					sb.append(",initException=").append(initException);
+				return sb;
+			default:
+				return sb.append(name);
+		}
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified object is an instance of this class.
+	 * This is a simple comparison on the base class itself and not on
+	 * any generic parameters.
+	 *
+	 * @param o The object to check.
+	 * @return <jk>true</jk> if the specified object is an instance of this class.
+	 */
+	public boolean isInstance(Object o) {
+		if (o != null)
+			return ClassUtils.isParentClass(this.innerClass, o.getClass());
+		return false;
+	}
+
+	/**
+	 * Returns a readable name for this class (e.g. <js>"java.lang.String"</js>, <js>"boolean[]"</js>). 
+	 *
+	 * @return The readable name for this class.
+	 */
+	public String getReadableName() {
+		return ClassUtils.getReadableClassName(this.innerClass);
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return super.hashCode();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class
new file mode 100755
index 0000000..44730ed
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class differ


[51/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
Initial Juno contents from IBM JazzHub repo

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/7e4f63e6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/7e4f63e6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/7e4f63e6

Branch: refs/heads/master
Commit: 7e4f63e6d16f15a253a195ecd2588cdca655b29a
Parents: 
Author: jamesbognar <ja...@gmail.com>
Authored: Sun Jul 31 20:02:03 2016 -0400
Committer: jamesbognar <ja...@gmail.com>
Committed: Sun Jul 31 20:02:03 2016 -0400

----------------------------------------------------------------------
 com.ibm.team.juno.client/.classpath             |    10 +
 com.ibm.team.juno.client/.project               |    26 +
 .../.settings/com.ibm.etools.references.prefs   |     4 +
 ...ibm.etools.webtools.packagepreferences.prefs |     3 +
 .../.settings/org.eclipse.core.resources.prefs  |     2 +
 .../.settings/org.eclipse.jdt.apt.core.prefs    |     2 +
 .../.settings/org.eclipse.jdt.core.prefs        |   401 +
 .../.settings/org.eclipse.jdt.ui.prefs          |   120 +
 .../org.eclipse.ltk.core.refactoring.prefs      |     3 +
 .../.settings/org.eclipse.pde.core.prefs        |     3 +
 .../.settings/org.eclipse.pde.prefs             |    15 +
 .../.settings/org.eclipse.wst.common.component  |     5 +
 ...rg.eclipse.wst.common.project.facet.core.xml |    15 +
 .../.settings/org.eclipse.wst.html.core.prefs   |    37 +
 .../.settings/org.eclipse.wst.validation.prefs  |     9 +
 com.ibm.team.juno.client/META-INF/MANIFEST.MF   |    37 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 .../com/ibm/juno/client/AllowAllRedirects.class |   Bin 0 -> 490 bytes
 .../bin/com/ibm/juno/client/DateHeader.class    |   Bin 0 -> 644 bytes
 .../bin/com/ibm/juno/client/HttpMethod.class    |   Bin 0 -> 1596 bytes
 .../com/ibm/juno/client/NameValuePairs.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/client/ResponsePattern.class   |   Bin 0 -> 1633 bytes
 .../bin/com/ibm/juno/client/RestCall$1.class    |   Bin 0 -> 963 bytes
 .../bin/com/ibm/juno/client/RestCall$2.class    |   Bin 0 -> 902 bytes
 .../bin/com/ibm/juno/client/RestCall$3.class    |   Bin 0 -> 998 bytes
 .../bin/com/ibm/juno/client/RestCall.class      |   Bin 0 -> 19376 bytes
 .../com/ibm/juno/client/RestCallException.class |   Bin 0 -> 3803 bytes
 .../ibm/juno/client/RestCallInterceptor.class   |   Bin 0 -> 1183 bytes
 .../com/ibm/juno/client/RestCallLogger.class    |   Bin 0 -> 5015 bytes
 .../bin/com/ibm/juno/client/RestClient$1.class  |   Bin 0 -> 807 bytes
 .../bin/com/ibm/juno/client/RestClient$2.class  |   Bin 0 -> 792 bytes
 .../bin/com/ibm/juno/client/RestClient$3.class  |   Bin 0 -> 2286 bytes
 .../bin/com/ibm/juno/client/RestClient.class    |   Bin 0 -> 38195 bytes
 .../com/ibm/juno/client/RestRequestEntity.class |   Bin 0 -> 3246 bytes
 .../bin/com/ibm/juno/client/RetryOn$1.class     |   Bin 0 -> 533 bytes
 .../bin/com/ibm/juno/client/RetryOn.class       |   Bin 0 -> 408 bytes
 .../ibm/juno/client/SSLOpts$CertValidate.class  |   Bin 0 -> 1170 bytes
 .../ibm/juno/client/SSLOpts$HostVerify.class    |   Bin 0 -> 1156 bytes
 .../bin/com/ibm/juno/client/SSLOpts.class       |   Bin 0 -> 2494 bytes
 .../juno/client/SerializedNameValuePair.class   |   Bin 0 -> 2113 bytes
 .../juno/client/SimpleX509TrustManager.class    |   Bin 0 -> 2136 bytes
 .../client/deprecated/CertificateStore.class    |   Bin 0 -> 4331 bytes
 .../ICertificateValidator$Trust.class           |   Bin 0 -> 1455 bytes
 .../deprecated/ICertificateValidator.class      |   Bin 0 -> 502 bytes
 .../client/deprecated/ITrustStoreProvider.class |   Bin 0 -> 597 bytes
 .../LenientCertificateValidator.class           |   Bin 0 -> 1207 bytes
 .../deprecated/SharedTrustStoreProvider.class   |   Bin 0 -> 3321 bytes
 .../deprecated/ValidatingX509TrustManager.class |   Bin 0 -> 4465 bytes
 .../ibm/juno/client/jazz/JazzRestClient.class   |   Bin 0 -> 13817 bytes
 .../bin/com/ibm/juno/client/jazz/package.html   |   187 +
 .../bin/com/ibm/juno/client/package.html        |   850 ++
 com.ibm.team.juno.client/build.properties       |    17 +
 .../com/ibm/juno/client/AllowAllRedirects.java  |    27 +
 .../src/com/ibm/juno/client/DateHeader.java     |    39 +
 .../src/com/ibm/juno/client/HttpMethod.java     |    60 +
 .../src/com/ibm/juno/client/NameValuePairs.java |    44 +
 .../com/ibm/juno/client/ResponsePattern.java    |   134 +
 .../src/com/ibm/juno/client/RestCall.java       |   944 ++
 .../com/ibm/juno/client/RestCallException.java  |   150 +
 .../ibm/juno/client/RestCallInterceptor.java    |    56 +
 .../src/com/ibm/juno/client/RestCallLogger.java |   116 +
 .../src/com/ibm/juno/client/RestClient.java     |  1411 ++
 .../com/ibm/juno/client/RestRequestEntity.java  |    86 +
 .../src/com/ibm/juno/client/RetryOn.java        |    35 +
 .../src/com/ibm/juno/client/SSLOpts.java        |   185 +
 .../juno/client/SerializedNameValuePair.java    |    79 +
 .../ibm/juno/client/SimpleX509TrustManager.java |    62 +
 .../client/deprecated/CertificateStore.java     |   127 +
 .../deprecated/ICertificateValidator.java       |    46 +
 .../client/deprecated/ITrustStoreProvider.java  |    39 +
 .../deprecated/LenientCertificateValidator.java |    26 +
 .../deprecated/SharedTrustStoreProvider.java    |   104 +
 .../deprecated/ValidatingX509TrustManager.java  |   113 +
 .../ibm/juno/client/jazz/JazzRestClient.java    |   392 +
 .../src/com/ibm/juno/client/jazz/package.html   |   187 +
 .../src/com/ibm/juno/client/package.html        |   850 ++
 .../.classpath                                  |    10 +
 .../.project                                    |    17 +
 .../.settings/org.eclipse.jdt.core.prefs        |    11 +
 .../META-INF/MANIFEST.MF                        |    18 +
 .../sample/HelloWorldResource.class             |   Bin 0 -> 807 bytes
 .../microservice/sample/RootResources.class     |   Bin 0 -> 976 bytes
 .../microservice/sample/nls/Messages.properties |    14 +
 .../microservice.cfg                            |   196 +
 .../project-root/.classpath                     |    16 +
 .../project-root/.project                       |    17 +
 .../project-root/build.properties               |    15 +
 .../project-root/build.xml                      |    50 +
 .../project-root/microservice-project.launch    |    11 +
 .../microservice/sample/HelloWorldResource.java |    29 +
 .../juno/microservice/sample/RootResources.java |    35 +
 .../microservice/sample/nls/Messages.properties |    14 +
 com.ibm.team.juno.microservice/.classpath       |    19 +
 com.ibm.team.juno.microservice/.project         |    17 +
 .../.settings/org.eclipse.jdt.core.prefs        |   305 +
 .../.settings/org.eclipse.jdt.ui.prefs          |    62 +
 com.ibm.team.juno.microservice/Dockerfile       |    16 +
 .../META-INF/MANIFEST.MF                        |     7 +
 com.ibm.team.juno.microservice/bin/.gitignore   |     1 +
 com.ibm.team.juno.microservice/build.properties |    16 +
 .../lib/commons-codec-1.9.jar                   |   Bin 0 -> 263965 bytes
 .../lib/commons-io-1.2.jar                      |   Bin 0 -> 65621 bytes
 .../lib/commons-logging-1.1.1.jar               |   Bin 0 -> 60686 bytes
 .../lib/httpclient-4.5.jar                      |   Bin 0 -> 727567 bytes
 .../lib/httpcore-4.4.1.jar                      |   Bin 0 -> 322234 bytes
 .../lib/httpmime-4.5.jar                        |   Bin 0 -> 40692 bytes
 .../lib/javax.servlet-api-3.0.jar               |   Bin 0 -> 85353 bytes
 .../lib/jetty-all-8.1.0.jar                     |   Bin 0 -> 1774672 bytes
 .../lib/org.apache.commons.fileupload_1.3.1.jar |   Bin 0 -> 69002 bytes
 .../com/ibm/juno/microservice/Microservice.java |   521 +
 .../src/com/ibm/juno/microservice/Resource.java |    67 +
 .../ibm/juno/microservice/ResourceGroup.java    |    66 +
 .../com/ibm/juno/microservice/ResourceJena.java |    28 +
 .../ibm/juno/microservice/RestMicroservice.java |   554 +
 .../ibm/juno/microservice/doc-files/build1.png  |   Bin 0 -> 2633 bytes
 .../ibm/juno/microservice/doc-files/build2.png  |   Bin 0 -> 8634 bytes
 .../juno/microservice/doc-files/helloworld1.png |   Bin 0 -> 14050 bytes
 .../microservice/doc-files/instructions1.png    |   Bin 0 -> 44658 bytes
 .../microservice/doc-files/instructions2.png    |   Bin 0 -> 54971 bytes
 .../microservice/doc-files/instructions3.png    |   Bin 0 -> 20755 bytes
 .../microservice/doc-files/instructions4.png    |   Bin 0 -> 28672 bytes
 .../microservice/doc-files/instructions5.png    |   Bin 0 -> 8894 bytes
 .../microservice/doc-files/instructions6.png    |   Bin 0 -> 22345 bytes
 .../juno/microservice/doc-files/manifest1.png   |   Bin 0 -> 10493 bytes
 .../src/com/ibm/juno/microservice/javadoc.css   |  1039 ++
 .../src/com/ibm/juno/microservice/package.html  |   942 ++
 .../juno/microservice/resources/ConfigEdit.html |    32 +
 .../microservice/resources/ConfigResource.java  |   184 +
 .../resources/DirectoryResource.java            |   354 +
 .../resources/LogEntryFormatter.java            |   257 +
 .../juno/microservice/resources/LogParser.java  |   225 +
 .../microservice/resources/LogsResource.java    |   299 +
 .../resources/SampleRootResource.java           |    27 +
 .../resources/ShutdownResource.java             |    49 +
 .../juno/microservice/resources/package.html    |    24 +
 com.ibm.team.juno.releng/.classpath             |    24 +
 com.ibm.team.juno.releng/.jazzignore            |    37 +
 com.ibm.team.juno.releng/.project               |    28 +
 .../.settings/org.eclipse.jdt.core.prefs        |    25 +
 ...sification+Guidance+&+Questionnaire [v1].doc |   Bin 0 -> 47104 bytes
 com.ibm.team.juno.releng/META-INF/MANIFEST.MF   |    40 +
 com.ibm.team.juno.releng/Readme.txt             |    33 +
 .../bin/all/META-INF/MANIFEST.MF                |    10 +
 .../bin/client/META-INF/MANIFEST.MF             |    24 +
 .../com/ibm/juno/client/AllowAllRedirects.class |   Bin 0 -> 490 bytes
 .../com/ibm/juno/client/AllowAllRedirects.java  |    27 +
 .../client/com/ibm/juno/client/DateHeader.class |   Bin 0 -> 644 bytes
 .../client/com/ibm/juno/client/DateHeader.java  |    39 +
 .../client/com/ibm/juno/client/HttpMethod.class |   Bin 0 -> 1540 bytes
 .../client/com/ibm/juno/client/HttpMethod.java  |    60 +
 .../com/ibm/juno/client/NameValuePairs.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/client/NameValuePairs.java     |    44 +
 .../com/ibm/juno/client/ResponsePattern.class   |   Bin 0 -> 1630 bytes
 .../com/ibm/juno/client/ResponsePattern.java    |   134 +
 .../client/com/ibm/juno/client/RestCall$1.class |   Bin 0 -> 953 bytes
 .../client/com/ibm/juno/client/RestCall$2.class |   Bin 0 -> 892 bytes
 .../client/com/ibm/juno/client/RestCall$3.class |   Bin 0 -> 997 bytes
 .../client/com/ibm/juno/client/RestCall.class   |   Bin 0 -> 19414 bytes
 .../client/com/ibm/juno/client/RestCall.java    |   942 ++
 .../com/ibm/juno/client/RestCallException.class |   Bin 0 -> 3834 bytes
 .../com/ibm/juno/client/RestCallException.java  |   150 +
 .../ibm/juno/client/RestCallInterceptor.class   |   Bin 0 -> 1183 bytes
 .../ibm/juno/client/RestCallInterceptor.java    |    56 +
 .../com/ibm/juno/client/RestCallLogger.class    |   Bin 0 -> 5066 bytes
 .../com/ibm/juno/client/RestCallLogger.java     |   116 +
 .../com/ibm/juno/client/RestClient$1.class      |   Bin 0 -> 806 bytes
 .../com/ibm/juno/client/RestClient$2.class      |   Bin 0 -> 791 bytes
 .../com/ibm/juno/client/RestClient$3.class      |   Bin 0 -> 2212 bytes
 .../com/ibm/juno/client/RestClient$4.class      |   Bin 0 -> 854 bytes
 .../client/com/ibm/juno/client/RestClient.class |   Bin 0 -> 37176 bytes
 .../client/com/ibm/juno/client/RestClient.java  |  1378 ++
 .../com/ibm/juno/client/RestRequestEntity.class |   Bin 0 -> 3266 bytes
 .../com/ibm/juno/client/RestRequestEntity.java  |    86 +
 .../client/com/ibm/juno/client/RetryOn$1.class  |   Bin 0 -> 537 bytes
 .../client/com/ibm/juno/client/RetryOn.class    |   Bin 0 -> 378 bytes
 .../bin/client/com/ibm/juno/client/RetryOn.java |    35 +
 .../ibm/juno/client/SSLOpts$CertValidate.class  |   Bin 0 -> 1140 bytes
 .../ibm/juno/client/SSLOpts$HostVerify.class    |   Bin 0 -> 1126 bytes
 .../client/com/ibm/juno/client/SSLOpts.class    |   Bin 0 -> 2495 bytes
 .../bin/client/com/ibm/juno/client/SSLOpts.java |   185 +
 .../juno/client/SerializedNameValuePair.class   |   Bin 0 -> 2108 bytes
 .../juno/client/SerializedNameValuePair.java    |    79 +
 .../juno/client/SimpleX509TrustManager.class    |   Bin 0 -> 2192 bytes
 .../ibm/juno/client/SimpleX509TrustManager.java |    62 +
 .../client/deprecated/CertificateStore.class    |   Bin 0 -> 4356 bytes
 .../client/deprecated/CertificateStore.java     |   127 +
 .../ICertificateValidator$Trust.class           |   Bin 0 -> 1417 bytes
 .../deprecated/ICertificateValidator.class      |   Bin 0 -> 502 bytes
 .../deprecated/ICertificateValidator.java       |    46 +
 .../client/deprecated/ITrustStoreProvider.class |   Bin 0 -> 597 bytes
 .../client/deprecated/ITrustStoreProvider.java  |    39 +
 .../LenientCertificateValidator.class           |   Bin 0 -> 1199 bytes
 .../deprecated/LenientCertificateValidator.java |    26 +
 .../deprecated/SharedTrustStoreProvider.class   |   Bin 0 -> 3252 bytes
 .../deprecated/SharedTrustStoreProvider.java    |   104 +
 .../ValidatingX509TrustManager$1.class          |   Bin 0 -> 1169 bytes
 .../deprecated/ValidatingX509TrustManager.class |   Bin 0 -> 4301 bytes
 .../deprecated/ValidatingX509TrustManager.java  |   113 +
 .../ibm/juno/client/jazz/JazzRestClient.class   |   Bin 0 -> 13513 bytes
 .../ibm/juno/client/jazz/JazzRestClient.java    |   390 +
 .../com/ibm/juno/client/jazz/package.html       |   187 +
 .../bin/client/com/ibm/juno/client/package.html |   850 ++
 .../bin/core.test/META-INF/MANIFEST.MF          |    18 +
 .../com/ibm/juno/core/test/AllTests.class       |   Bin 0 -> 5617 bytes
 .../ibm/juno/core/test/CT_Annotations$A.class   |   Bin 0 -> 492 bytes
 .../juno/core/test/CT_Annotations$Person1.class |   Bin 0 -> 783 bytes
 .../com/ibm/juno/core/test/CT_Annotations.class |   Bin 0 -> 1932 bytes
 .../ibm/juno/core/test/CT_BeanContext$1.class   |   Bin 0 -> 822 bytes
 .../ibm/juno/core/test/CT_BeanContext$A.class   |   Bin 0 -> 332 bytes
 .../core/test/CT_BeanContext$AHandler.class     |   Bin 0 -> 1585 bytes
 .../juno/core/test/CT_BeanContext$Address.class |   Bin 0 -> 2136 bytes
 .../test/CT_BeanContext$AddressablePerson.class |   Bin 0 -> 1229 bytes
 .../ibm/juno/core/test/CT_BeanContext$B.class   |   Bin 0 -> 625 bytes
 .../ibm/juno/core/test/CT_BeanContext$B2.class  |   Bin 0 -> 832 bytes
 .../ibm/juno/core/test/CT_BeanContext$C.class   |   Bin 0 -> 395 bytes
 .../ibm/juno/core/test/CT_BeanContext$C1.class  |   Bin 0 -> 534 bytes
 .../ibm/juno/core/test/CT_BeanContext$D.class   |   Bin 0 -> 1161 bytes
 .../test/CT_BeanContext$DummyBeanFilterA.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyBeanFilterB.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyBeanFilterC.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyPojoFilterA.class  |   Bin 0 -> 648 bytes
 .../test/CT_BeanContext$DummyPojoFilterB.class  |   Bin 0 -> 648 bytes
 .../test/CT_BeanContext$DummyPojoFilterC.class  |   Bin 0 -> 648 bytes
 .../juno/core/test/CT_BeanContext$Person.class  |   Bin 0 -> 1196 bytes
 .../test/CT_BeanContext$ReadOnlyPerson.class    |   Bin 0 -> 1145 bytes
 .../core/test/CT_BeanContext$TestEnum.class     |   Bin 0 -> 1233 bytes
 .../com/ibm/juno/core/test/CT_BeanContext.class |   Bin 0 -> 18552 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A.class    |   Bin 0 -> 978 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A1.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A2.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B.class    |   Bin 0 -> 867 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B1.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B2.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$C1.class   |   Bin 0 -> 451 bytes
 .../ibm/juno/core/test/CT_BeanFilter$C2.class   |   Bin 0 -> 487 bytes
 .../ibm/juno/core/test/CT_BeanFilter$D1.class   |   Bin 0 -> 568 bytes
 .../ibm/juno/core/test/CT_BeanFilter$D2.class   |   Bin 0 -> 599 bytes
 .../com/ibm/juno/core/test/CT_BeanFilter.class  |   Bin 0 -> 3432 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$A.class   |   Bin 0 -> 683 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$B.class   |   Bin 0 -> 2947 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$C.class   |   Bin 0 -> 1264 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D.class   |   Bin 0 -> 4545 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D1.class  |   Bin 0 -> 771 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D2.class  |   Bin 0 -> 448 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$E.class   |   Bin 0 -> 485 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$F.class   |   Bin 0 -> 543 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$G.class   |   Bin 0 -> 428 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$G1.class  |   Bin 0 -> 1979 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$H.class   |   Bin 0 -> 778 bytes
 .../ibm/juno/core/test/CT_BeanMap$HEnum.class   |   Bin 0 -> 1176 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$I.class   |   Bin 0 -> 997 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$J.class   |   Bin 0 -> 1271 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$K.class   |   Bin 0 -> 1250 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L.class   |   Bin 0 -> 490 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L1.class  |   Bin 0 -> 526 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L2.class  |   Bin 0 -> 599 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M1.class  |   Bin 0 -> 581 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M2.class  |   Bin 0 -> 616 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M3.class  |   Bin 0 -> 534 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M4.class  |   Bin 0 -> 687 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M5.class  |   Bin 0 -> 592 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N1.class  |   Bin 0 -> 868 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N2.class  |   Bin 0 -> 622 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N3.class  |   Bin 0 -> 540 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N4.class  |   Bin 0 -> 693 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N5.class  |   Bin 0 -> 622 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$O.class   |   Bin 0 -> 397 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$P1.class  |   Bin 0 -> 581 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$P2.class  |   Bin 0 -> 921 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Q1.class  |   Bin 0 -> 382 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Q2.class  |   Bin 0 -> 1068 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$R1.class  |   Bin 0 -> 399 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$R2.class  |   Bin 0 -> 432 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$S.class   |   Bin 0 -> 488 bytes
 .../ibm/juno/core/test/CT_BeanMap$TEnum.class   |   Bin 0 -> 1176 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$U.class   |   Bin 0 -> 1222 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V.class   |   Bin 0 -> 476 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V2.class  |   Bin 0 -> 510 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V3.class  |   Bin 0 -> 700 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W.class   |   Bin 0 -> 550 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W2.class  |   Bin 0 -> 584 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W3.class  |   Bin 0 -> 774 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$X1.class  |   Bin 0 -> 814 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$X2.class  |   Bin 0 -> 1002 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Y.class   |   Bin 0 -> 526 bytes
 .../com/ibm/juno/core/test/CT_BeanMap.class     |   Bin 0 -> 33970 bytes
 .../com/ibm/juno/core/test/CT_ClassMeta$G.class |   Bin 0 -> 583 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HC1.class   |   Bin 0 -> 569 bytes
 .../juno/core/test/CT_ClassMeta$HC1Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HC2.class   |   Bin 0 -> 601 bytes
 .../juno/core/test/CT_ClassMeta$HC2Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HI1.class   |   Bin 0 -> 210 bytes
 .../juno/core/test/CT_ClassMeta$HI1Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HI2.class   |   Bin 0 -> 271 bytes
 .../juno/core/test/CT_ClassMeta$HI2Filter.class |   Bin 0 -> 607 bytes
 .../com/ibm/juno/core/test/CT_ClassMeta.class   |   Bin 0 -> 6861 bytes
 .../test/CT_DataConversionTest$NotABean.class   |   Bin 0 -> 758 bytes
 .../test/CT_DataConversionTest$TestEnum.class   |   Bin 0 -> 1289 bytes
 .../juno/core/test/CT_DataConversionTest.class  |   Bin 0 -> 4573 bytes
 .../juno/core/test/CT_IgnoredClasses$A.class    |   Bin 0 -> 581 bytes
 .../ibm/juno/core/test/CT_IgnoredClasses.class  |   Bin 0 -> 2230 bytes
 .../com/ibm/juno/core/test/CT_JacocoDummy.class |   Bin 0 -> 2576 bytes
 .../juno/core/test/CT_ObjectList$Person.class   |   Bin 0 -> 460 bytes
 .../com/ibm/juno/core/test/CT_ObjectList.class  |   Bin 0 -> 2428 bytes
 .../com/ibm/juno/core/test/CT_ObjectMap.class   |   Bin 0 -> 13257 bytes
 .../CT_ParserGenerics$TestCollection1.class     |   Bin 0 -> 625 bytes
 .../CT_ParserGenerics$TestCollection2.class     |   Bin 0 -> 625 bytes
 .../core/test/CT_ParserGenerics$TestMap1.class  |   Bin 0 -> 560 bytes
 .../core/test/CT_ParserGenerics$TestMap2.class  |   Bin 0 -> 546 bytes
 .../ibm/juno/core/test/CT_ParserGenerics.class  |   Bin 0 -> 2608 bytes
 .../ibm/juno/core/test/CT_ParserReader.class    |   Bin 0 -> 4281 bytes
 .../core/test/CT_PropertyNamerDashedLC.class    |   Bin 0 -> 1118 bytes
 .../ibm/juno/core/test/CT_Visibility$A.class    |   Bin 0 -> 560 bytes
 .../com/ibm/juno/core/test/CT_Visibility.class  |   Bin 0 -> 5163 bytes
 .../com/ibm/juno/core/test/TestUtils$1.class    |   Bin 0 -> 2177 bytes
 .../com/ibm/juno/core/test/TestUtils.class      |   Bin 0 -> 12059 bytes
 .../ibm/juno/core/test/XmlValidatorParser.class |   Bin 0 -> 5295 bytes
 .../com/ibm/juno/core/test/a/A1$1.class         |   Bin 0 -> 207 bytes
 .../com/ibm/juno/core/test/a/A1$A2.class        |   Bin 0 -> 1818 bytes
 .../com/ibm/juno/core/test/a/A1$A3.class        |   Bin 0 -> 1818 bytes
 .../com/ibm/juno/core/test/a/A1$A4.class        |   Bin 0 -> 1823 bytes
 .../com/ibm/juno/core/test/a/A1$A5.class        |   Bin 0 -> 2016 bytes
 .../core.test/com/ibm/juno/core/test/a/A1.class |   Bin 0 -> 3121 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$A.class |   Bin 0 -> 855 bytes
 .../rttests/CT_RoundTripAddClassAttrs$AA.class  |   Bin 0 -> 554 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$B.class |   Bin 0 -> 1187 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$C.class |   Bin 0 -> 1355 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$D.class |   Bin 0 -> 1316 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$E.class |   Bin 0 -> 1658 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$F.class |   Bin 0 -> 1670 bytes
 .../rttests/CT_RoundTripAddClassAttrs$IA.class  |   Bin 0 -> 346 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs.class   |   Bin 0 -> 10298 bytes
 .../CT_RoundTripBeanInheritance$A1.class        |   Bin 0 -> 1574 bytes
 .../CT_RoundTripBeanInheritance$A2.class        |   Bin 0 -> 1002 bytes
 .../CT_RoundTripBeanInheritance$A3.class        |   Bin 0 -> 1077 bytes
 .../CT_RoundTripBeanInheritance$B1.class        |   Bin 0 -> 1772 bytes
 .../CT_RoundTripBeanInheritance$B2.class        |   Bin 0 -> 1447 bytes
 .../a/rttests/CT_RoundTripBeanInheritance.class |   Bin 0 -> 3295 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$1.class |   Bin 0 -> 993 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$2.class |   Bin 0 -> 1055 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$A.class |   Bin 0 -> 1131 bytes
 .../a/rttests/CT_RoundTripBeanMaps$ABean.class  |   Bin 0 -> 623 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$B.class |   Bin 0 -> 1143 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B1.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B2.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B3.class     |   Bin 0 -> 1069 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA.class     |   Bin 0 -> 1001 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA1.class    |   Bin 0 -> 814 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA2.class    |   Bin 0 -> 542 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$C.class |   Bin 0 -> 483 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C1.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C2.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C3.class     |   Bin 0 -> 1069 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA.class     |   Bin 0 -> 519 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA1.class    |   Bin 0 -> 814 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA2.class    |   Bin 0 -> 542 bytes
 .../rttests/CT_RoundTripBeanMaps$CAFilter.class |   Bin 0 -> 1091 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CBean.class  |   Bin 0 -> 783 bytes
 .../rttests/CT_RoundTripBeanMaps$CFilter.class  |   Bin 0 -> 1173 bytes
 .../a/rttests/CT_RoundTripBeanMaps$D1.class     |   Bin 0 -> 811 bytes
 .../a/rttests/CT_RoundTripBeanMaps$D2.class     |   Bin 0 -> 709 bytes
 .../rttests/CT_RoundTripBeanMaps$D2Filter.class |   Bin 0 -> 836 bytes
 .../a/rttests/CT_RoundTripBeanMaps$E1.class     |   Bin 0 -> 815 bytes
 .../a/rttests/CT_RoundTripBeanMaps$E2.class     |   Bin 0 -> 709 bytes
 .../rttests/CT_RoundTripBeanMaps$E2Filter.class |   Bin 0 -> 830 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FA1.class    |   Bin 0 -> 589 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FA2.class    |   Bin 0 -> 724 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FB1.class    |   Bin 0 -> 489 bytes
 .../CT_RoundTripBeanMaps$FB1Filter.class        |   Bin 0 -> 795 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FB2.class    |   Bin 0 -> 724 bytes
 .../CT_RoundTripBeanMaps$FB2Filter.class        |   Bin 0 -> 872 bytes
 .../rttests/CT_RoundTripBeanMaps$G$G1$G2.class  |   Bin 0 -> 790 bytes
 .../a/rttests/CT_RoundTripBeanMaps$G$G1.class   |   Bin 0 -> 966 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$G.class |   Bin 0 -> 1109 bytes
 .../rttests/CT_RoundTripBeanMaps$H$H1$H2.class  |   Bin 0 -> 790 bytes
 .../a/rttests/CT_RoundTripBeanMaps$H$H1.class   |   Bin 0 -> 966 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$H.class |   Bin 0 -> 1520 bytes
 .../rttests/CT_RoundTripBeanMaps$I$I1$I2.class  |   Bin 0 -> 786 bytes
 .../a/rttests/CT_RoundTripBeanMaps$I$I1.class   |   Bin 0 -> 962 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$I.class |   Bin 0 -> 1380 bytes
 .../a/rttests/CT_RoundTripBeanMaps$IBean.class  |   Bin 0 -> 337 bytes
 .../a/rttests/CT_RoundTripBeanMaps$J$J2.class   |   Bin 0 -> 1014 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$J.class |   Bin 0 -> 964 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$K.class |   Bin 0 -> 2392 bytes
 .../a/rttests/CT_RoundTripBeanMaps$KEnum.class  |   Bin 0 -> 1320 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$L.class |   Bin 0 -> 743 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$M.class |   Bin 0 -> 1172 bytes
 .../a/rttests/CT_RoundTripBeanMaps$N$N2.class   |   Bin 0 -> 911 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$N.class |   Bin 0 -> 758 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps.class   |   Bin 0 -> 18595 bytes
 .../core/test/a/rttests/CT_RoundTripDTOs.class  |   Bin 0 -> 1495 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$1.class   |   Bin 0 -> 1057 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$2.class   |   Bin 0 -> 1057 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$3.class   |   Bin 0 -> 1053 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$4.class   |   Bin 0 -> 1053 bytes
 .../test/a/rttests/CT_RoundTripEnum$A.class     |   Bin 0 -> 3187 bytes
 .../test/a/rttests/CT_RoundTripEnum$AEnum.class |   Bin 0 -> 1292 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$1.class   |   Bin 0 -> 1057 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$2.class   |   Bin 0 -> 1057 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$3.class   |   Bin 0 -> 1053 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$4.class   |   Bin 0 -> 1053 bytes
 .../test/a/rttests/CT_RoundTripEnum$B.class     |   Bin 0 -> 3187 bytes
 .../test/a/rttests/CT_RoundTripEnum$BEnum.class |   Bin 0 -> 1763 bytes
 .../core/test/a/rttests/CT_RoundTripEnum.class  |   Bin 0 -> 4324 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$1.class |   Bin 0 -> 960 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$2.class |   Bin 0 -> 1054 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$3.class |   Bin 0 -> 1028 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$4.class |   Bin 0 -> 1028 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$5.class |   Bin 0 -> 990 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$6.class |   Bin 0 -> 1073 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A.class   |   Bin 0 -> 2293 bytes
 .../a/rttests/CT_RoundTripFilterBeans$B.class   |   Bin 0 -> 745 bytes
 .../CT_RoundTripFilterBeans$BFilter.class       |   Bin 0 -> 1962 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C1.class  |   Bin 0 -> 817 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C2.class  |   Bin 0 -> 1122 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C3.class  |   Bin 0 -> 1487 bytes
 .../rttests/CT_RoundTripFilterBeans$CDTO.class  |   Bin 0 -> 521 bytes
 .../a/rttests/CT_RoundTripFilterBeans$D1.class  |   Bin 0 -> 676 bytes
 .../a/rttests/CT_RoundTripFilterBeans$D2.class  |   Bin 0 -> 1067 bytes
 .../a/rttests/CT_RoundTripFilterBeans.class     |   Bin 0 -> 7825 bytes
 .../a/rttests/CT_RoundTripGenerics$Pair.class   |   Bin 0 -> 1450 bytes
 .../rttests/CT_RoundTripGenerics$RealPair.class |   Bin 0 -> 902 bytes
 .../a/rttests/CT_RoundTripGenerics$Source.class |   Bin 0 -> 658 bytes
 .../a/rttests/CT_RoundTripGenerics$Target.class |   Bin 0 -> 658 bytes
 .../test/a/rttests/CT_RoundTripGenerics.class   |   Bin 0 -> 2318 bytes
 .../a/rttests/CT_RoundTripLargeObjects$A.class  |   Bin 0 -> 1588 bytes
 .../a/rttests/CT_RoundTripLargeObjects$A1.class |   Bin 0 -> 628 bytes
 .../CT_RoundTripLargeObjects$A1List.class       |   Bin 0 -> 672 bytes
 .../CT_RoundTripLargeObjects$A1Map.class        |   Bin 0 -> 693 bytes
 .../a/rttests/CT_RoundTripLargeObjects.class    |   Bin 0 -> 5949 bytes
 .../a/rttests/CT_RoundTripMaps$TestEnum.class   |   Bin 0 -> 1313 bytes
 .../core/test/a/rttests/CT_RoundTripMaps.class  |   Bin 0 -> 7150 bytes
 .../CT_RoundTripObjectsAsStrings$A.class        |   Bin 0 -> 1526 bytes
 .../CT_RoundTripObjectsAsStrings$A1.class       |   Bin 0 -> 1036 bytes
 .../CT_RoundTripObjectsAsStrings$A2.class       |   Bin 0 -> 1033 bytes
 .../CT_RoundTripObjectsAsStrings$A3.class       |   Bin 0 -> 1031 bytes
 .../CT_RoundTripObjectsAsStrings$A4.class       |   Bin 0 -> 1037 bytes
 .../CT_RoundTripObjectsAsStrings$B.class        |   Bin 0 -> 1018 bytes
 .../CT_RoundTripObjectsAsStrings$B1.class       |   Bin 0 -> 1457 bytes
 .../CT_RoundTripObjectsAsStrings$B2.class       |   Bin 0 -> 1920 bytes
 .../CT_RoundTripObjectsAsStrings$C.class        |   Bin 0 -> 1526 bytes
 .../CT_RoundTripObjectsAsStrings$C1.class       |   Bin 0 -> 1530 bytes
 .../CT_RoundTripObjectsAsStrings$C2.class       |   Bin 0 -> 1279 bytes
 .../CT_RoundTripObjectsAsStrings$C3.class       |   Bin 0 -> 1375 bytes
 .../CT_RoundTripObjectsAsStrings$C4.class       |   Bin 0 -> 1031 bytes
 .../rttests/CT_RoundTripObjectsAsStrings.class  |   Bin 0 -> 3563 bytes
 ...T_RoundTripObjectsWithSpecialMethods$A.class |   Bin 0 -> 1317 bytes
 ..._RoundTripObjectsWithSpecialMethods$A2.class |   Bin 0 -> 943 bytes
 ...T_RoundTripObjectsWithSpecialMethods$B.class |   Bin 0 -> 1003 bytes
 ..._RoundTripObjectsWithSpecialMethods$B2.class |   Bin 0 -> 1151 bytes
 .../CT_RoundTripObjectsWithSpecialMethods.class |   Bin 0 -> 2666 bytes
 .../CT_RoundTripPrimitiveObjectBeans.class      |   Bin 0 -> 7644 bytes
 .../rttests/CT_RoundTripPrimitivesBeans$1.class |   Bin 0 -> 1127 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$1.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$2.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$3.class |   Bin 0 -> 1047 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$4.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$5.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$6.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$7.class |   Bin 0 -> 1046 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$8.class |   Bin 0 -> 1046 bytes
 ...oundTripPrimitivesBeans$PrimitivesBean.class |   Bin 0 -> 4229 bytes
 .../a/rttests/CT_RoundTripPrimitivesBeans.class |   Bin 0 -> 6247 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans$A.class |   Bin 0 -> 1381 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans$B.class |   Bin 0 -> 1101 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans.class   |   Bin 0 -> 1891 bytes
 .../a/rttests/CT_RoundTripSimpleObjects.class   |   Bin 0 -> 14990 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$1.class  |   Bin 0 -> 1116 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$2.class  |   Bin 0 -> 1186 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$A.class  |   Bin 0 -> 1441 bytes
 .../a/rttests/CT_RoundTripToObjectMaps.class    |   Bin 0 -> 3110 bytes
 .../test/a/rttests/RoundTripTest$Flags.class    |   Bin 0 -> 658 bytes
 .../core/test/a/rttests/RoundTripTest.class     |   Bin 0 -> 13365 bytes
 .../com/ibm/juno/core/test/csv/CT_Csv$A.class   |   Bin 0 -> 511 bytes
 .../com/ibm/juno/core/test/csv/CT_Csv.class     |   Bin 0 -> 1283 bytes
 .../ibm/juno/core/test/dto/atom/CT_Atom.class   |   Bin 0 -> 5585 bytes
 .../com/ibm/juno/core/test/dto/atom/test1.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test2.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test3.xml   |    46 +
 .../test/dto/cognos/CT_CognosXml$Item.class     |   Bin 0 -> 841 bytes
 .../core/test/dto/cognos/CT_CognosXml.class     |   Bin 0 -> 3825 bytes
 .../test/dto/jsonschema/CT_JsonSchema.class     |   Bin 0 -> 5202 bytes
 .../juno/core/test/dto/jsonschema/test1.json    |    77 +
 .../juno/core/test/dto/jsonschema/test2.json    |    20 +
 .../core/test/filters/CT_BeanFilter$A1.class    |   Bin 0 -> 266 bytes
 .../core/test/filters/CT_BeanFilter$A2.class    |   Bin 0 -> 334 bytes
 .../core/test/filters/CT_BeanFilter$A3.class    |   Bin 0 -> 734 bytes
 .../core/test/filters/CT_BeanFilter$B1.class    |   Bin 0 -> 457 bytes
 .../core/test/filters/CT_BeanFilter$B2.class    |   Bin 0 -> 517 bytes
 .../core/test/filters/CT_BeanFilter$C1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$C2.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$C3.class    |   Bin 0 -> 845 bytes
 .../core/test/filters/CT_BeanFilter$D1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$D2.class    |   Bin 0 -> 793 bytes
 .../core/test/filters/CT_BeanFilter$D3.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$E1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$E2.class    |   Bin 0 -> 793 bytes
 .../core/test/filters/CT_BeanFilter$E3.class    |   Bin 0 -> 810 bytes
 .../core/test/filters/CT_BeanFilter$F1.class    |   Bin 0 -> 754 bytes
 .../core/test/filters/CT_BeanFilter$F2.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$F3.class    |   Bin 0 -> 845 bytes
 .../core/test/filters/CT_BeanFilter$Test2.class |   Bin 0 -> 719 bytes
 .../juno/core/test/filters/CT_BeanFilter.class  |   Bin 0 -> 4139 bytes
 .../juno/core/test/filters/CT_BeanMap$A.class   |   Bin 0 -> 486 bytes
 .../juno/core/test/filters/CT_BeanMap$B.class   |   Bin 0 -> 906 bytes
 .../juno/core/test/filters/CT_BeanMap$B1.class  |   Bin 0 -> 440 bytes
 .../core/test/filters/CT_BeanMap$B1Filter.class |   Bin 0 -> 1283 bytes
 .../juno/core/test/filters/CT_BeanMap$B2.class  |   Bin 0 -> 481 bytes
 .../core/test/filters/CT_BeanMap$B2Filter.class |   Bin 0 -> 1283 bytes
 .../ibm/juno/core/test/filters/CT_BeanMap.class |   Bin 0 -> 2694 bytes
 .../filters/CT_ByteArrayBase64Filter$1.class    |   Bin 0 -> 822 bytes
 .../filters/CT_ByteArrayBase64Filter$2.class    |   Bin 0 -> 945 bytes
 .../filters/CT_ByteArrayBase64Filter$A$1.class  |   Bin 0 -> 954 bytes
 .../filters/CT_ByteArrayBase64Filter$A$2.class  |   Bin 0 -> 1038 bytes
 .../filters/CT_ByteArrayBase64Filter$A$3.class  |   Bin 0 -> 1135 bytes
 .../filters/CT_ByteArrayBase64Filter$A$4.class  |   Bin 0 -> 1238 bytes
 .../filters/CT_ByteArrayBase64Filter$A.class    |   Bin 0 -> 1695 bytes
 .../filters/CT_ByteArrayBase64Filter$B$1.class  |   Bin 0 -> 954 bytes
 .../filters/CT_ByteArrayBase64Filter$B$2.class  |   Bin 0 -> 1038 bytes
 .../filters/CT_ByteArrayBase64Filter$B.class    |   Bin 0 -> 1191 bytes
 .../test/filters/CT_ByteArrayBase64Filter.class |   Bin 0 -> 4507 bytes
 .../core/test/filters/CT_CalendarFilter$A.class |   Bin 0 -> 1478 bytes
 .../core/test/filters/CT_CalendarFilter.class   |   Bin 0 -> 20536 bytes
 .../core/test/filters/CT_DateFilter$A.class     |   Bin 0 -> 621 bytes
 .../juno/core/test/filters/CT_DateFilter.class  |   Bin 0 -> 5585 bytes
 .../test/filters/CT_EnumerationFilter.class     |   Bin 0 -> 1639 bytes
 .../core/test/filters/CT_IteratorFilter.class   |   Bin 0 -> 1639 bytes
 .../core/test/filters/CT_ReaderFilter.class     |   Bin 0 -> 1906 bytes
 .../ibm/juno/core/test/html/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/html/CT_Common$B$1.class |   Bin 0 -> 866 bytes
 .../ibm/juno/core/test/html/CT_Common$B.class   |   Bin 0 -> 881 bytes
 .../ibm/juno/core/test/html/CT_Common$C$1.class |   Bin 0 -> 797 bytes
 .../ibm/juno/core/test/html/CT_Common$C.class   |   Bin 0 -> 860 bytes
 .../ibm/juno/core/test/html/CT_Common$D.class   |   Bin 0 -> 762 bytes
 .../juno/core/test/html/CT_Common$E1$1.class    |   Bin 0 -> 890 bytes
 .../juno/core/test/html/CT_Common$E1$2.class    |   Bin 0 -> 824 bytes
 .../juno/core/test/html/CT_Common$E1$3.class    |   Bin 0 -> 976 bytes
 .../ibm/juno/core/test/html/CT_Common$E1.class  |   Bin 0 -> 1744 bytes
 .../ibm/juno/core/test/html/CT_Common$E2.class  |   Bin 0 -> 461 bytes
 .../ibm/juno/core/test/html/CT_Common$F.class   |   Bin 0 -> 703 bytes
 .../ibm/juno/core/test/html/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/html/CT_Common$J.class   |   Bin 0 -> 1356 bytes
 .../ibm/juno/core/test/html/CT_Common$R1.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/html/CT_Common$R2.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/html/CT_Common$R3.class  |   Bin 0 -> 575 bytes
 .../com/ibm/juno/core/test/html/CT_Common.class |   Bin 0 -> 14435 bytes
 .../juno/core/test/html/CT_CommonParser$1.class |   Bin 0 -> 1472 bytes
 .../core/test/html/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/html/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/html/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/html/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/html/CT_CommonParser$C.class |   Bin 0 -> 1100 bytes
 .../juno/core/test/html/CT_CommonParser.class   |   Bin 0 -> 7309 bytes
 .../ibm/juno/core/test/html/CT_Html$A1.class    |   Bin 0 -> 442 bytes
 .../ibm/juno/core/test/html/CT_Html$A2.class    |   Bin 0 -> 442 bytes
 .../ibm/juno/core/test/html/CT_Html$A3.class    |   Bin 0 -> 577 bytes
 .../ibm/juno/core/test/html/CT_Html$A4.class    |   Bin 0 -> 653 bytes
 .../juno/core/test/html/CT_Html$A4Filter.class  |   Bin 0 -> 1136 bytes
 .../ibm/juno/core/test/html/CT_Html$A5.class    |   Bin 0 -> 653 bytes
 .../juno/core/test/html/CT_Html$A5Filter.class  |   Bin 0 -> 1184 bytes
 .../ibm/juno/core/test/html/CT_Html$B1.class    |   Bin 0 -> 661 bytes
 .../ibm/juno/core/test/html/CT_Html$B2.class    |   Bin 0 -> 556 bytes
 .../ibm/juno/core/test/html/CT_Html$C1.class    |   Bin 0 -> 550 bytes
 .../ibm/juno/core/test/html/CT_Html$C2.class    |   Bin 0 -> 550 bytes
 .../com/ibm/juno/core/test/html/CT_Html.class   |   Bin 0 -> 5328 bytes
 .../juno/core/test/ini/CT_ConfigFile$1.class    |   Bin 0 -> 2117 bytes
 .../juno/core/test/ini/CT_ConfigFile$2.class    |   Bin 0 -> 792 bytes
 .../juno/core/test/ini/CT_ConfigFile$3.class    |   Bin 0 -> 797 bytes
 .../juno/core/test/ini/CT_ConfigFile$4.class    |   Bin 0 -> 797 bytes
 .../juno/core/test/ini/CT_ConfigFile$5.class    |   Bin 0 -> 1348 bytes
 .../juno/core/test/ini/CT_ConfigFile$6.class    |   Bin 0 -> 1333 bytes
 .../juno/core/test/ini/CT_ConfigFile$7.class    |   Bin 0 -> 1351 bytes
 .../juno/core/test/ini/CT_ConfigFile$8.class    |   Bin 0 -> 1332 bytes
 .../juno/core/test/ini/CT_ConfigFile$9.class    |   Bin 0 -> 1334 bytes
 .../juno/core/test/ini/CT_ConfigFile$A.class    |   Bin 0 -> 605 bytes
 .../juno/core/test/ini/CT_ConfigFile$B.class    |   Bin 0 -> 1512 bytes
 .../ibm/juno/core/test/ini/CT_ConfigFile.class  |   Bin 0 -> 42958 bytes
 .../ibm/juno/core/test/ini/CT_ConfigMgr$1.class |   Bin 0 -> 593 bytes
 .../ibm/juno/core/test/ini/CT_ConfigMgr.class   |   Bin 0 -> 9283 bytes
 .../ibm/juno/core/test/jena/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/jena/CT_Common$B$1.class |   Bin 0 -> 866 bytes
 .../ibm/juno/core/test/jena/CT_Common$B.class   |   Bin 0 -> 881 bytes
 .../ibm/juno/core/test/jena/CT_Common$C$1.class |   Bin 0 -> 797 bytes
 .../ibm/juno/core/test/jena/CT_Common$C.class   |   Bin 0 -> 860 bytes
 .../ibm/juno/core/test/jena/CT_Common$D.class   |   Bin 0 -> 762 bytes
 .../juno/core/test/jena/CT_Common$E1$1.class    |   Bin 0 -> 818 bytes
 .../juno/core/test/jena/CT_Common$E1$2.class    |   Bin 0 -> 752 bytes
 .../juno/core/test/jena/CT_Common$E1$3.class    |   Bin 0 -> 846 bytes
 .../ibm/juno/core/test/jena/CT_Common$E1.class  |   Bin 0 -> 1765 bytes
 .../ibm/juno/core/test/jena/CT_Common$E2.class  |   Bin 0 -> 461 bytes
 .../ibm/juno/core/test/jena/CT_Common$F.class   |   Bin 0 -> 837 bytes
 .../ibm/juno/core/test/jena/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/jena/CT_Common$R1.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/jena/CT_Common$R2.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/jena/CT_Common$R3.class  |   Bin 0 -> 575 bytes
 .../com/ibm/juno/core/test/jena/CT_Common.class |   Bin 0 -> 13485 bytes
 .../juno/core/test/jena/CT_CommonParser$1.class |   Bin 0 -> 1472 bytes
 .../core/test/jena/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/jena/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/jena/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/jena/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/jena/CT_CommonParser$C.class |   Bin 0 -> 1100 bytes
 .../juno/core/test/jena/CT_CommonParser.class   |   Bin 0 -> 9004 bytes
 .../juno/core/test/jena/CT_CommonXml$A.class    |   Bin 0 -> 884 bytes
 .../juno/core/test/jena/CT_CommonXml$B.class    |   Bin 0 -> 879 bytes
 .../ibm/juno/core/test/jena/CT_CommonXml.class  |   Bin 0 -> 2940 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$A.class  |   Bin 0 -> 1257 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$B.class  |   Bin 0 -> 2688 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BA.class |   Bin 0 -> 965 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BB.class |   Bin 0 -> 965 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BC.class |   Bin 0 -> 966 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BD.class |   Bin 0 -> 974 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BE.class |   Bin 0 -> 969 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$C.class  |   Bin 0 -> 2504 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$D.class  |   Bin 0 -> 1139 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf.class    |   Bin 0 -> 11093 bytes
 .../juno/core/test/jena/CT_RdfParser$A.class    |   Bin 0 -> 2247 bytes
 .../juno/core/test/jena/CT_RdfParser$A1.class   |   Bin 0 -> 1885 bytes
 .../ibm/juno/core/test/jena/CT_RdfParser.class  |   Bin 0 -> 3611 bytes
 .../juno/core/test/json/BrokenCognosOutput.txt  |     1 +
 .../ibm/juno/core/test/json/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/json/CT_Common$B$1.class |   Bin 0 -> 866 bytes
 .../ibm/juno/core/test/json/CT_Common$B.class   |   Bin 0 -> 881 bytes
 .../ibm/juno/core/test/json/CT_Common$C$1.class |   Bin 0 -> 797 bytes
 .../ibm/juno/core/test/json/CT_Common$C.class   |   Bin 0 -> 860 bytes
 .../ibm/juno/core/test/json/CT_Common$D.class   |   Bin 0 -> 762 bytes
 .../juno/core/test/json/CT_Common$E1$1.class    |   Bin 0 -> 890 bytes
 .../juno/core/test/json/CT_Common$E1$2.class    |   Bin 0 -> 824 bytes
 .../juno/core/test/json/CT_Common$E1$3.class    |   Bin 0 -> 976 bytes
 .../ibm/juno/core/test/json/CT_Common$E1.class  |   Bin 0 -> 1744 bytes
 .../ibm/juno/core/test/json/CT_Common$E2.class  |   Bin 0 -> 461 bytes
 .../ibm/juno/core/test/json/CT_Common$F.class   |   Bin 0 -> 703 bytes
 .../ibm/juno/core/test/json/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/json/CT_Common$J.class   |   Bin 0 -> 1356 bytes
 .../ibm/juno/core/test/json/CT_Common$R1.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/json/CT_Common$R2.class  |   Bin 0 -> 575 bytes
 .../ibm/juno/core/test/json/CT_Common$R3.class  |   Bin 0 -> 575 bytes
 .../com/ibm/juno/core/test/json/CT_Common.class |   Bin 0 -> 10391 bytes
 .../juno/core/test/json/CT_CommonParser$1.class |   Bin 0 -> 1472 bytes
 .../core/test/json/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/json/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/json/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/json/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/json/CT_CommonParser$C.class |   Bin 0 -> 1100 bytes
 .../juno/core/test/json/CT_CommonParser.class   |   Bin 0 -> 6353 bytes
 .../com/ibm/juno/core/test/json/CT_Json$A.class |   Bin 0 -> 658 bytes
 .../com/ibm/juno/core/test/json/CT_Json$B.class |   Bin 0 -> 1069 bytes
 .../com/ibm/juno/core/test/json/CT_Json$C.class |   Bin 0 -> 451 bytes
 .../com/ibm/juno/core/test/json/CT_Json.class   |   Bin 0 -> 7860 bytes
 .../juno/core/test/json/CT_JsonParser$A.class   |   Bin 0 -> 440 bytes
 .../juno/core/test/json/CT_JsonParser$B.class   |   Bin 0 -> 655 bytes
 .../juno/core/test/json/CT_JsonParser$C.class   |   Bin 0 -> 861 bytes
 .../ibm/juno/core/test/json/CT_JsonParser.class |   Bin 0 -> 7487 bytes
 .../ibm/juno/core/test/json/CT_JsonSchema.class |   Bin 0 -> 1611 bytes
 .../urlencoding/CT_CommonParser_Uon$1.class     |   Bin 0 -> 1531 bytes
 .../urlencoding/CT_CommonParser_Uon$A1.class    |   Bin 0 -> 607 bytes
 .../urlencoding/CT_CommonParser_Uon$A2.class    |   Bin 0 -> 640 bytes
 .../urlencoding/CT_CommonParser_Uon$A3.class    |   Bin 0 -> 671 bytes
 .../urlencoding/CT_CommonParser_Uon$B.class     |   Bin 0 -> 479 bytes
 .../urlencoding/CT_CommonParser_Uon$C.class     |   Bin 0 -> 1170 bytes
 .../test/urlencoding/CT_CommonParser_Uon.class  |   Bin 0 -> 5760 bytes
 .../CT_CommonParser_UrlEncoding$1.class         |   Bin 0 -> 1579 bytes
 .../CT_CommonParser_UrlEncoding$A1.class        |   Bin 0 -> 655 bytes
 .../CT_CommonParser_UrlEncoding$A2.class        |   Bin 0 -> 688 bytes
 .../CT_CommonParser_UrlEncoding$A3.class        |   Bin 0 -> 703 bytes
 .../CT_CommonParser_UrlEncoding$B.class         |   Bin 0 -> 511 bytes
 .../CT_CommonParser_UrlEncoding$C.class         |   Bin 0 -> 1226 bytes
 .../CT_CommonParser_UrlEncoding.class           |   Bin 0 -> 7161 bytes
 .../core/test/urlencoding/CT_Common_Uon$A.class |   Bin 0 -> 642 bytes
 .../test/urlencoding/CT_Common_Uon$B$1.class    |   Bin 0 -> 958 bytes
 .../core/test/urlencoding/CT_Common_Uon$B.class |   Bin 0 -> 962 bytes
 .../test/urlencoding/CT_Common_Uon$C$1.class    |   Bin 0 -> 889 bytes
 .../core/test/urlencoding/CT_Common_Uon$C.class |   Bin 0 -> 941 bytes
 .../core/test/urlencoding/CT_Common_Uon$D.class |   Bin 0 -> 843 bytes
 .../test/urlencoding/CT_Common_Uon$E1$1.class   |   Bin 0 -> 960 bytes
 .../test/urlencoding/CT_Common_Uon$E1$2.class   |   Bin 0 -> 916 bytes
 .../test/urlencoding/CT_Common_Uon$E1$3.class   |   Bin 0 -> 1046 bytes
 .../test/urlencoding/CT_Common_Uon$E1.class     |   Bin 0 -> 1869 bytes
 .../test/urlencoding/CT_Common_Uon$E2.class     |   Bin 0 -> 498 bytes
 .../core/test/urlencoding/CT_Common_Uon$F.class |   Bin 0 -> 751 bytes
 .../core/test/urlencoding/CT_Common_Uon$G.class |   Bin 0 -> 607 bytes
 .../test/urlencoding/CT_Common_Uon$R1.class     |   Bin 0 -> 634 bytes
 .../test/urlencoding/CT_Common_Uon$R2.class     |   Bin 0 -> 634 bytes
 .../test/urlencoding/CT_Common_Uon$R3.class     |   Bin 0 -> 634 bytes
 .../core/test/urlencoding/CT_Common_Uon.class   |   Bin 0 -> 10239 bytes
 .../urlencoding/CT_Common_UrlEncoding$A.class   |   Bin 0 -> 682 bytes
 .../urlencoding/CT_Common_UrlEncoding$B$1.class |   Bin 0 -> 1030 bytes
 .../urlencoding/CT_Common_UrlEncoding$B.class   |   Bin 0 -> 1026 bytes
 .../urlencoding/CT_Common_UrlEncoding$C$1.class |   Bin 0 -> 961 bytes
 .../urlencoding/CT_Common_UrlEncoding$C.class   |   Bin 0 -> 1005 bytes
 .../urlencoding/CT_Common_UrlEncoding$D.class   |   Bin 0 -> 907 bytes
 .../CT_Common_UrlEncoding$E1$1.class            |   Bin 0 -> 1016 bytes
 .../CT_Common_UrlEncoding$E1$2.class            |   Bin 0 -> 988 bytes
 .../CT_Common_UrlEncoding$E1$3.class            |   Bin 0 -> 1102 bytes
 .../urlencoding/CT_Common_UrlEncoding$E1.class  |   Bin 0 -> 1965 bytes
 .../urlencoding/CT_Common_UrlEncoding$E2.class  |   Bin 0 -> 530 bytes
 .../urlencoding/CT_Common_UrlEncoding$F.class   |   Bin 0 -> 791 bytes
 .../urlencoding/CT_Common_UrlEncoding$G.class   |   Bin 0 -> 639 bytes
 .../urlencoding/CT_Common_UrlEncoding$R1.class  |   Bin 0 -> 682 bytes
 .../urlencoding/CT_Common_UrlEncoding$R2.class  |   Bin 0 -> 682 bytes
 .../urlencoding/CT_Common_UrlEncoding$R3.class  |   Bin 0 -> 682 bytes
 .../urlencoding/CT_Common_UrlEncoding.class     |   Bin 0 -> 10604 bytes
 .../core/test/urlencoding/CT_UonParser$A.class  |   Bin 0 -> 474 bytes
 .../core/test/urlencoding/CT_UonParser.class    |   Bin 0 -> 10441 bytes
 .../CT_UonParserReader$SlowStringReader.class   |   Bin 0 -> 1014 bytes
 .../test/urlencoding/CT_UonParserReader.class   |   Bin 0 -> 4228 bytes
 .../test/urlencoding/CT_UonSerializer.class     |   Bin 0 -> 10386 bytes
 .../urlencoding/CT_UrlEncodingParser$A.class    |   Bin 0 -> 506 bytes
 .../urlencoding/CT_UrlEncodingParser$B.class    |   Bin 0 -> 512 bytes
 .../urlencoding/CT_UrlEncodingParser$C.class    |   Bin 0 -> 552 bytes
 .../urlencoding/CT_UrlEncodingParser$C1.class   |   Bin 0 -> 493 bytes
 .../urlencoding/CT_UrlEncodingParser$D.class    |   Bin 0 -> 761 bytes
 .../urlencoding/CT_UrlEncodingParser$D1.class   |   Bin 0 -> 507 bytes
 .../urlencoding/CT_UrlEncodingParser$D2.class   |   Bin 0 -> 507 bytes
 .../urlencoding/CT_UrlEncodingParser$E.class    |   Bin 0 -> 526 bytes
 .../test/urlencoding/CT_UrlEncodingParser.class |   Bin 0 -> 20008 bytes
 .../urlencoding/CT_UrlEncodingSerializer.class  |   Bin 0 -> 10071 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$A.class |   Bin 0 -> 653 bytes
 .../juno/core/test/urlencoding/DTOs$B$1.class   |   Bin 0 -> 678 bytes
 .../juno/core/test/urlencoding/DTOs$B$10.class  |   Bin 0 -> 929 bytes
 .../juno/core/test/urlencoding/DTOs$B$2.class   |   Bin 0 -> 737 bytes
 .../juno/core/test/urlencoding/DTOs$B$3.class   |   Bin 0 -> 739 bytes
 .../juno/core/test/urlencoding/DTOs$B$4.class   |   Bin 0 -> 808 bytes
 .../juno/core/test/urlencoding/DTOs$B$5.class   |   Bin 0 -> 927 bytes
 .../juno/core/test/urlencoding/DTOs$B$6.class   |   Bin 0 -> 678 bytes
 .../juno/core/test/urlencoding/DTOs$B$7.class   |   Bin 0 -> 737 bytes
 .../juno/core/test/urlencoding/DTOs$B$8.class   |   Bin 0 -> 739 bytes
 .../juno/core/test/urlencoding/DTOs$B$9.class   |   Bin 0 -> 808 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$B.class |   Bin 0 -> 5496 bytes
 .../juno/core/test/urlencoding/DTOs$C$1.class   |   Bin 0 -> 678 bytes
 .../juno/core/test/urlencoding/DTOs$C$10.class  |   Bin 0 -> 929 bytes
 .../juno/core/test/urlencoding/DTOs$C$2.class   |   Bin 0 -> 737 bytes
 .../juno/core/test/urlencoding/DTOs$C$3.class   |   Bin 0 -> 739 bytes
 .../juno/core/test/urlencoding/DTOs$C$4.class   |   Bin 0 -> 808 bytes
 .../juno/core/test/urlencoding/DTOs$C$5.class   |   Bin 0 -> 927 bytes
 .../juno/core/test/urlencoding/DTOs$C$6.class   |   Bin 0 -> 678 bytes
 .../juno/core/test/urlencoding/DTOs$C$7.class   |   Bin 0 -> 737 bytes
 .../juno/core/test/urlencoding/DTOs$C$8.class   |   Bin 0 -> 739 bytes
 .../juno/core/test/urlencoding/DTOs$C$9.class   |   Bin 0 -> 808 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$C.class |   Bin 0 -> 2634 bytes
 .../ibm/juno/core/test/urlencoding/DTOs.class   |   Bin 0 -> 511 bytes
 .../com/ibm/juno/core/test/utils/CT_Args.class  |   Bin 0 -> 1714 bytes
 .../juno/core/test/utils/CT_ArrayUtils.class    |   Bin 0 -> 4007 bytes
 .../core/test/utils/CT_ByteArrayCache.class     |   Bin 0 -> 1392 bytes
 .../test/utils/CT_ByteArrayInOutStream.class    |   Bin 0 -> 1335 bytes
 .../ibm/juno/core/test/utils/CT_CharSet.class   |   Bin 0 -> 810 bytes
 .../juno/core/test/utils/CT_ClassUtils$A.class  |   Bin 0 -> 221 bytes
 .../juno/core/test/utils/CT_ClassUtils$A1.class |   Bin 0 -> 476 bytes
 .../juno/core/test/utils/CT_ClassUtils$A2.class |   Bin 0 -> 454 bytes
 .../juno/core/test/utils/CT_ClassUtils.class    |   Bin 0 -> 3319 bytes
 .../core/test/utils/CT_CollectionUtils.class    |   Bin 0 -> 979 bytes
 .../juno/core/test/utils/CT_FilteredMap.class   |   Bin 0 -> 1832 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$1.class  |   Bin 0 -> 939 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$2.class  |   Bin 0 -> 939 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$3.class  |   Bin 0 -> 939 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$4.class  |   Bin 0 -> 1007 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$5.class  |   Bin 0 -> 944 bytes
 .../test/utils/CT_IOPipe$TestInputStream.class  |   Bin 0 -> 743 bytes
 .../test/utils/CT_IOPipe$TestOutputStream.class |   Bin 0 -> 911 bytes
 .../core/test/utils/CT_IOPipe$TestReader.class  |   Bin 0 -> 593 bytes
 .../core/test/utils/CT_IOPipe$TestWriter.class  |   Bin 0 -> 533 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe.class    |   Bin 0 -> 4988 bytes
 .../test/utils/CT_IOUtils$TestInputStream.class |   Bin 0 -> 747 bytes
 .../utils/CT_IOUtils$TestOutputStream.class     |   Bin 0 -> 915 bytes
 .../core/test/utils/CT_IOUtils$TestReader.class |   Bin 0 -> 597 bytes
 .../core/test/utils/CT_IOUtils$TestWriter.class |   Bin 0 -> 537 bytes
 .../ibm/juno/core/test/utils/CT_IOUtils.class   |   Bin 0 -> 1476 bytes
 .../juno/core/test/utils/CT_IdentityList.class  |   Bin 0 -> 1038 bytes
 .../juno/core/test/utils/CT_KeywordStore.class  |   Bin 0 -> 1462 bytes
 .../juno/core/test/utils/CT_MultiIterable.class |   Bin 0 -> 2226 bytes
 .../ibm/juno/core/test/utils/CT_MultiSet.class  |   Bin 0 -> 3670 bytes
 .../juno/core/test/utils/CT_ParserReader.class  |   Bin 0 -> 1365 bytes
 .../core/test/utils/CT_PojoIntrospector.class   |   Bin 0 -> 1678 bytes
 .../juno/core/test/utils/CT_PojoQuery$1.class   |   Bin 0 -> 978 bytes
 .../juno/core/test/utils/CT_PojoQuery$2.class   |   Bin 0 -> 928 bytes
 .../juno/core/test/utils/CT_PojoQuery$3.class   |   Bin 0 -> 981 bytes
 .../juno/core/test/utils/CT_PojoQuery$4.class   |   Bin 0 -> 978 bytes
 .../juno/core/test/utils/CT_PojoQuery$5.class   |   Bin 0 -> 973 bytes
 .../juno/core/test/utils/CT_PojoQuery$A.class   |   Bin 0 -> 731 bytes
 .../juno/core/test/utils/CT_PojoQuery$B.class   |   Bin 0 -> 1082 bytes
 .../juno/core/test/utils/CT_PojoQuery$C.class   |   Bin 0 -> 697 bytes
 .../juno/core/test/utils/CT_PojoQuery$D1.class  |   Bin 0 -> 864 bytes
 .../juno/core/test/utils/CT_PojoQuery$D2.class  |   Bin 0 -> 734 bytes
 .../juno/core/test/utils/CT_PojoQuery$E.class   |   Bin 0 -> 827 bytes
 .../core/test/utils/CT_PojoQuery$F1$1.class     |   Bin 0 -> 1385 bytes
 .../juno/core/test/utils/CT_PojoQuery$F1.class  |   Bin 0 -> 1402 bytes
 .../juno/core/test/utils/CT_PojoQuery$F2.class  |   Bin 0 -> 767 bytes
 .../juno/core/test/utils/CT_PojoQuery$G.class   |   Bin 0 -> 827 bytes
 .../core/test/utils/CT_PojoQuery$H1$1.class     |   Bin 0 -> 1385 bytes
 .../juno/core/test/utils/CT_PojoQuery$H1.class  |   Bin 0 -> 1402 bytes
 .../juno/core/test/utils/CT_PojoQuery$H2.class  |   Bin 0 -> 767 bytes
 .../juno/core/test/utils/CT_PojoQuery$I.class   |   Bin 0 -> 996 bytes
 .../ibm/juno/core/test/utils/CT_PojoQuery.class |   Bin 0 -> 12626 bytes
 .../juno/core/test/utils/CT_PojoRest$A.class    |   Bin 0 -> 1691 bytes
 .../core/test/utils/CT_PojoRest$Address.class   |   Bin 0 -> 1244 bytes
 .../test/utils/CT_PojoRest$AddressBook.class    |   Bin 0 -> 1102 bytes
 .../core/test/utils/CT_PojoRest$Person.class    |   Bin 0 -> 1162 bytes
 .../ibm/juno/core/test/utils/CT_PojoRest.class  |   Bin 0 -> 21086 bytes
 .../ibm/juno/core/test/utils/CT_SimpleMap.class |   Bin 0 -> 2167 bytes
 .../test/utils/CT_StringBuilderWriter.class     |   Bin 0 -> 1917 bytes
 .../test/utils/CT_StringUtils$BadNumber.class   |   Bin 0 -> 437 bytes
 .../juno/core/test/utils/CT_StringUtils.class   |   Bin 0 -> 14381 bytes
 .../test/utils/CT_StringVarResolver$1.class     |   Bin 0 -> 957 bytes
 .../test/utils/CT_StringVarResolver$2.class     |   Bin 0 -> 958 bytes
 .../test/utils/CT_StringVarResolver$3.class     |   Bin 0 -> 965 bytes
 .../test/utils/CT_StringVarResolver$4.class     |   Bin 0 -> 973 bytes
 .../test/utils/CT_StringVarResolver$5.class     |   Bin 0 -> 906 bytes
 .../test/utils/CT_StringVarResolver$6.class     |   Bin 0 -> 795 bytes
 .../test/utils/CT_StringVarResolver$7.class     |   Bin 0 -> 795 bytes
 .../core/test/utils/CT_StringVarResolver.class  |   Bin 0 -> 5850 bytes
 .../ibm/juno/core/test/xml/CT_Common$A.class    |   Bin 0 -> 590 bytes
 .../ibm/juno/core/test/xml/CT_Common$B$1.class  |   Bin 0 -> 858 bytes
 .../ibm/juno/core/test/xml/CT_Common$B.class    |   Bin 0 -> 874 bytes
 .../ibm/juno/core/test/xml/CT_Common$C$1.class  |   Bin 0 -> 789 bytes
 .../ibm/juno/core/test/xml/CT_Common$C.class    |   Bin 0 -> 853 bytes
 .../ibm/juno/core/test/xml/CT_Common$D.class    |   Bin 0 -> 755 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$1.class |   Bin 0 -> 884 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$2.class |   Bin 0 -> 816 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$3.class |   Bin 0 -> 970 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1.class   |   Bin 0 -> 1750 bytes
 .../ibm/juno/core/test/xml/CT_Common$E2.class   |   Bin 0 -> 692 bytes
 .../ibm/juno/core/test/xml/CT_Common$G.class    |   Bin 0 -> 567 bytes
 .../ibm/juno/core/test/xml/CT_Common$R1.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/xml/CT_Common$R2.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/xml/CT_Common$R3.class   |   Bin 0 -> 570 bytes
 .../juno/core/test/xml/CT_Common$Test7b.class   |   Bin 0 -> 719 bytes
 .../com/ibm/juno/core/test/xml/CT_Common.class  |   Bin 0 -> 10265 bytes
 .../juno/core/test/xml/CT_CommonParser$1.class  |   Bin 0 -> 1467 bytes
 .../juno/core/test/xml/CT_CommonParser$A1.class |   Bin 0 -> 543 bytes
 .../juno/core/test/xml/CT_CommonParser$A2.class |   Bin 0 -> 576 bytes
 .../juno/core/test/xml/CT_CommonParser$A3.class |   Bin 0 -> 631 bytes
 .../juno/core/test/xml/CT_CommonParser$B.class  |   Bin 0 -> 439 bytes
 .../juno/core/test/xml/CT_CommonParser$C.class  |   Bin 0 -> 1094 bytes
 .../juno/core/test/xml/CT_CommonParser.class    |   Bin 0 -> 6580 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml$A.class |   Bin 0 -> 1014 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml$B.class |   Bin 0 -> 970 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml.class   |   Bin 0 -> 2383 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$A.class   |   Bin 0 -> 510 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$B1.class  |   Bin 0 -> 409 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$B2.class  |   Bin 0 -> 411 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C1.class  |   Bin 0 -> 297 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C2.class  |   Bin 0 -> 435 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C3.class  |   Bin 0 -> 447 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$D.class   |   Bin 0 -> 542 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$E.class   |   Bin 0 -> 510 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$F.class   |   Bin 0 -> 543 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$G.class   |   Bin 0 -> 610 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$H.class   |   Bin 0 -> 576 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$I.class   |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/xml/CT_Xml$J1$1.class    |   Bin 0 -> 789 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$J1.class  |   Bin 0 -> 862 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$J2.class  |   Bin 0 -> 545 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$K.class   |   Bin 0 -> 493 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$L.class   |   Bin 0 -> 626 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$M.class   |   Bin 0 -> 784 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$N.class   |   Bin 0 -> 985 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$O.class   |   Bin 0 -> 1020 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$P.class   |   Bin 0 -> 1017 bytes
 .../ibm/juno/core/test/xml/CT_Xml$Person1.class |   Bin 0 -> 890 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$Q.class   |   Bin 0 -> 1022 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml.class     |   Bin 0 -> 24963 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$1.class  |   Bin 0 -> 725 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$10.class |   Bin 0 -> 739 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$2.class  |   Bin 0 -> 725 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$3.class  |   Bin 0 -> 739 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$4.class  |   Bin 0 -> 739 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$5.class  |   Bin 0 -> 721 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$6.class  |   Bin 0 -> 721 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$7.class  |   Bin 0 -> 711 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$8.class  |   Bin 0 -> 711 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$9.class  |   Bin 0 -> 737 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$A.class  |   Bin 0 -> 965 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$B.class  |   Bin 0 -> 818 bytes
 .../core/test/xml/CT_XmlCollapsed$C$1.class     |   Bin 0 -> 762 bytes
 .../core/test/xml/CT_XmlCollapsed$C$2.class     |   Bin 0 -> 762 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$C.class  |   Bin 0 -> 1154 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$D.class  |   Bin 0 -> 2445 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$E.class  |   Bin 0 -> 1800 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$F1.class |   Bin 0 -> 826 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FA.class |   Bin 0 -> 1149 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FB.class |   Bin 0 -> 977 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FC.class |   Bin 0 -> 982 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$G.class  |   Bin 0 -> 1168 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$H.class  |   Bin 0 -> 952 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$H1.class |   Bin 0 -> 587 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$I.class  |   Bin 0 -> 975 bytes
 .../juno/core/test/xml/CT_XmlCollapsed.class    |   Bin 0 -> 8105 bytes
 .../juno/core/test/xml/CT_XmlContent$A.class    |   Bin 0 -> 838 bytes
 .../juno/core/test/xml/CT_XmlContent$B.class    |   Bin 0 -> 1013 bytes
 .../xml/CT_XmlContent$BContentHandler.class     |   Bin 0 -> 2057 bytes
 .../juno/core/test/xml/CT_XmlContent$C1.class   |   Bin 0 -> 626 bytes
 .../ibm/juno/core/test/xml/CT_XmlContent.class  |   Bin 0 -> 5773 bytes
 .../ibm/juno/core/test/xml/CT_XmlParser.class   |   Bin 0 -> 2984 bytes
 .../core/test/xml/testComparisonWithJson.json   |    17 +
 .../core/test/xml/testComparisonWithJson.xml    |    17 +
 .../ibm/juno/core/test/xml/testNamespaces.xml   |    17 +
 .../com/ibm/juno/core/test/xml/xml1a/T1.class   |   Bin 0 -> 1152 bytes
 .../com/ibm/juno/core/test/xml/xml1a/T2.class   |   Bin 0 -> 1169 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T3.class   |   Bin 0 -> 1111 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T4.class   |   Bin 0 -> 1140 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T5.class   |   Bin 0 -> 1169 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T6.class   |   Bin 0 -> 1152 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T7.class   |   Bin 0 -> 1270 bytes
 .../juno/core/test/xml/xml1b/package-info.class |   Bin 0 -> 273 bytes
 .../com/ibm/juno/core/test/xml/xml1c/T8.class   |   Bin 0 -> 789 bytes
 .../com/ibm/juno/core/test/xml/xml1c/T9.class   |   Bin 0 -> 499 bytes
 .../juno/core/test/xml/xml1c/package-info.class |   Bin 0 -> 478 bytes
 .../PrimitiveAtomicObjectsBean$1.class          |   Bin 0 -> 912 bytes
 .../PrimitiveAtomicObjectsBean$2.class          |   Bin 0 -> 906 bytes
 .../testbeans/PrimitiveAtomicObjectsBean.class  |   Bin 0 -> 2069 bytes
 .../juno/testbeans/PrimitiveObjectsBean$1.class |   Bin 0 -> 839 bytes
 .../testbeans/PrimitiveObjectsBean$10.class     |   Bin 0 -> 855 bytes
 .../testbeans/PrimitiveObjectsBean$11.class     |   Bin 0 -> 855 bytes
 .../juno/testbeans/PrimitiveObjectsBean$2.class |   Bin 0 -> 837 bytes
 .../juno/testbeans/PrimitiveObjectsBean$3.class |   Bin 0 -> 853 bytes
 .../juno/testbeans/PrimitiveObjectsBean$4.class |   Bin 0 -> 840 bytes
 .../juno/testbeans/PrimitiveObjectsBean$5.class |   Bin 0 -> 846 bytes
 .../juno/testbeans/PrimitiveObjectsBean$6.class |   Bin 0 -> 837 bytes
 .../juno/testbeans/PrimitiveObjectsBean$7.class |   Bin 0 -> 840 bytes
 .../juno/testbeans/PrimitiveObjectsBean$8.class |   Bin 0 -> 843 bytes
 .../juno/testbeans/PrimitiveObjectsBean$9.class |   Bin 0 -> 845 bytes
 .../juno/testbeans/PrimitiveObjectsBean.class   |   Bin 0 -> 6622 bytes
 .../ibm/juno/testbeans/TestURI$TestURIb.class   |   Bin 0 -> 571 bytes
 .../com/ibm/juno/testbeans/TestURI.class        |   Bin 0 -> 1280 bytes
 .../bin/core/META-INF/MANIFEST.MF               |    26 +
 .../core/com/ibm/juno/core/BeanContext.class    |   Bin 0 -> 39727 bytes
 .../bin/core/com/ibm/juno/core/BeanContext.java |  1804 +++
 .../com/ibm/juno/core/BeanContextFactory.class  |   Bin 0 -> 12989 bytes
 .../com/ibm/juno/core/BeanContextFactory.java   |   454 +
 .../ibm/juno/core/BeanContextProperties.class   |   Bin 0 -> 2021 bytes
 .../ibm/juno/core/BeanContextProperties.java    |   188 +
 .../core/com/ibm/juno/core/BeanMap$1$1.class    |   Bin 0 -> 1891 bytes
 .../bin/core/com/ibm/juno/core/BeanMap$1.class  |   Bin 0 -> 1507 bytes
 .../bin/core/com/ibm/juno/core/BeanMap.class    |   Bin 0 -> 8831 bytes
 .../bin/core/com/ibm/juno/core/BeanMap.java     |   461 +
 .../core/com/ibm/juno/core/BeanMapEntry.class   |   Bin 0 -> 2398 bytes
 .../core/com/ibm/juno/core/BeanMapEntry.java    |   121 +
 .../com/ibm/juno/core/BeanMeta$BeanMethod.class |   Bin 0 -> 1996 bytes
 .../core/BeanMeta$SubTypePropertyMeta.class     |   Bin 0 -> 4607 bytes
 .../bin/core/com/ibm/juno/core/BeanMeta.class   |   Bin 0 -> 21850 bytes
 .../bin/core/com/ibm/juno/core/BeanMeta.java    |   749 +
 .../com/ibm/juno/core/BeanMetaFiltered.class    |   Bin 0 -> 2803 bytes
 .../com/ibm/juno/core/BeanMetaFiltered.java     |    70 +
 .../com/ibm/juno/core/BeanPropertyMeta.class    |   Bin 0 -> 23240 bytes
 .../com/ibm/juno/core/BeanPropertyMeta.java     |   803 ++
 .../juno/core/BeanProxyInvocationHandler.class  |   Bin 0 -> 3213 bytes
 .../juno/core/BeanProxyInvocationHandler.java   |    78 +
 .../ibm/juno/core/BeanRuntimeException.class    |   Bin 0 -> 1822 bytes
 .../com/ibm/juno/core/BeanRuntimeException.java |    63 +
 .../core/com/ibm/juno/core/ClassMeta$1.class    |   Bin 0 -> 1002 bytes
 .../ibm/juno/core/ClassMeta$ClassCategory.class |   Bin 0 -> 1999 bytes
 .../bin/core/com/ibm/juno/core/ClassMeta.class  |   Bin 0 -> 27370 bytes
 .../bin/core/com/ibm/juno/core/ClassMeta.java   |  1262 ++
 .../bin/core/com/ibm/juno/core/CoreApi.class    |   Bin 0 -> 3859 bytes
 .../bin/core/com/ibm/juno/core/CoreApi.java     |   172 +
 .../bin/core/com/ibm/juno/core/Delegate.class   |   Bin 0 -> 282 bytes
 .../bin/core/com/ibm/juno/core/Delegate.java    |    29 +
 .../core/InvalidDataConversionException.class   |   Bin 0 -> 1321 bytes
 .../core/InvalidDataConversionException.java    |    33 +
 .../bin/core/com/ibm/juno/core/Lockable.class   |   Bin 0 -> 1134 bytes
 .../bin/core/com/ibm/juno/core/Lockable.java    |    84 +
 .../com/ibm/juno/core/LockedException.class     |   Bin 0 -> 472 bytes
 .../core/com/ibm/juno/core/LockedException.java |    28 +
 .../bin/core/com/ibm/juno/core/MediaRange.class |   Bin 0 -> 6761 bytes
 .../bin/core/com/ibm/juno/core/MediaRange.java  |   312 +
 .../core/com/ibm/juno/core/ObjectList$1.class   |   Bin 0 -> 1368 bytes
 .../core/com/ibm/juno/core/ObjectList$2$1.class |   Bin 0 -> 1356 bytes
 .../core/com/ibm/juno/core/ObjectList$2.class   |   Bin 0 -> 1025 bytes
 .../bin/core/com/ibm/juno/core/ObjectList.class |   Bin 0 -> 6761 bytes
 .../bin/core/com/ibm/juno/core/ObjectList.java  |   447 +
 .../core/com/ibm/juno/core/ObjectMap$1.class    |   Bin 0 -> 1668 bytes
 .../com/ibm/juno/core/ObjectMap$2$1$1.class     |   Bin 0 -> 1595 bytes
 .../core/com/ibm/juno/core/ObjectMap$2$1.class  |   Bin 0 -> 1375 bytes
 .../core/com/ibm/juno/core/ObjectMap$2.class    |   Bin 0 -> 1235 bytes
 .../bin/core/com/ibm/juno/core/ObjectMap.class  |   Bin 0 -> 20822 bytes
 .../bin/core/com/ibm/juno/core/ObjectMap.java   |  1282 ++
 .../core/com/ibm/juno/core/PropertyNamer.class  |   Bin 0 -> 192 bytes
 .../core/com/ibm/juno/core/PropertyNamer.java   |    31 +
 .../ibm/juno/core/PropertyNamerDashedLC.class   |   Bin 0 -> 1221 bytes
 .../ibm/juno/core/PropertyNamerDashedLC.java    |    62 +
 .../ibm/juno/core/PropertyNamerDefault.class    |   Bin 0 -> 572 bytes
 .../com/ibm/juno/core/PropertyNamerDefault.java |    35 +
 .../bin/core/com/ibm/juno/core/Streamable.class |   Bin 0 -> 260 bytes
 .../bin/core/com/ibm/juno/core/Streamable.java  |    38 +
 .../core/com/ibm/juno/core/Visibility$1.class   |   Bin 0 -> 841 bytes
 .../bin/core/com/ibm/juno/core/Visibility.class |   Bin 0 -> 3748 bytes
 .../bin/core/com/ibm/juno/core/Visibility.java  |   195 +
 .../bin/core/com/ibm/juno/core/Writable.class   |   Bin 0 -> 249 bytes
 .../bin/core/com/ibm/juno/core/Writable.java    |    38 +
 .../com/ibm/juno/core/annotation/Bean.class     |   Bin 0 -> 1016 bytes
 .../core/com/ibm/juno/core/annotation/Bean.java |   216 +
 .../juno/core/annotation/BeanConstructor.class  |   Bin 0 -> 570 bytes
 .../juno/core/annotation/BeanConstructor.java   |    82 +
 .../ibm/juno/core/annotation/BeanIgnore.class   |   Bin 0 -> 506 bytes
 .../ibm/juno/core/annotation/BeanIgnore.java    |    34 +
 .../ibm/juno/core/annotation/BeanProperty.class |   Bin 0 -> 1125 bytes
 .../ibm/juno/core/annotation/BeanProperty.java  |   182 +
 .../ibm/juno/core/annotation/BeanSubType.class  |   Bin 0 -> 550 bytes
 .../ibm/juno/core/annotation/BeanSubType.java   |    42 +
 .../com/ibm/juno/core/annotation/Consumes.class |   Bin 0 -> 536 bytes
 .../com/ibm/juno/core/annotation/Consumes.java  |    69 +
 .../com/ibm/juno/core/annotation/Filter.class   |   Bin 0 -> 766 bytes
 .../com/ibm/juno/core/annotation/Filter.java    |    82 +
 .../ibm/juno/core/annotation/NameProperty.class |   Bin 0 -> 445 bytes
 .../ibm/juno/core/annotation/NameProperty.java  |    31 +
 .../juno/core/annotation/ParentProperty.class   |   Bin 0 -> 449 bytes
 .../juno/core/annotation/ParentProperty.java    |    31 +
 .../com/ibm/juno/core/annotation/Produces.class |   Bin 0 -> 593 bytes
 .../com/ibm/juno/core/annotation/Produces.java  |    82 +
 .../ibm/juno/core/annotation/Remoteable.class   |   Bin 0 -> 493 bytes
 .../ibm/juno/core/annotation/Remoteable.java    |    23 +
 .../core/com/ibm/juno/core/annotation/URI.class |   Bin 0 -> 492 bytes
 .../core/com/ibm/juno/core/annotation/URI.java  |    64 +
 .../com/ibm/juno/core/annotation/package.html   |    34 +
 .../com/ibm/juno/core/csv/CsvSerializer.class   |   Bin 0 -> 4682 bytes
 .../com/ibm/juno/core/csv/CsvSerializer.java    |    90 +
 .../bin/core/com/ibm/juno/core/csv/package.html |    55 +
 .../ibm/juno/core/doc-files/AddressBook.html    |   106 +
 .../bin/core/com/ibm/juno/core/dto/Link.class   |   Bin 0 -> 2451 bytes
 .../bin/core/com/ibm/juno/core/dto/Link.java    |   133 +
 .../com/ibm/juno/core/dto/ResultSetList.class   |   Bin 0 -> 3565 bytes
 .../com/ibm/juno/core/dto/ResultSetList.java    |   107 +
 .../com/ibm/juno/core/dto/atom/Category.class   |   Bin 0 -> 1897 bytes
 .../com/ibm/juno/core/dto/atom/Category.java    |   137 +
 .../com/ibm/juno/core/dto/atom/Common.class     |   Bin 0 -> 1050 bytes
 .../core/com/ibm/juno/core/dto/atom/Common.java |    84 +
 .../ibm/juno/core/dto/atom/CommonEntry.class    |   Bin 0 -> 5067 bytes
 .../com/ibm/juno/core/dto/atom/CommonEntry.java |   276 +
 .../com/ibm/juno/core/dto/atom/Content.class    |   Bin 0 -> 2193 bytes
 .../com/ibm/juno/core/dto/atom/Content.java     |   144 +
 .../core/com/ibm/juno/core/dto/atom/Entry.class |   Bin 0 -> 6763 bytes
 .../core/com/ibm/juno/core/dto/atom/Entry.java  |   243 +
 .../core/com/ibm/juno/core/dto/atom/Feed.class  |   Bin 0 -> 7645 bytes
 .../core/com/ibm/juno/core/dto/atom/Feed.java   |   284 +
 .../com/ibm/juno/core/dto/atom/Generator.class  |   Bin 0 -> 1910 bytes
 .../com/ibm/juno/core/dto/atom/Generator.java   |   139 +
 .../core/com/ibm/juno/core/dto/atom/Icon.class  |   Bin 0 -> 1433 bytes
 .../core/com/ibm/juno/core/dto/atom/Icon.java   |    93 +
 .../core/com/ibm/juno/core/dto/atom/Id.class    |   Bin 0 -> 1432 bytes
 .../bin/core/com/ibm/juno/core/dto/atom/Id.java |    92 +
 .../core/com/ibm/juno/core/dto/atom/Link.class  |   Bin 0 -> 2646 bytes
 .../core/com/ibm/juno/core/dto/atom/Link.java   |   222 +
 .../core/com/ibm/juno/core/dto/atom/Logo.class  |   Bin 0 -> 1433 bytes
 .../core/com/ibm/juno/core/dto/atom/Logo.java   |    93 +
 .../com/ibm/juno/core/dto/atom/Person.class     |   Bin 0 -> 1654 bytes
 .../core/com/ibm/juno/core/dto/atom/Person.java |   131 +
 .../com/ibm/juno/core/dto/atom/Source.class     |   Bin 0 -> 6319 bytes
 .../core/com/ibm/juno/core/dto/atom/Source.java |   223 +
 .../core/dto/atom/Text$TextContentHandler.class |   Bin 0 -> 2341 bytes
 .../core/com/ibm/juno/core/dto/atom/Text.class  |   Bin 0 -> 2082 bytes
 .../core/com/ibm/juno/core/dto/atom/Text.java   |   179 +
 .../core/dto/atom/doc-files/Example_HTML.png    |   Bin 0 -> 31484 bytes
 .../ibm/juno/core/dto/atom/package-info.class   |   Bin 0 -> 417 bytes
 .../ibm/juno/core/dto/atom/package-info.java    |    19 +
 .../com/ibm/juno/core/dto/atom/package.html     |   578 +
 .../com/ibm/juno/core/dto/cognos/Column.class   |   Bin 0 -> 1838 bytes
 .../com/ibm/juno/core/dto/cognos/Column.java    |   154 +
 .../ibm/juno/core/dto/cognos/DataSet$Row.class  |   Bin 0 -> 648 bytes
 .../com/ibm/juno/core/dto/cognos/DataSet.class  |   Bin 0 -> 3673 bytes
 .../com/ibm/juno/core/dto/cognos/DataSet.java   |   188 +
 .../ibm/juno/core/dto/cognos/doc-files/HTML.png |   Bin 0 -> 8476 bytes
 .../ibm/juno/core/dto/cognos/doc-files/JSON.png |   Bin 0 -> 6963 bytes
 .../juno/core/dto/cognos/doc-files/RDFXML.png   |   Bin 0 -> 19981 bytes
 .../ibm/juno/core/dto/cognos/package-info.class |   Bin 0 -> 310 bytes
 .../ibm/juno/core/dto/cognos/package-info.java  |    13 +
 .../com/ibm/juno/core/dto/cognos/package.html   |   170 +
 .../ibm/juno/core/dto/jsonschema/JsonType.class |   Bin 0 -> 2223 bytes
 .../ibm/juno/core/dto/jsonschema/JsonType.java  |   103 +
 .../core/dto/jsonschema/JsonTypeArray.class     |   Bin 0 -> 1098 bytes
 .../juno/core/dto/jsonschema/JsonTypeArray.java |    50 +
 .../ibm/juno/core/dto/jsonschema/Sample$1.class |   Bin 0 -> 1811 bytes
 .../ibm/juno/core/dto/jsonschema/Sample.class   |   Bin 0 -> 2015 bytes
 .../ibm/juno/core/dto/jsonschema/Sample.java    |    63 +
 .../Schema$BooleanOrSchemaArrayFilter.class     |   Bin 0 -> 1704 bytes
 .../Schema$BooleanOrSchemaFilter.class          |   Bin 0 -> 1613 bytes
 .../Schema$JsonTypeOrJsonTypeArrayFilter.class  |   Bin 0 -> 1739 bytes
 .../Schema$SchemaOrSchemaArrayFilter.class      |   Bin 0 -> 1678 bytes
 .../ibm/juno/core/dto/jsonschema/Schema.class   |   Bin 0 -> 21125 bytes
 .../ibm/juno/core/dto/jsonschema/Schema.java    |  1392 ++
 .../juno/core/dto/jsonschema/SchemaArray.class  |   Bin 0 -> 1082 bytes
 .../juno/core/dto/jsonschema/SchemaArray.java   |    50 +
 .../juno/core/dto/jsonschema/SchemaMap.class    |   Bin 0 -> 3080 bytes
 .../ibm/juno/core/dto/jsonschema/SchemaMap.java |   119 +
 .../core/dto/jsonschema/SchemaProperty.class    |   Bin 0 -> 886 bytes
 .../core/dto/jsonschema/SchemaProperty.java     |    44 +
 .../jsonschema/SchemaPropertySimpleArray.class  |   Bin 0 -> 927 bytes
 .../jsonschema/SchemaPropertySimpleArray.java   |    41 +
 .../juno/core/dto/jsonschema/SchemaRef.class    |   Bin 0 -> 667 bytes
 .../ibm/juno/core/dto/jsonschema/SchemaRef.java |    34 +
 .../dto/jsonschema/doc-files/Example_Html.png   |   Bin 0 -> 31260 bytes
 .../dto/jsonschema/doc-files/Example_Json.png   |   Bin 0 -> 22006 bytes
 .../jsonschema/doc-files/Example_Options.png    |   Bin 0 -> 41887 bytes
 .../dto/jsonschema/doc-files/Example_Turtle.png |   Bin 0 -> 28988 bytes
 .../jsonschema/doc-files/Example_UrlEncoded.png |   Bin 0 -> 21715 bytes
 .../dto/jsonschema/doc-files/Example_Xml.png    |   Bin 0 -> 28095 bytes
 .../doc-files/Example_XmlRdfAbbrev.png          |   Bin 0 -> 36296 bytes
 .../ibm/juno/core/dto/jsonschema/package.html   |   511 +
 .../bin/core/com/ibm/juno/core/dto/package.html |    34 +
 .../com/ibm/juno/core/encoders/Encoder.class    |   Bin 0 -> 550 bytes
 .../com/ibm/juno/core/encoders/Encoder.java     |    53 +
 .../encoders/EncoderGroup$EncoderEntry.class    |   Bin 0 -> 1630 bytes
 .../ibm/juno/core/encoders/EncoderGroup.class   |   Bin 0 -> 5451 bytes
 .../ibm/juno/core/encoders/EncoderGroup.java    |   195 +
 .../ibm/juno/core/encoders/GzipEncoder$1.class  |   Bin 0 -> 878 bytes
 .../ibm/juno/core/encoders/GzipEncoder.class    |   Bin 0 -> 1094 bytes
 .../com/ibm/juno/core/encoders/GzipEncoder.java |    44 +
 .../juno/core/encoders/IdentityEncoder.class    |   Bin 0 -> 959 bytes
 .../ibm/juno/core/encoders/IdentityEncoder.java |    43 +
 .../com/ibm/juno/core/encoders/package.html     |    53 +
 .../juno/core/filter/AnnotationBeanFilter.class |   Bin 0 -> 3014 bytes
 .../juno/core/filter/AnnotationBeanFilter.java  |    63 +
 .../com/ibm/juno/core/filter/BeanFilter.class   |   Bin 0 -> 5773 bytes
 .../com/ibm/juno/core/filter/BeanFilter.java    |   472 +
 .../juno/core/filter/Filter$FilterType.class    |   Bin 0 -> 1151 bytes
 .../com/ibm/juno/core/filter/Filter$NULL.class  |   Bin 0 -> 356 bytes
 .../core/com/ibm/juno/core/filter/Filter.class  |   Bin 0 -> 1942 bytes
 .../core/com/ibm/juno/core/filter/Filter.java   |   134 +
 .../juno/core/filter/InterfaceBeanFilter.class  |   Bin 0 -> 774 bytes
 .../juno/core/filter/InterfaceBeanFilter.java   |    35 +
 .../ibm/juno/core/filter/PojoFilter$NULL.class  |   Bin 0 -> 470 bytes
 .../com/ibm/juno/core/filter/PojoFilter.class   |   Bin 0 -> 4888 bytes
 .../com/ibm/juno/core/filter/PojoFilter.java    |   261 +
 .../ibm/juno/core/filter/SurrogateFilter.class  |   Bin 0 -> 4270 bytes
 .../ibm/juno/core/filter/SurrogateFilter.java   |   203 +
 .../ibm/juno/core/filter/doc-files/classes.dnx  |    99 +
 .../ibm/juno/core/filter/doc-files/classes.png  |   Bin 0 -> 15527 bytes
 .../core/com/ibm/juno/core/filter/package.html  |   764 +
 .../juno/core/filters/BeanStringFilter.class    |   Bin 0 -> 1046 bytes
 .../ibm/juno/core/filters/BeanStringFilter.java |    35 +
 .../core/filters/ByteArrayBase64Filter.class    |   Bin 0 -> 1765 bytes
 .../core/filters/ByteArrayBase64Filter.java     |    47 +
 .../core/filters/CalendarFilter$ISO8601DT.class |   Bin 0 -> 1965 bytes
 .../filters/CalendarFilter$ISO8601DTZ.class     |   Bin 0 -> 2313 bytes
 .../core/filters/CalendarFilter$Medium.class    |   Bin 0 -> 1182 bytes
 .../core/filters/CalendarFilter$RFC2822D.class  |   Bin 0 -> 1117 bytes
 .../core/filters/CalendarFilter$RFC2822DT.class |   Bin 0 -> 1136 bytes
 .../filters/CalendarFilter$RFC2822DTZ.class     |   Bin 0 -> 1214 bytes
 .../core/filters/CalendarFilter$Simple.class    |   Bin 0 -> 1119 bytes
 .../core/filters/CalendarFilter$ToString.class  |   Bin 0 -> 1134 bytes
 .../ibm/juno/core/filters/CalendarFilter.class  |   Bin 0 -> 4852 bytes
 .../ibm/juno/core/filters/CalendarFilter.java   |   289 +
 .../juno/core/filters/CalendarLongFilter.class  |   Bin 0 -> 2306 bytes
 .../juno/core/filters/CalendarLongFilter.java   |    52 +
 .../juno/core/filters/CalendarMapFilter.class   |   Bin 0 -> 3010 bytes
 .../juno/core/filters/CalendarMapFilter.java    |    60 +
 .../core/filters/DateFilter$ISO8601DT.class     |   Bin 0 -> 2816 bytes
 .../core/filters/DateFilter$ISO8601DTP.class    |   Bin 0 -> 526 bytes
 .../core/filters/DateFilter$ISO8601DTPNZ.class  |   Bin 0 -> 1115 bytes
 .../core/filters/DateFilter$ISO8601DTZ.class    |   Bin 0 -> 2173 bytes
 .../core/filters/DateFilter$ISO8601DTZP.class   |   Bin 0 -> 529 bytes
 .../juno/core/filters/DateFilter$Medium.class   |   Bin 0 -> 1154 bytes
 .../juno/core/filters/DateFilter$RFC2822D.class |   Bin 0 -> 1089 bytes
 .../core/filters/DateFilter$RFC2822DT.class     |   Bin 0 -> 1108 bytes
 .../core/filters/DateFilter$RFC2822DTZ.class    |   Bin 0 -> 1140 bytes
 .../juno/core/filters/DateFilter$Simple.class   |   Bin 0 -> 1091 bytes
 .../juno/core/filters/DateFilter$SimpleP.class  |   Bin 0 -> 1098 bytes
 .../juno/core/filters/DateFilter$ToString.class |   Bin 0 -> 1106 bytes
 .../com/ibm/juno/core/filters/DateFilter.class  |   Bin 0 -> 4397 bytes
 .../com/ibm/juno/core/filters/DateFilter.java   |   345 +
 .../ibm/juno/core/filters/DateLongFilter.class  |   Bin 0 -> 2119 bytes
 .../ibm/juno/core/filters/DateLongFilter.java   |    48 +
 .../ibm/juno/core/filters/DateMapFilter.class   |   Bin 0 -> 2437 bytes
 .../ibm/juno/core/filters/DateMapFilter.java    |    52 +
 .../juno/core/filters/EnumerationFilter.class   |   Bin 0 -> 1138 bytes
 .../juno/core/filters/EnumerationFilter.java    |    35 +
 .../ibm/juno/core/filters/IteratorFilter.class  |   Bin 0 -> 1102 bytes
 .../ibm/juno/core/filters/IteratorFilter.java   |    35 +
 .../juno/core/filters/ReaderFilter$Html.class   |   Bin 0 -> 828 bytes
 .../juno/core/filters/ReaderFilter$Json.class   |   Bin 0 -> 828 bytes
 .../core/filters/ReaderFilter$PlainText.class   |   Bin 0 -> 744 bytes
 .../juno/core/filters/ReaderFilter$Xml.class    |   Bin 0 -> 821 bytes
 .../ibm/juno/core/filters/ReaderFilter.class    |   Bin 0 -> 2399 bytes
 .../com/ibm/juno/core/filters/ReaderFilter.java |   108 +
 .../filters/XMLGregorianCalendarFilter.class    |   Bin 0 -> 2373 bytes
 .../filters/XMLGregorianCalendarFilter.java     |    60 +
 .../core/com/ibm/juno/core/filters/package.html |    59 +
 .../juno/core/html/HtmlBeanPropertyMeta.class   |   Bin 0 -> 2095 bytes
 .../juno/core/html/HtmlBeanPropertyMeta.java    |    86 +
 .../com/ibm/juno/core/html/HtmlClassMeta.class  |   Bin 0 -> 1516 bytes
 .../com/ibm/juno/core/html/HtmlClassMeta.java   |    88 +
 .../ibm/juno/core/html/HtmlDocSerializer.class  |   Bin 0 -> 6465 bytes
 .../ibm/juno/core/html/HtmlDocSerializer.java   |   162 +
 .../core/html/HtmlDocSerializerProperties.class |   Bin 0 -> 842 bytes
 .../core/html/HtmlDocSerializerProperties.java  |   165 +
 .../core/com/ibm/juno/core/html/HtmlLink.class  |   Bin 0 -> 579 bytes
 .../core/com/ibm/juno/core/html/HtmlLink.java   |    45 +
 .../com/ibm/juno/core/html/HtmlParser$Tag.class |   Bin 0 -> 6106 bytes
 .../com/ibm/juno/core/html/HtmlParser.class     |   Bin 0 -> 29140 bytes
 .../core/com/ibm/juno/core/html/HtmlParser.java |   743 +
 .../ibm/juno/core/html/HtmlParserContext.class  |   Bin 0 -> 2579 bytes
 .../ibm/juno/core/html/HtmlParserContext.java   |    78 +
 .../juno/core/html/HtmlParserProperties.class   |   Bin 0 -> 1025 bytes
 .../juno/core/html/HtmlParserProperties.java    |    52 +
 .../core/html/HtmlSchemaDocSerializer.class     |   Bin 0 -> 6504 bytes
 .../juno/core/html/HtmlSchemaDocSerializer.java |   144 +
 .../ibm/juno/core/html/HtmlSerializer$Sq.class  |   Bin 0 -> 6359 bytes
 .../core/html/HtmlSerializer$SqReadable.class   |   Bin 0 -> 681 bytes
 .../com/ibm/juno/core/html/HtmlSerializer.class |   Bin 0 -> 26106 bytes
 .../com/ibm/juno/core/html/HtmlSerializer.java  |   668 +
 .../juno/core/html/HtmlSerializerContext.class  |   Bin 0 -> 4126 bytes
 .../juno/core/html/HtmlSerializerContext.java   |   147 +
 .../core/html/HtmlSerializerProperties.class    |   Bin 0 -> 2912 bytes
 .../core/html/HtmlSerializerProperties.java     |   113 +
 .../juno/core/html/HtmlSerializerWriter.class   |   Bin 0 -> 14671 bytes
 .../juno/core/html/HtmlSerializerWriter.java    |   328 +
 .../core/html/HtmlStrippedDocSerializer.class   |   Bin 0 -> 2144 bytes
 .../core/html/HtmlStrippedDocSerializer.java    |    55 +
 .../ibm/juno/core/html/SimpleHtmlWriter.class   |   Bin 0 -> 623 bytes
 .../ibm/juno/core/html/SimpleHtmlWriter.java    |    36 +
 .../ibm/juno/core/html/annotation/Html.class    |   Bin 0 -> 648 bytes
 .../com/ibm/juno/core/html/annotation/Html.java |    54 +
 .../ibm/juno/core/html/annotation/package.html  |    34 +
 .../core/html/doc-files/HTML_DESCRIPTION.png    |   Bin 0 -> 3644 bytes
 .../ibm/juno/core/html/doc-files/HTML_LINKS.png |   Bin 0 -> 593 bytes
 .../ibm/juno/core/html/doc-files/HTML_TITLE.png |   Bin 0 -> 2435 bytes
 .../ibm/juno/core/html/dto/HtmlElement.class    |   Bin 0 -> 413 bytes
 .../com/ibm/juno/core/html/dto/HtmlElement.java |    23 +
 .../core/com/ibm/juno/core/html/dto/Img.class   |   Bin 0 -> 583 bytes
 .../core/com/ibm/juno/core/html/dto/Img.java    |    35 +
 .../com/ibm/juno/core/html/dto/package.html     |    34 +
 .../core/com/ibm/juno/core/html/package.html    |    72 +
 .../core/com/ibm/juno/core/ini/ConfigFile.class |   Bin 0 -> 13890 bytes
 .../core/com/ibm/juno/core/ini/ConfigFile.java  |   743 +
 .../ibm/juno/core/ini/ConfigFileFormat.class    |   Bin 0 -> 1108 bytes
 .../com/ibm/juno/core/ini/ConfigFileFormat.java |    25 +
 .../ibm/juno/core/ini/ConfigFileImpl$1$1.class  |   Bin 0 -> 2396 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$1.class    |   Bin 0 -> 1248 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$2$1.class  |   Bin 0 -> 2139 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$2.class    |   Bin 0 -> 1097 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$3$1.class  |   Bin 0 -> 2108 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$3.class    |   Bin 0 -> 1144 bytes
 .../ibm/juno/core/ini/ConfigFileImpl$4.class    |   Bin 0 -> 801 bytes
 .../com/ibm/juno/core/ini/ConfigFileImpl.class  |   Bin 0 -> 22336 bytes
 .../com/ibm/juno/core/ini/ConfigFileImpl.java   |   729 +
 .../ibm/juno/core/ini/ConfigFileListener.class  |   Bin 0 -> 904 bytes
 .../ibm/juno/core/ini/ConfigFileListener.java   |    42 +
 .../ibm/juno/core/ini/ConfigFileWrapped.class   |   Bin 0 -> 8325 bytes
 .../ibm/juno/core/ini/ConfigFileWrapped.java    |   259 +
 .../ibm/juno/core/ini/ConfigFileWritable.class  |   Bin 0 -> 1064 bytes
 .../ibm/juno/core/ini/ConfigFileWritable.java   |    40 +
 .../core/com/ibm/juno/core/ini/ConfigMgr.class  |   Bin 0 -> 8960 bytes
 .../core/com/ibm/juno/core/ini/ConfigMgr.java   |   312 +
 .../com/ibm/juno/core/ini/ConfigUtils.class     |   Bin 0 -> 1223 bytes
 .../core/com/ibm/juno/core/ini/ConfigUtils.java |    37 +
 .../core/com/ibm/juno/core/ini/Encoder.class    |   Bin 0 -> 210 bytes
 .../bin/core/com/ibm/juno/core/ini/Encoder.java |    35 +
 .../com/ibm/juno/core/ini/EntryListener.class   |   Bin 0 -> 1049 bytes
 .../com/ibm/juno/core/ini/EntryListener.java    |    44 +
 .../com/ibm/juno/core/ini/Section$1$1.class     |   Bin 0 -> 2658 bytes
 .../core/com/ibm/juno/core/ini/Section$1.class  |   Bin 0 -> 1159 bytes
 .../com/ibm/juno/core/ini/Section$2$1.class     |   Bin 0 -> 2384 bytes
 .../core/com/ibm/juno/core/ini/Section$2.class  |   Bin 0 -> 1034 bytes
 .../core/com/ibm/juno/core/ini/Section.class    |   Bin 0 -> 16089 bytes
 .../bin/core/com/ibm/juno/core/ini/Section.java |   577 +
 .../com/ibm/juno/core/ini/SectionListener.class |   Bin 0 -> 1776 bytes
 .../com/ibm/juno/core/ini/SectionListener.java  |    59 +
 .../core/com/ibm/juno/core/ini/XorEncoder.class |   Bin 0 -> 1552 bytes
 .../core/com/ibm/juno/core/ini/XorEncoder.java  |    46 +
 .../com/ibm/juno/core/ini/doc-files/config1.png |   Bin 0 -> 39851 bytes
 .../com/ibm/juno/core/ini/doc-files/config2.png |   Bin 0 -> 48881 bytes
 .../com/ibm/juno/core/ini/doc-files/config3.png |   Bin 0 -> 59095 bytes
 .../bin/core/com/ibm/juno/core/ini/package.html |   643 +
 .../core/com/ibm/juno/core/jena/Constants.class |   Bin 0 -> 974 bytes
 .../core/com/ibm/juno/core/jena/Constants.java  |    91 +
 .../juno/core/jena/RdfBeanPropertyMeta.class    |   Bin 0 -> 2183 bytes
 .../ibm/juno/core/jena/RdfBeanPropertyMeta.java |    78 +
 .../com/ibm/juno/core/jena/RdfClassMeta.class   |   Bin 0 -> 1937 bytes
 .../com/ibm/juno/core/jena/RdfClassMeta.java    |    82 +
 .../juno/core/jena/RdfCollectionFormat.class    |   Bin 0 -> 1245 bytes
 .../ibm/juno/core/jena/RdfCollectionFormat.java |    52 +
 .../com/ibm/juno/core/jena/RdfParser$N3.class   |   Bin 0 -> 5394 bytes
 .../ibm/juno/core/jena/RdfParser$NTriple.class  |   Bin 0 -> 5426 bytes
 .../ibm/juno/core/jena/RdfParser$Turtle.class   |   Bin 0 -> 5419 bytes
 .../com/ibm/juno/core/jena/RdfParser$Xml.class  |   Bin 0 -> 5412 bytes
 .../core/com/ibm/juno/core/jena/RdfParser.class |   Bin 0 -> 27508 bytes
 .../core/com/ibm/juno/core/jena/RdfParser.java  |   527 +
 .../ibm/juno/core/jena/RdfParserContext.class   |   Bin 0 -> 5754 bytes
 .../ibm/juno/core/jena/RdfParserContext.java    |   136 +
 .../juno/core/jena/RdfParserProperties.class    |   Bin 0 -> 1594 bytes
 .../ibm/juno/core/jena/RdfParserProperties.java |    68 +
 .../ibm/juno/core/jena/RdfProperties$1.class    |   Bin 0 -> 826 bytes
 .../com/ibm/juno/core/jena/RdfProperties.class  |   Bin 0 -> 4532 bytes
 .../com/ibm/juno/core/jena/RdfProperties.java   |   415 +
 .../ibm/juno/core/jena/RdfSerializer$1.class    |   Bin 0 -> 891 bytes
 .../ibm/juno/core/jena/RdfSerializer$N3.class   |   Bin 0 -> 5068 bytes
 .../juno/core/jena/RdfSerializer$NTriple.class  |   Bin 0 -> 5100 bytes
 .../juno/core/jena/RdfSerializer$Turtle.class   |   Bin 0 -> 5093 bytes
 .../ibm/juno/core/jena/RdfSerializer$Xml.class  |   Bin 0 -> 5086 bytes
 .../core/jena/RdfSerializer$XmlAbbrev.class     |   Bin 0 -> 5152 bytes
 .../com/ibm/juno/core/jena/RdfSerializer.class  |   Bin 0 -> 23240 bytes
 .../com/ibm/juno/core/jena/RdfSerializer.java   |   466 +
 .../juno/core/jena/RdfSerializerContext.class   |   Bin 0 -> 6787 bytes
 .../juno/core/jena/RdfSerializerContext.java    |   135 +
 .../core/jena/RdfSerializerProperties.class     |   Bin 0 -> 1772 bytes
 .../juno/core/jena/RdfSerializerProperties.java |    80 +
 .../core/com/ibm/juno/core/jena/RdfUtils.class  |   Bin 0 -> 3704 bytes
 .../core/com/ibm/juno/core/jena/RdfUtils.java   |    87 +
 .../com/ibm/juno/core/jena/annotation/Rdf.class |   Bin 0 -> 757 bytes
 .../com/ibm/juno/core/jena/annotation/Rdf.java  |    58 +
 .../ibm/juno/core/jena/annotation/RdfNs.class   |   Bin 0 -> 488 bytes
 .../ibm/juno/core/jena/annotation/RdfNs.java    |    37 +
 .../juno/core/jena/annotation/RdfSchema.class   |   Bin 0 -> 658 bytes
 .../juno/core/jena/annotation/RdfSchema.java    |    94 +
 .../ibm/juno/core/jena/annotation/package.html  |    34 +
 .../juno/core/jena/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/jena/doc-files/Example_N3.png |   Bin 0 -> 37430 bytes
 .../core/jena/doc-files/Example_NTriple.png     |   Bin 0 -> 48413 bytes
 .../juno/core/jena/doc-files/Example_RDFXML.png |   Bin 0 -> 30486 bytes
 .../jena/doc-files/Example_RDFXMLABBREV.png     |   Bin 0 -> 30356 bytes
 .../juno/core/jena/doc-files/Example_Turtle.png |   Bin 0 -> 35328 bytes
 .../core/com/ibm/juno/core/jena/package.html    |  1687 +++
 .../core/jso/JavaSerializedObjectParser.class   |   Bin 0 -> 2598 bytes
 .../core/jso/JavaSerializedObjectParser.java    |    55 +
 .../jso/JavaSerializedObjectSerializer.class    |   Bin 0 -> 2227 bytes
 .../jso/JavaSerializedObjectSerializer.java     |    52 +
 .../bin/core/com/ibm/juno/core/jso/package.html |    34 +
 .../com/ibm/juno/core/json/JsonClassMeta.class  |   Bin 0 -> 1237 bytes
 .../com/ibm/juno/core/json/JsonClassMeta.java   |    55 +
 .../com/ibm/juno/core/json/JsonParser.class     |   Bin 0 -> 30289 bytes
 .../core/com/ibm/juno/core/json/JsonParser.java |   852 ++
 .../ibm/juno/core/json/JsonParserContext.class  |   Bin 0 -> 2067 bytes
 .../ibm/juno/core/json/JsonParserContext.java   |    69 +
 .../juno/core/json/JsonParserProperties.class   |   Bin 0 -> 1648 bytes
 .../juno/core/json/JsonParserProperties.java    |    85 +
 .../juno/core/json/JsonSchemaSerializer.class   |   Bin 0 -> 7569 bytes
 .../juno/core/json/JsonSchemaSerializer.java    |   154 +
 .../core/json/JsonSerializer$Readable.class     |   Bin 0 -> 5118 bytes
 .../juno/core/json/JsonSerializer$Simple.class  |   Bin 0 -> 5351 bytes
 .../json/JsonSerializer$SimpleReadable.class    |   Bin 0 -> 750 bytes
 .../JsonSerializer$SimpleReadableSafe.class     |   Bin 0 -> 731 bytes
 .../com/ibm/juno/core/json/JsonSerializer.class |   Bin 0 -> 18306 bytes
 .../com/ibm/juno/core/json/JsonSerializer.java  |   457 +
 .../juno/core/json/JsonSerializerContext.class  |   Bin 0 -> 2584 bytes
 .../juno/core/json/JsonSerializerContext.java   |    89 +
 .../core/json/JsonSerializerProperties.class    |   Bin 0 -> 1841 bytes
 .../core/json/JsonSerializerProperties.java     |    91 +
 .../juno/core/json/JsonSerializerWriter.class   |   Bin 0 -> 8041 bytes
 .../juno/core/json/JsonSerializerWriter.java    |   262 +
 .../ibm/juno/core/json/annotation/Json.class    |   Bin 0 -> 549 bytes
 .../com/ibm/juno/core/json/annotation/Json.java |    72 +
 .../ibm/juno/core/json/annotation/package.html  |    34 +
 .../juno/core/json/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../juno/core/json/doc-files/Example_JSON.png   |   Bin 0 -> 26954 bytes
 .../core/json/doc-files/Example_JSONSchema.png  |   Bin 0 -> 34114 bytes
 .../core/json/doc-files/Example_JSONSimple.png  |   Bin 0 -> 30920 bytes
 .../core/com/ibm/juno/core/json/package.html    |  1460 ++
 .../bin/core/com/ibm/juno/core/package.html     |   210 +
 .../juno/core/parser/InputStreamParser.class    |   Bin 0 -> 1249 bytes
 .../ibm/juno/core/parser/InputStreamParser.java |    52 +
 .../ibm/juno/core/parser/ParseException.class   |   Bin 0 -> 2158 bytes
 .../ibm/juno/core/parser/ParseException.java    |    81 +
 .../core/com/ibm/juno/core/parser/Parser.class  |   Bin 0 -> 13715 bytes
 .../core/com/ibm/juno/core/parser/Parser.java   |   573 +
 .../ibm/juno/core/parser/ParserContext.class    |   Bin 0 -> 3288 bytes
 .../com/ibm/juno/core/parser/ParserContext.java |   132 +
 .../core/parser/ParserGroup$ParserEntry.class   |   Bin 0 -> 1860 bytes
 .../com/ibm/juno/core/parser/ParserGroup.class  |   Bin 0 -> 8908 bytes
 .../com/ibm/juno/core/parser/ParserGroup.java   |   317 +
 .../ibm/juno/core/parser/ParserListener.class   |   Bin 0 -> 795 bytes
 .../ibm/juno/core/parser/ParserListener.java    |    40 +
 .../ibm/juno/core/parser/ParserProperties.class |   Bin 0 -> 1341 bytes
 .../ibm/juno/core/parser/ParserProperties.java  |    57 +
 .../com/ibm/juno/core/parser/ParserReader.class |   Bin 0 -> 5140 bytes
 .../com/ibm/juno/core/parser/ParserReader.java  |   379 +
 .../com/ibm/juno/core/parser/ReaderParser.class |   Bin 0 -> 13034 bytes
 .../com/ibm/juno/core/parser/ReaderParser.java  |   394 +
 .../core/com/ibm/juno/core/parser/package.html  |   126 +
 .../juno/core/plaintext/PlainTextParser.class   |   Bin 0 -> 2659 bytes
 .../juno/core/plaintext/PlainTextParser.java    |    68 +
 .../core/plaintext/PlainTextSerializer.class    |   Bin 0 -> 2441 bytes
 .../core/plaintext/PlainTextSerializer.java     |    66 +
 .../com/ibm/juno/core/plaintext/package.html    |    34 +
 .../serializer/OutputStreamSerializer.class     |   Bin 0 -> 1086 bytes
 .../core/serializer/OutputStreamSerializer.java |    51 +
 .../core/serializer/SerializeException.class    |   Bin 0 -> 1312 bytes
 .../core/serializer/SerializeException.java     |    53 +
 .../ibm/juno/core/serializer/Serializer.class   |   Bin 0 -> 12341 bytes
 .../ibm/juno/core/serializer/Serializer.java    |   377 +
 .../core/serializer/SerializerContext$1.class   |   Bin 0 -> 260 bytes
 .../SerializerContext$StackElement.class        |   Bin 0 -> 2647 bytes
 .../core/serializer/SerializerContext.class     |   Bin 0 -> 11485 bytes
 .../juno/core/serializer/SerializerContext.java |   464 +
 .../SerializerGroup$SerializerEntry.class       |   Bin 0 -> 1944 bytes
 .../juno/core/serializer/SerializerGroup.class  |   Bin 0 -> 9261 bytes
 .../juno/core/serializer/SerializerGroup.java   |   345 +
 .../core/serializer/SerializerProperties.class  |   Bin 0 -> 3865 bytes
 .../core/serializer/SerializerProperties.java   |   303 +
 .../juno/core/serializer/SerializerWriter.class |   Bin 0 -> 4439 bytes
 .../juno/core/serializer/SerializerWriter.java  |   308 +
 .../ibm/juno/core/serializer/StringObject.class |   Bin 0 -> 1887 bytes
 .../ibm/juno/core/serializer/StringObject.java  |    81 +
 .../juno/core/serializer/WriterSerializer.class |   Bin 0 -> 5593 bytes
 .../juno/core/serializer/WriterSerializer.java  |   162 +
 .../com/ibm/juno/core/serializer/package.html   |   128 +
 .../ibm/juno/core/soap/SoapXmlSerializer.class  |   Bin 0 -> 2914 bytes
 .../ibm/juno/core/soap/SoapXmlSerializer.java   |    78 +
 .../core/soap/SoapXmlSerializerProperties.class |   Bin 0 -> 460 bytes
 .../core/soap/SoapXmlSerializerProperties.java  |    24 +
 .../core/com/ibm/juno/core/soap/package.html    |    34 +
 .../core/urlencoding/UonParser$Decoding.class   |   Bin 0 -> 5450 bytes
 .../ibm/juno/core/urlencoding/UonParser.class   |   Bin 0 -> 30286 bytes
 .../ibm/juno/core/urlencoding/UonParser.java    |   861 ++
 .../core/urlencoding/UonParserContext.class     |   Bin 0 -> 2541 bytes
 .../juno/core/urlencoding/UonParserContext.java |    75 +
 .../core/urlencoding/UonParserProperties.class  |   Bin 0 -> 1690 bytes
 .../core/urlencoding/UonParserProperties.java   |    76 +
 .../juno/core/urlencoding/UonParserReader.class |   Bin 0 -> 3739 bytes
 .../juno/core/urlencoding/UonParserReader.java  |   195 +
 .../urlencoding/UonSerializer$Encoding.class    |   Bin 0 -> 5128 bytes
 .../urlencoding/UonSerializer$Readable.class    |   Bin 0 -> 5176 bytes
 .../core/urlencoding/UonSerializer$Simple.class |   Bin 0 -> 5267 bytes
 .../UonSerializer$SimpleEncoding.class          |   Bin 0 -> 5337 bytes
 .../juno/core/urlencoding/UonSerializer.class   |   Bin 0 -> 18291 bytes
 .../juno/core/urlencoding/UonSerializer.java    |   532 +
 .../core/urlencoding/UonSerializerContext.class |   Bin 0 -> 2838 bytes
 .../core/urlencoding/UonSerializerContext.java  |    97 +
 .../urlencoding/UonSerializerProperties.class   |   Bin 0 -> 1846 bytes
 .../urlencoding/UonSerializerProperties.java    |   135 +
 .../core/urlencoding/UonSerializerWriter.class  |   Bin 0 -> 8068 bytes
 .../core/urlencoding/UonSerializerWriter.java   |   265 +
 .../core/urlencoding/UrlEncodingClassMeta.class |   Bin 0 -> 1183 bytes
 .../core/urlencoding/UrlEncodingClassMeta.java  |    55 +
 .../core/urlencoding/UrlEncodingParser.class    |   Bin 0 -> 26192 bytes
 .../core/urlencoding/UrlEncodingParser.java     |   568 +
 .../urlencoding/UrlEncodingProperties.class     |   Bin 0 -> 1563 bytes
 .../core/urlencoding/UrlEncodingProperties.java |    82 +
 .../UrlEncodingSerializer$Readable.class        |   Bin 0 -> 6286 bytes
 .../UrlEncodingSerializer$Simple.class          |   Bin 0 -> 6473 bytes
 .../UrlEncodingSerializer$SimpleExpanded.class  |   Bin 0 -> 975 bytes
 .../urlencoding/UrlEncodingSerializer.class     |   Bin 0 -> 19689 bytes
 .../core/urlencoding/UrlEncodingSerializer.java |   515 +
 .../urlencoding/annotation/UrlEncoding.class    |   Bin 0 -> 558 bytes
 .../urlencoding/annotation/UrlEncoding.java     |    37 +
 .../core/urlencoding/annotation/package.html    |    34 +
 .../core/urlencoding/doc-files/Example_HTML.png |   Bin 0 -> 32778 bytes
 .../doc-files/Example_UrlEncoding.png           |   Bin 0 -> 20958 bytes
 .../juno/core/urlencoding/doc-files/rfc_uon.txt |   352 +
 .../com/ibm/juno/core/urlencoding/package.html  |  1410 ++
 .../bin/core/com/ibm/juno/core/utils/Args.class |   Bin 0 -> 3493 bytes
 .../bin/core/com/ibm/juno/core/utils/Args.java  |   240 +
 .../ibm/juno/core/utils/ArrayUtils$1$1.class    |   Bin 0 -> 1297 bytes
 .../com/ibm/juno/core/utils/ArrayUtils$1.class  |   Bin 0 -> 919 bytes
 .../com/ibm/juno/core/utils/ArrayUtils$2.class  |   Bin 0 -> 1346 bytes
 .../com/ibm/juno/core/utils/ArrayUtils.class    |   Bin 0 -> 5994 bytes
 .../com/ibm/juno/core/utils/ArrayUtils.java     |   273 +
 .../core/com/ibm/juno/core/utils/AsciiSet.class |   Bin 0 -> 847 bytes
 .../core/com/ibm/juno/core/utils/AsciiSet.java  |    55 +
 .../ibm/juno/core/utils/ByteArrayCache$1.class  |   Bin 0 -> 241 bytes
 .../core/utils/ByteArrayCache$ByteArray.class   |   Bin 0 -> 1404 bytes
 .../ibm/juno/core/utils/ByteArrayCache.class    |   Bin 0 -> 1763 bytes
 .../com/ibm/juno/core/utils/ByteArrayCache.java |   102 +
 .../juno/core/utils/ByteArrayInOutStream.class  |   Bin 0 -> 568 bytes
 .../juno/core/utils/ByteArrayInOutStream.java   |    28 +
 .../juno/core/utils/CharSequenceReader.class    |   Bin 0 -> 2106 bytes
 .../ibm/juno/core/utils/CharSequenceReader.java |    96 +
 .../core/utils/ClassUtils$ClassComparator.class |   Bin 0 -> 1263 bytes
 .../com/ibm/juno/core/utils/ClassUtils.class    |   Bin 0 -> 4921 bytes
 .../com/ibm/juno/core/utils/ClassUtils.java     |   211 +
 .../ibm/juno/core/utils/CollectionUtils.class   |   Bin 0 -> 1720 bytes
 .../ibm/juno/core/utils/CollectionUtils.java    |    53 +
 .../ibm/juno/core/utils/DelegateBeanMap$1.class |   Bin 0 -> 244 bytes
 .../DelegateBeanMap$BeanMapEntryOverride.class  |   Bin 0 -> 1885 bytes
 .../ibm/juno/core/utils/DelegateBeanMap.class   |   Bin 0 -> 4741 bytes
 .../ibm/juno/core/utils/DelegateBeanMap.java    |   111 +
 .../com/ibm/juno/core/utils/DelegateList.class  |   Bin 0 -> 1022 bytes
 .../com/ibm/juno/core/utils/DelegateList.java   |    35 +
 .../com/ibm/juno/core/utils/DelegateMap.class   |   Bin 0 -> 1863 bytes
 .../com/ibm/juno/core/utils/DelegateMap.java    |    50 +
 .../com/ibm/juno/core/utils/FileUtils.class     |   Bin 0 -> 2910 bytes
 .../core/com/ibm/juno/core/utils/FileUtils.java |   130 +
 .../com/ibm/juno/core/utils/FilteredMap$1.class |   Bin 0 -> 1489 bytes
 .../juno/core/utils/FilteredMap$ListSet.class   |   Bin 0 -> 1042 bytes
 .../com/ibm/juno/core/utils/FilteredMap.class   |   Bin 0 -> 2318 bytes
 .../com/ibm/juno/core/utils/FilteredMap.java    |    92 +
 .../juno/core/utils/IOPipe$LineProcessor.class  |   Bin 0 -> 273 bytes
 .../core/com/ibm/juno/core/utils/IOPipe.class   |   Bin 0 -> 4317 bytes
 .../core/com/ibm/juno/core/utils/IOPipe.java    |   208 +
 .../core/com/ibm/juno/core/utils/IOUtils.class  |   Bin 0 -> 6538 bytes
 .../core/com/ibm/juno/core/utils/IOUtils.java   |   352 +
 .../com/ibm/juno/core/utils/IdentityList.class  |   Bin 0 -> 1207 bytes
 .../com/ibm/juno/core/utils/IdentityList.java   |    45 +
 .../com/ibm/juno/core/utils/KeywordSet.class    |   Bin 0 -> 1797 bytes
 .../com/ibm/juno/core/utils/KeywordSet.java     |    86 +
 .../ibm/juno/core/utils/MultiIterable$1.class   |   Bin 0 -> 1689 bytes
 .../com/ibm/juno/core/utils/MultiIterable.class |   Bin 0 -> 1790 bytes
 .../com/ibm/juno/core/utils/MultiIterable.java  |    74 +
 .../com/ibm/juno/core/utils/MultiSet$1.class    |   Bin 0 -> 1856 bytes
 .../core/com/ibm/juno/core/utils/MultiSet.class |   Bin 0 -> 2492 bytes
 .../core/com/ibm/juno/core/utils/MultiSet.java  |   107 +
 .../ibm/juno/core/utils/PojoIntrospector.class  |   Bin 0 -> 2768 bytes
 .../ibm/juno/core/utils/PojoIntrospector.java   |   113 +
 .../com/ibm/juno/core/utils/PojoQuery$1.class   |   Bin 0 -> 1489 bytes
 .../juno/core/utils/PojoQuery$CalendarP.class   |   Bin 0 -> 1287 bytes
 .../core/utils/PojoQuery$CollectionFilter.class |   Bin 0 -> 1491 bytes
 .../juno/core/utils/PojoQuery$DateMatcher.class |   Bin 0 -> 1496 bytes
 .../juno/core/utils/PojoQuery$IMatcher.class    |   Bin 0 -> 335 bytes
 .../juno/core/utils/PojoQuery$MapMatcher.class  |   Bin 0 -> 3150 bytes
 .../core/utils/PojoQuery$NumberMatcher.class    |   Bin 0 -> 1256 bytes
 .../core/utils/PojoQuery$NumberPattern.class    |   Bin 0 -> 3588 bytes
 .../juno/core/utils/PojoQuery$NumberRange.class |   Bin 0 -> 1386 bytes
 .../core/utils/PojoQuery$ObjectMatcher.class    |   Bin 0 -> 2209 bytes
 .../core/utils/PojoQuery$SearchPattern.class    |   Bin 0 -> 5144 bytes
 .../core/utils/PojoQuery$StringMatcher.class    |   Bin 0 -> 1215 bytes
 .../core/utils/PojoQuery$TimestampPattern.class |   Bin 0 -> 3265 bytes
 .../core/utils/PojoQuery$TimestampRange.class   |   Bin 0 -> 2063 bytes
 .../com/ibm/juno/core/utils/PojoQuery.class     |   Bin 0 -> 13850 bytes
 .../core/com/ibm/juno/core/utils/PojoQuery.java |  1246 ++
 .../ibm/juno/core/utils/PojoRest$JsonNode.class |   Bin 0 -> 1337 bytes
 .../core/com/ibm/juno/core/utils/PojoRest.class |   Bin 0 -> 15155 bytes
 .../core/com/ibm/juno/core/utils/PojoRest.java  |   843 ++
 .../ibm/juno/core/utils/PojoRestException.class |   Bin 0 -> 865 bytes
 .../ibm/juno/core/utils/PojoRestException.java  |    56 +
 .../com/ibm/juno/core/utils/ProcBuilder$1.class |   Bin 0 -> 1118 bytes
 .../com/ibm/juno/core/utils/ProcBuilder$2.class |   Bin 0 -> 532 bytes
 .../com/ibm/juno/core/utils/ProcBuilder$3.class |   Bin 0 -> 695 bytes
 .../com/ibm/juno/core/utils/ProcBuilder$4.class |   Bin 0 -> 695 bytes
 .../com/ibm/juno/core/utils/ProcBuilder$5.class |   Bin 0 -> 736 bytes
 .../juno/core/utils/ProcBuilder$Matcher.class   |   Bin 0 -> 428 bytes
 .../com/ibm/juno/core/utils/ProcBuilder.class   |   Bin 0 -> 8917 bytes
 .../com/ibm/juno/core/utils/ProcBuilder.java    |   382 +
 .../ibm/juno/core/utils/ReflectionUtils.class   |   Bin 0 -> 4418 bytes
 .../ibm/juno/core/utils/ReflectionUtils.java    |   159 +
 .../juno/core/utils/SafeResourceBundle.class    |   Bin 0 -> 4521 bytes
 .../ibm/juno/core/utils/SafeResourceBundle.java |   132 +
 .../core/utils/SafeResourceMultiBundle.class    |   Bin 0 -> 3417 bytes
 .../core/utils/SafeResourceMultiBundle.java     |    82 +
 .../com/ibm/juno/core/utils/SimpleMap$1.class   |   Bin 0 -> 226 bytes
 .../core/utils/SimpleMap$SimpleMapEntry.class   |   Bin 0 -> 1667 bytes
 .../com/ibm/juno/core/utils/SimpleMap.class     |   Bin 0 -> 3232 bytes
 .../core/com/ibm/juno/core/utils/SimpleMap.java |   112 +
 .../juno/core/utils/StringBuilderWriter.class   |   Bin 0 -> 3183 bytes
 .../juno/core/utils/StringBuilderWriter.java    |    95 +
 .../com/ibm/juno/core/utils/StringUtils.class   |   Bin 0 -> 17281 bytes
 .../com/ibm/juno/core/utils/StringUtils.java    |   873 ++
 .../com/ibm/juno/core/utils/StringVar.class     |   Bin 0 -> 480 bytes
 .../core/com/ibm/juno/core/utils/StringVar.java |    37 +
 .../juno/core/utils/StringVarMultipart.class    |   Bin 0 -> 804 bytes
 .../ibm/juno/core/utils/StringVarMultipart.java |    32 +
 .../juno/core/utils/StringVarResolver$1.class   |   Bin 0 -> 658 bytes
 .../juno/core/utils/StringVarResolver$2.class   |   Bin 0 -> 663 bytes
 .../ibm/juno/core/utils/StringVarResolver.class |   Bin 0 -> 5316 bytes
 .../ibm/juno/core/utils/StringVarResolver.java  |   357 +
 .../juno/core/utils/StringVarWithDefault.class  |   Bin 0 -> 852 bytes
 .../juno/core/utils/StringVarWithDefault.java   |    31 +
 .../ibm/juno/core/utils/TeeOutputStream$1.class |   Bin 0 -> 244 bytes
 .../TeeOutputStream$NoCloseOutputStream.class   |   Bin 0 -> 1315 bytes
 .../ibm/juno/core/utils/TeeOutputStream.class   |   Bin 0 -> 3666 bytes
 .../ibm/juno/core/utils/TeeOutputStream.java    |   159 +
 .../com/ibm/juno/core/utils/TeeWriter$1.class   |   Bin 0 -> 226 bytes
 .../core/utils/TeeWriter$NoCloseWriter.class    |   Bin 0 -> 1132 bytes
 .../com/ibm/juno/core/utils/TeeWriter.class     |   Bin 0 -> 3489 bytes
 .../core/com/ibm/juno/core/utils/TeeWriter.java |   161 +
 .../ibm/juno/core/utils/ThrowableUtils.class    |   Bin 0 -> 1565 bytes
 .../com/ibm/juno/core/utils/ThrowableUtils.java |    67 +
 .../juno/core/utils/ZipFileList$FileEntry.class |   Bin 0 -> 2495 bytes
 .../core/utils/ZipFileList$ZipFileEntry.class   |   Bin 0 -> 328 bytes
 .../com/ibm/juno/core/utils/ZipFileList.class   |   Bin 0 -> 951 bytes
 .../com/ibm/juno/core/utils/ZipFileList.java    |   136 +
 .../core/com/ibm/juno/core/utils/package.html   |    53 +
 .../core/com/ibm/juno/core/xml/Namespace.class  |   Bin 0 -> 1697 bytes
 .../core/com/ibm/juno/core/xml/Namespace.java   |    81 +
 .../ibm/juno/core/xml/NamespaceFactory.class    |   Bin 0 -> 3707 bytes
 .../com/ibm/juno/core/xml/NamespaceFactory.java |   126 +
 .../com/ibm/juno/core/xml/XmlBeanMeta.class     |   Bin 0 -> 4650 bytes
 .../core/com/ibm/juno/core/xml/XmlBeanMeta.java |   125 +
 .../ibm/juno/core/xml/XmlBeanPropertyMeta.class |   Bin 0 -> 5522 bytes
 .../ibm/juno/core/xml/XmlBeanPropertyMeta.java  |   159 +
 .../com/ibm/juno/core/xml/XmlClassMeta.class    |   Bin 0 -> 2602 bytes
 .../com/ibm/juno/core/xml/XmlClassMeta.java     |   114 +
 .../juno/core/xml/XmlContentHandler$NULL.class  |   Bin 0 -> 329 bytes
 .../ibm/juno/core/xml/XmlContentHandler.class   |   Bin 0 -> 618 bytes
 .../ibm/juno/core/xml/XmlContentHandler.java    |   135 +
 .../juno/core/xml/XmlDocSerializer$Simple.class |   Bin 0 -> 1273 bytes
 .../ibm/juno/core/xml/XmlDocSerializer.class    |   Bin 0 -> 1722 bytes
 .../com/ibm/juno/core/xml/XmlDocSerializer.java |    62 +
 .../core/com/ibm/juno/core/xml/XmlParser.class  |   Bin 0 -> 27091 bytes
 .../core/com/ibm/juno/core/xml/XmlParser.java   |   558 +
 .../ibm/juno/core/xml/XmlParserContext.class    |   Bin 0 -> 5612 bytes
 .../com/ibm/juno/core/xml/XmlParserContext.java |   213 +
 .../ibm/juno/core/xml/XmlParserProperties.class |   Bin 0 -> 3808 bytes
 .../ibm/juno/core/xml/XmlParserProperties.java  |   244 +
 .../juno/core/xml/XmlSchemaDocSerializer.class  |   Bin 0 -> 1651 bytes
 .../juno/core/xml/XmlSchemaDocSerializer.java   |    50 +
 .../juno/core/xml/XmlSchemaSerializer$1.class   |   Bin 0 -> 2397 bytes
 .../xml/XmlSchemaSerializer$QueueEntry.class    |   Bin 0 -> 941 bytes
 .../core/xml/XmlSchemaSerializer$Schema.class   |   Bin 0 -> 12084 bytes
 .../core/xml/XmlSchemaSerializer$Schemas.class  |   Bin 0 -> 7798 bytes
 .../ibm/juno/core/xml/XmlSchemaSerializer.class |   Bin 0 -> 7423 bytes
 .../ibm/juno/core/xml/XmlSchemaSerializer.java  |   588 +
 .../juno/core/xml/XmlSerializer$Simple.class    |   Bin 0 -> 5193 bytes
 .../juno/core/xml/XmlSerializer$SimpleSq.class  |   Bin 0 -> 672 bytes
 .../xml/XmlSerializer$SimpleXmlJsonSq.class     |   Bin 0 -> 702 bytes
 .../ibm/juno/core/xml/XmlSerializer$Sq.class    |   Bin 0 -> 5030 bytes
 .../core/xml/XmlSerializer$SqReadable.class     |   Bin 0 -> 670 bytes
 .../juno/core/xml/XmlSerializer$XmlJson.class   |   Bin 0 -> 5194 bytes
 .../juno/core/xml/XmlSerializer$XmlJsonSq.class |   Bin 0 -> 677 bytes
 .../com/ibm/juno/core/xml/XmlSerializer.class   |   Bin 0 -> 24665 bytes
 .../com/ibm/juno/core/xml/XmlSerializer.java    |   725 +
 .../juno/core/xml/XmlSerializerContext.class    |   Bin 0 -> 5905 bytes
 .../ibm/juno/core/xml/XmlSerializerContext.java |   202 +
 .../juno/core/xml/XmlSerializerProperties.class |   Bin 0 -> 3403 bytes
 .../juno/core/xml/XmlSerializerProperties.java  |   171 +
 .../ibm/juno/core/xml/XmlSerializerWriter.class |   Bin 0 -> 10717 bytes
 .../ibm/juno/core/xml/XmlSerializerWriter.java  |   662 +
 .../core/com/ibm/juno/core/xml/XmlUtils.class   |   Bin 0 -> 12146 bytes
 .../core/com/ibm/juno/core/xml/XmlUtils.java    |   569 +
 .../com/ibm/juno/core/xml/annotation/Xml.class  |   Bin 0 -> 1110 bytes
 .../com/ibm/juno/core/xml/annotation/Xml.java   |   197 +
 .../juno/core/xml/annotation/XmlFormat.class    |   Bin 0 -> 1239 bytes
 .../ibm/juno/core/xml/annotation/XmlFormat.java |    53 +
 .../ibm/juno/core/xml/annotation/XmlNs.class    |   Bin 0 -> 487 bytes
 .../com/ibm/juno/core/xml/annotation/XmlNs.java |    37 +
 .../juno/core/xml/annotation/XmlSchema.class    |   Bin 0 -> 656 bytes
 .../ibm/juno/core/xml/annotation/XmlSchema.java |    94 +
 .../ibm/juno/core/xml/annotation/package.html   |    34 +
 .../juno/core/xml/doc-files/Example_HTML.png    |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/xml/doc-files/Example_XML.png |   Bin 0 -> 32865 bytes
 .../core/xml/doc-files/Example_XMLSchema.png    |   Bin 0 -> 45685 bytes
 .../core/xml/doc-files/Example_XMLSimple.png    |   Bin 0 -> 34372 bytes
 .../bin/core/com/ibm/juno/core/xml/package.html |  2321 +++
 .../bin/core/doc-files/Microservices.1.png      |   Bin 0 -> 22345 bytes
 .../doc-files/Samples.AddressBookResource.1.png |   Bin 0 -> 44553 bytes
 .../doc-files/Samples.AddressBookResource.2.png |   Bin 0 -> 224346 bytes
 .../Samples.AddressBookResource.Demo.1.png      |   Bin 0 -> 17539 bytes
 .../Samples.AddressBookResource.Demo.10.png     |   Bin 0 -> 37153 bytes
 .../Samples.AddressBookResource.Demo.2.png      |   Bin 0 -> 47285 bytes
 .../Samples.AddressBookResource.Demo.3.png      |   Bin 0 -> 40911 bytes
 .../Samples.AddressBookResource.Demo.4.png      |   Bin 0 -> 40461 bytes
 .../Samples.AddressBookResource.Demo.5.png      |   Bin 0 -> 49884 bytes
 .../Samples.AddressBookResource.Demo.6.png      |   Bin 0 -> 52332 bytes
 .../Samples.AddressBookResource.Demo.7.png      |   Bin 0 -> 39401 bytes
 .../Samples.AddressBookResource.Demo.8.png      |   Bin 0 -> 34154 bytes
 .../Samples.AddressBookResource.Demo.9.png      |   Bin 0 -> 51831 bytes
 ...les.AddressBookResource.Introspectable.1.png |   Bin 0 -> 21714 bytes
 .../Samples.AddressBookResource.Queryable.1.png |   Bin 0 -> 43970 bytes
 .../Samples.AddressBookResource.Queryable.2.png |   Bin 0 -> 35177 bytes
 .../Samples.AddressBookResource.Queryable.3.png |   Bin 0 -> 35137 bytes
 ...amples.AddressBookResource.Traversable.1.png |   Bin 0 -> 28868 bytes
 ...amples.AddressBookResource.Traversable.2.png |   Bin 0 -> 20464 bytes
 .../doc-files/Samples.AtomFeedResource.1.png    |   Bin 0 -> 45184 bytes
 .../doc-files/Samples.AtomFeedResource.2.png    |   Bin 0 -> 78940 bytes
 .../doc-files/Samples.AtomFeedResource.3.png    |   Bin 0 -> 28698 bytes
 .../bin/core/doc-files/Samples.Building.1.png   |   Bin 0 -> 14082 bytes
 .../bin/core/doc-files/Samples.Building.2.png   |   Bin 0 -> 5543 bytes
 .../core/doc-files/Samples.ConfigResource.1.png |   Bin 0 -> 38071 bytes
 .../core/doc-files/Samples.ConfigResource.2.png |   Bin 0 -> 42599 bytes
 .../core/doc-files/Samples.ConfigResource.3.png |   Bin 0 -> 41856 bytes
 .../Samples.DockerRegistryResource.1.png        |   Bin 0 -> 16230 bytes
 .../Samples.DockerRegistryResource.2.png        |   Bin 0 -> 23808 bytes
 .../doc-files/Samples.HelloWorldResource.1.png  |   Bin 0 -> 15414 bytes
 .../doc-files/Samples.HelloWorldResource.2.png  |   Bin 0 -> 10797 bytes
 .../doc-files/Samples.HelloWorldResource.3.png  |   Bin 0 -> 66934 bytes
 .../bin/core/doc-files/Samples.Installing.1.png |   Bin 0 -> 52312 bytes
 .../bin/core/doc-files/Samples.Installing.2.png |   Bin 0 -> 59664 bytes
 .../bin/core/doc-files/Samples.Installing.3.png |   Bin 0 -> 25927 bytes
 .../doc-files/Samples.JsonSchemaResource.1.png  |   Bin 0 -> 36315 bytes
 .../doc-files/Samples.JsonSchemaResource.2.png  |   Bin 0 -> 28837 bytes
 .../core/doc-files/Samples.LogsResource.1.png   |   Bin 0 -> 37594 bytes
 .../core/doc-files/Samples.LogsResource.2.png   |   Bin 0 -> 42497 bytes
 .../core/doc-files/Samples.LogsResource.3.png   |   Bin 0 -> 56603 bytes
 .../Samples.MethodExampleResource.1.png         |   Bin 0 -> 27555 bytes
 .../Samples.MethodExampleResource.2.png         |   Bin 0 -> 71023 bytes
 .../core/doc-files/Samples.PhotosResource.1.png |   Bin 0 -> 16442 bytes
 .../core/doc-files/Samples.PhotosResource.2.png |   Bin 0 -> 71952 bytes
 ...Samples.RequestEchoResource.1.htmlschema.png |   Bin 0 -> 35501 bytes
 .../Samples.RequestEchoResource.1.json.png      |   Bin 0 -> 30092 bytes
 ...Samples.RequestEchoResource.1.jsonschema.png |   Bin 0 -> 31731 bytes
 ...Samples.RequestEchoResource.1.jsonsimple.png |   Bin 0 -> 29302 bytes
 .../doc-files/Samples.RequestEchoResource.1.png |   Bin 0 -> 54743 bytes
 .../Samples.RequestEchoResource.1.uon.png       |   Bin 0 -> 64778 bytes
 ...amples.RequestEchoResource.1.urlencoding.png |   Bin 0 -> 71054 bytes
 .../Samples.RequestEchoResource.1.xml.png       |   Bin 0 -> 43989 bytes
 .../Samples.RequestEchoResource.1.xmlschema.png |   Bin 0 -> 47951 bytes
 .../doc-files/Samples.RequestEchoResource.2.png |   Bin 0 -> 30872 bytes
 .../doc-files/Samples.RequestEchoResource.3.png |   Bin 0 -> 27501 bytes
 .../doc-files/Samples.RequestEchoResource.4.png |   Bin 0 -> 22149 bytes
 .../bin/core/doc-files/Samples.Running.1.png    |   Bin 0 -> 40422 bytes
 .../bin/core/doc-files/Samples.Running.2.png    |   Bin 0 -> 15925 bytes
 .../bin/core/doc-files/Samples.Running.3.png    |   Bin 0 -> 62643 bytes
 .../Samples.SampleRemoteableServlet.1.png       |   Bin 0 -> 23969 bytes
 .../Samples.SampleRemoteableServlet.2.png       |   Bin 0 -> 29986 bytes
 .../Samples.SampleRemoteableServlet.3.png       |   Bin 0 -> 45596 bytes
 .../doc-files/Samples.SqlQueryResource.1.png    |   Bin 0 -> 16113 bytes
 .../doc-files/Samples.SqlQueryResource.2.png    |   Bin 0 -> 40356 bytes
 .../doc-files/Samples.TempDirResource.1.png     |   Bin 0 -> 32843 bytes
 .../doc-files/Samples.TempDirResource.2.png     |   Bin 0 -> 20359 bytes
 .../Samples.TumblrParserResource.1.png          |   Bin 0 -> 168439 bytes
 .../Samples.UrlEncodedFormResource.1.png        |   Bin 0 -> 24026 bytes
 .../Samples.UrlEncodedFormResource.2.png        |   Bin 0 -> 31318 bytes
 .../bin/core/doc-files/Server.Html.png          |   Bin 0 -> 52497 bytes
 .../bin/core/doc-files/Server.Json.png          |   Bin 0 -> 29692 bytes
 .../bin/core/doc-files/Server.N3.png            |   Bin 0 -> 45391 bytes
 .../bin/core/doc-files/Server.NTuple.png        |   Bin 0 -> 55713 bytes
 .../bin/core/doc-files/Server.Options.png       |   Bin 0 -> 67005 bytes
 .../bin/core/doc-files/Server.RdfXml.png        |   Bin 0 -> 45274 bytes
 .../bin/core/doc-files/Server.SimpleXml.png     |   Bin 0 -> 36746 bytes
 .../bin/core/doc-files/Server.Turtle.png        |   Bin 0 -> 45180 bytes
 .../bin/core/doc-files/Server.Uon.png           |   Bin 0 -> 28160 bytes
 .../bin/core/doc-files/Server.UrlEncoding.png   |   Bin 0 -> 32516 bytes
 .../bin/core/doc-files/Server.Xml.png           |   Bin 0 -> 45446 bytes
 com.ibm.team.juno.releng/bin/core/javadoc.css   |  1039 ++
 com.ibm.team.juno.releng/bin/core/overview.html |  7448 ++++++++++
 .../bin/microservice/META-INF/MANIFEST.MF       |    12 +
 .../ibm/juno/microservice/Microservice$1.class  |   Bin 0 -> 1180 bytes
 .../ibm/juno/microservice/Microservice$2.class  |   Bin 0 -> 1285 bytes
 .../ibm/juno/microservice/Microservice$3.class  |   Bin 0 -> 665 bytes
 .../ibm/juno/microservice/Microservice$4.class  |   Bin 0 -> 955 bytes
 .../ibm/juno/microservice/Microservice$5.class  |   Bin 0 -> 953 bytes
 .../ibm/juno/microservice/Microservice$6.class  |   Bin 0 -> 922 bytes
 .../ibm/juno/microservice/Microservice.class    |   Bin 0 -> 7426 bytes
 .../com/ibm/juno/microservice/Microservice.java |   521 +
 .../com/ibm/juno/microservice/Resource$1.class  |   Bin 0 -> 928 bytes
 .../com/ibm/juno/microservice/Resource$2.class  |   Bin 0 -> 933 bytes
 .../com/ibm/juno/microservice/Resource.class    |   Bin 0 -> 1301 bytes
 .../com/ibm/juno/microservice/Resource.java     |    74 +
 .../ibm/juno/microservice/ResourceGroup$1.class |   Bin 0 -> 958 bytes
 .../ibm/juno/microservice/ResourceGroup$2.class |   Bin 0 -> 963 bytes
 .../ibm/juno/microservice/ResourceGroup.class   |   Bin 0 -> 1336 bytes
 .../ibm/juno/microservice/ResourceGroup.java    |    72 +
 .../ibm/juno/microservice/ResourceJena.class    |   Bin 0 -> 712 bytes
 .../com/ibm/juno/microservice/ResourceJena.java |    28 +
 .../juno/microservice/RestMicroservice$1.class  |   Bin 0 -> 1498 bytes
 .../juno/microservice/RestMicroservice$2.class  |   Bin 0 -> 1180 bytes
 .../juno/microservice/RestMicroservice.class    |   Bin 0 -> 13722 bytes
 .../ibm/juno/microservice/RestMicroservice.java |   554 +
 .../ibm/juno/microservice/doc-files/build1.png  |   Bin 0 -> 2633 bytes
 .../ibm/juno/microservice/doc-files/build2.png  |   Bin 0 -> 8634 bytes
 .../juno/microservice/doc-files/helloworld1.png |   Bin 0 -> 14050 bytes
 .../microservice/doc-files/instructions1.png    |   Bin 0 -> 44658 bytes
 .../microservice/doc-files/instructions2.png    |   Bin 0 -> 54971 bytes
 .../microservice/doc-files/instructions3.png    |   Bin 0 -> 20755 bytes
 .../microservice/doc-files/instructions4.png    |   Bin 0 -> 28672 bytes
 .../microservice/doc-files/instructions5.png    |   Bin 0 -> 8894 bytes
 .../microservice/doc-files/instructions6.png    |   Bin 0 -> 22345 bytes
 .../juno/microservice/doc-files/manifest1.png   |   Bin 0 -> 10493 bytes
 .../com/ibm/juno/microservice/javadoc.css       |  1039 ++
 .../com/ibm/juno/microservice/package.html      |   944 ++
 .../juno/microservice/resources/ConfigEdit.html |    32 +
 .../microservice/resources/ConfigResource.class |   Bin 0 -> 5386 bytes
 .../microservice/resources/ConfigResource.java  |   184 +
 .../DirectoryResource$FileResource.class        |   Bin 0 -> 2656 bytes
 .../resources/DirectoryResource.class           |   Bin 0 -> 8434 bytes
 .../resources/DirectoryResource.java            |   354 +
 .../resources/LogEntryFormatter.class           |   Bin 0 -> 6683 bytes
 .../resources/LogEntryFormatter.java            |   257 +
 .../resources/LogParser$Entry.class             |   Bin 0 -> 5074 bytes
 .../juno/microservice/resources/LogParser.class |   Bin 0 -> 5547 bytes
 .../juno/microservice/resources/LogParser.java  |   225 +
 .../microservice/resources/LogsResource$1.class |   Bin 0 -> 957 bytes
 .../resources/LogsResource$FileResource.class   |   Bin 0 -> 2573 bytes
 .../LogsResource$FileResourceComparator.class   |   Bin 0 -> 1933 bytes
 .../microservice/resources/LogsResource.class   |   Bin 0 -> 11211 bytes
 .../microservice/resources/LogsResource.java    |   299 +
 .../resources/SampleRootResource.class          |   Bin 0 -> 758 bytes
 .../resources/SampleRootResource.java           |    27 +
 .../resources/ShutdownResource$1.class          |   Bin 0 -> 1039 bytes
 .../resources/ShutdownResource.class            |   Bin 0 -> 1125 bytes
 .../resources/ShutdownResource.java             |    49 +
 .../juno/microservice/resources/package.html    |    24 +
 .../bin/samples/META-INF/MANIFEST.MF            |    16 +
 .../ibm/juno/samples/addressbook/Address.class  |   Bin 0 -> 1851 bytes
 .../ibm/juno/samples/addressbook/Address.java   |    49 +
 .../juno/samples/addressbook/AddressBook.class  |   Bin 0 -> 3954 bytes
 .../juno/samples/addressbook/AddressBook.java   |    98 +
 .../samples/addressbook/CreateAddress.class     |   Bin 0 -> 1001 bytes
 .../juno/samples/addressbook/CreateAddress.java |    37 +
 .../juno/samples/addressbook/CreatePerson.class |   Bin 0 -> 1472 bytes
 .../juno/samples/addressbook/CreatePerson.java  |    40 +
 .../juno/samples/addressbook/IAddressBook.class |   Bin 0 -> 716 bytes
 .../juno/samples/addressbook/IAddressBook.java  |    41 +
 .../ibm/juno/samples/addressbook/Person.class   |   Bin 0 -> 3249 bytes
 .../ibm/juno/samples/addressbook/Person.java    |    68 +
 .../juno/samples/addressbook/package-info.class |   Bin 0 -> 689 bytes
 .../juno/samples/addressbook/package-info.java  |    31 +
 .../ibm/juno/samples/addressbook/package.html   |    27 +
 .../ibm/juno/server/samples/AdminGuard.class    |   Bin 0 -> 492 bytes
 .../com/ibm/juno/server/samples/AdminGuard.java |    22 +
 .../juno/server/samples/AtomFeedResource.class  |   Bin 0 -> 5483 bytes
 .../juno/server/samples/AtomFeedResource.java   |   103 +
 .../server/samples/CodeFormatterResource.class  |   Bin 0 -> 1840 bytes
 .../server/samples/CodeFormatterResource.html   |    48 +
 .../server/samples/CodeFormatterResource.java   |    46 +
 .../com/ibm/juno/server/samples/Constants.class |   Bin 0 -> 679 bytes
 .../com/ibm/juno/server/samples/Constants.java  |    25 +
 .../DirectoryResource$FileResource.class        |   Bin 0 -> 2293 bytes
 .../juno/server/samples/DirectoryResource.class |   Bin 0 -> 7725 bytes
 .../juno/server/samples/DirectoryResource.java  |   231 +
 .../DockerRegistryResource$DockerImage.class    |   Bin 0 -> 530 bytes
 .../DockerRegistryResource$QueryResults.class   |   Bin 0 -> 770 bytes
 .../server/samples/DockerRegistryResource.class |   Bin 0 -> 3023 bytes
 .../server/samples/DockerRegistryResource.java  |    68 +
 .../server/samples/HelloWorldResource.class     |   Bin 0 -> 936 bytes
 .../juno/server/samples/HelloWorldResource.java |    34 +
 .../server/samples/JsonSchemaResource.class     |   Bin 0 -> 3007 bytes
 .../juno/server/samples/JsonSchemaResource.java |    70 +
 .../server/samples/MethodExampleResource.class  |   Bin 0 -> 4000 bytes
 .../server/samples/MethodExampleResource.java   |    87 +
 .../samples/PhotosResource$ImageParser.class    |   Bin 0 -> 1742 bytes
 .../PhotosResource$ImageSerializer.class        |   Bin 0 -> 1879 bytes
 .../server/samples/PhotosResource$Photo.class   |   Bin 0 -> 1001 bytes
 .../juno/server/samples/PhotosResource.class    |   Bin 0 -> 4381 bytes
 .../ibm/juno/server/samples/PhotosResource.java |   140 +
 .../server/samples/RequestEchoResource.class    |   Bin 0 -> 1866 bytes
 .../server/samples/RequestEchoResource.java     |    55 +
 .../ibm/juno/server/samples/RootResources.class |   Bin 0 -> 1812 bytes
 .../ibm/juno/server/samples/RootResources.java  |    50 +
 .../samples/SampleRemoteableServlet.class       |   Bin 0 -> 1919 bytes
 .../server/samples/SampleRemoteableServlet.java |    53 +
 .../juno/server/samples/SourceResource$1.class  |   Bin 0 -> 249 bytes
 .../server/samples/SourceResource$Source.class  |   Bin 0 -> 2401 bytes
 .../juno/server/samples/SourceResource.class    |   Bin 0 -> 3963 bytes
 .../ibm/juno/server/samples/SourceResource.java |   110 +
 .../samples/SqlQueryResource$PostInput.class    |   Bin 0 -> 546 bytes
 .../juno/server/samples/SqlQueryResource.class  |   Bin 0 -> 5695 bytes
 .../juno/server/samples/SqlQueryResource.html   |    51 +
 .../juno/server/samples/SqlQueryResource.java   |   124 +
 ...mpDirResource$MultipartFormDataMatcher.class |   Bin 0 -> 944 bytes
 .../juno/server/samples/TempDirResource.class   |   Bin 0 -> 3440 bytes
 .../juno/server/samples/TempDirResource.java    |    74 +
 .../juno/server/samples/TempDirUploadPage.html  |    27 +
 .../samples/TumblrParserResource$Entry.class    |   Bin 0 -> 519 bytes
 .../server/samples/TumblrParserResource.class   |   Bin 0 -> 4382 bytes
 .../server/samples/TumblrParserResource.java    |    77 +
 .../ibm/juno/server/samples/UrlEncodedForm.html |    55 +
 .../UrlEncodedFormResource$FormInputBean.class  |   Bin 0 -> 855 bytes
 .../server/samples/UrlEncodedFormResource.class |   Bin 0 -> 1596 bytes
 .../server/samples/UrlEncodedFormResource.java  |    49 +
 .../addressbook/AddressBookResource$1.class     |   Bin 0 -> 1497 bytes
 .../AddressBookResource$Options.class           |   Bin 0 -> 1519 bytes
 .../addressbook/AddressBookResource.class       |   Bin 0 -> 9995 bytes
 .../addressbook/AddressBookResource.java        |   329 +
 .../server/samples/addressbook/ClientTest.class |   Bin 0 -> 5167 bytes
 .../server/samples/addressbook/ClientTest.java  |    99 +
 .../nls/AddressBookResource.properties          |    71 +
 .../ibm/juno/server/samples/averycutedog.jpg    |   Bin 0 -> 40879 bytes
 .../server/samples/htdocs/code-highlighting.css |   124 +
 .../samples/nls/AtomFeedResource.properties     |    16 +
 .../nls/CodeFormatterResource.properties        |    13 +
 .../samples/nls/HelloWorldResource.properties   |    14 +
 .../samples/nls/JsonSchemaResource.properties   |    15 +
 .../nls/MethodExampleResource.properties        |    32 +
 .../samples/nls/PhotosResource.properties       |    19 +
 .../samples/nls/RequestEchoResource.properties  |    14 +
 .../server/samples/nls/RootResources.properties |    13 +
 .../nls/SampleRemoteableServlet.properties      |    12 +
 .../samples/nls/SourceResource.properties       |    14 +
 .../samples/nls/SqlQueryResource.properties     |    14 +
 .../samples/nls/TempDirResource.properties      |    13 +
 .../samples/nls/TumblrParserResource.properties |    14 +
 .../nls/UrlEncodedFormResource.properties       |    17 +
 .../bin/server.test/META-INF/MANIFEST.MF        |    15 +
 .../com/ibm/juno/server/test/DTOs$A.class       |   Bin 0 -> 613 bytes
 .../com/ibm/juno/server/test/DTOs$B$1.class     |   Bin 0 -> 628 bytes
 .../com/ibm/juno/server/test/DTOs$B$10.class    |   Bin 0 -> 849 bytes
 .../com/ibm/juno/server/test/DTOs$B$2.class     |   Bin 0 -> 687 bytes
 .../com/ibm/juno/server/test/DTOs$B$3.class     |   Bin 0 -> 689 bytes
 .../com/ibm/juno/server/test/DTOs$B$4.class     |   Bin 0 -> 728 bytes
 .../com/ibm/juno/server/test/DTOs$B$5.class     |   Bin 0 -> 847 bytes
 .../com/ibm/juno/server/test/DTOs$B$6.class     |   Bin 0 -> 628 bytes
 .../com/ibm/juno/server/test/DTOs$B$7.class     |   Bin 0 -> 687 bytes
 .../com/ibm/juno/server/test/DTOs$B$8.class     |   Bin 0 -> 689 bytes
 .../com/ibm/juno/server/test/DTOs$B$9.class     |   Bin 0 -> 728 bytes
 .../com/ibm/juno/server/test/DTOs$B.class       |   Bin 0 -> 5216 bytes
 .../com/ibm/juno/server/test/DTOs$C$1.class     |   Bin 0 -> 628 bytes
 .../com/ibm/juno/server/test/DTOs$C$10.class    |   Bin 0 -> 849 bytes
 .../com/ibm/juno/server/test/DTOs$C$2.class     |   Bin 0 -> 687 bytes
 .../com/ibm/juno/server/test/DTOs$C$3.class     |   Bin 0 -> 689 bytes
 .../com/ibm/juno/server/test/DTOs$C$4.class     |   Bin 0 -> 728 bytes
 .../com/ibm/juno/server/test/DTOs$C$5.class     |   Bin 0 -> 847 bytes
 .../com/ibm/juno/server/test/DTOs$C$6.class     |   Bin 0 -> 628 bytes
 .../com/ibm/juno/server/test/DTOs$C$7.class     |   Bin 0 -> 687 bytes
 .../com/ibm/juno/server/test/DTOs$C$8.class     |   Bin 0 -> 689 bytes
 .../com/ibm/juno/server/test/DTOs$C$9.class     |   Bin 0 -> 728 bytes
 .../com/ibm/juno/server/test/DTOs$C.class       |   Bin 0 -> 2424 bytes
 .../com/ibm/juno/server/test/DTOs.class         |   Bin 0 -> 461 bytes
 .../com/ibm/juno/server/test/Root.class         |   Bin 0 -> 3631 bytes
 .../test/TestAcceptCharset$TestParser.class     |   Bin 0 -> 1797 bytes
 .../test/TestAcceptCharset$TestSerializer.class |   Bin 0 -> 1874 bytes
 .../juno/server/test/TestAcceptCharset.class    |   Bin 0 -> 1569 bytes
 .../server/test/TestBeanContextProperties.class |   Bin 0 -> 1853 bytes
 .../juno/server/test/TestCallbackStrings.class  |   Bin 0 -> 2547 bytes
 .../test/TestCharsetEncodings$ASerializer.class |   Bin 0 -> 1354 bytes
 .../test/TestCharsetEncodings$CtParser.class    |   Bin 0 -> 1638 bytes
 .../juno/server/test/TestCharsetEncodings.class |   Bin 0 -> 1628 bytes
 .../com/ibm/juno/server/test/TestConfig.class   |   Bin 0 -> 1949 bytes
 .../com/ibm/juno/server/test/TestContent.class  |   Bin 0 -> 2798 bytes
 .../server/test/TestDefaultContentTypes$1.class |   Bin 0 -> 270 bytes
 .../TestDefaultContentTypes$DummyParser.class   |   Bin 0 -> 1842 bytes
 ...estDefaultContentTypes$DummySerializer.class |   Bin 0 -> 1801 bytes
 .../test/TestDefaultContentTypes$P1.class       |   Bin 0 -> 768 bytes
 .../test/TestDefaultContentTypes$P2.class       |   Bin 0 -> 768 bytes
 .../test/TestDefaultContentTypes$P3.class       |   Bin 0 -> 768 bytes
 .../test/TestDefaultContentTypes$S1.class       |   Bin 0 -> 776 bytes
 .../test/TestDefaultContentTypes$S2.class       |   Bin 0 -> 776 bytes
 .../test/TestDefaultContentTypes$S3.class       |   Bin 0 -> 776 bytes
 .../server/test/TestDefaultContentTypes.class   |   Bin 0 -> 3254 bytes
 .../test/TestErrorConditions$NeverMatcher.class |   Bin 0 -> 628 bytes
 .../server/test/TestErrorConditions$Test1.class |   Bin 0 -> 467 bytes
 .../server/test/TestErrorConditions$Test2.class |   Bin 0 -> 450 bytes
 .../test/TestErrorConditions$Test3a.class       |   Bin 0 -> 453 bytes
 .../test/TestErrorConditions$Test3b.class       |   Bin 0 -> 569 bytes
 .../test/TestErrorConditions$Test3b1.class      |   Bin 0 -> 439 bytes
 .../test/TestErrorConditions$Test3c.class       |   Bin 0 -> 712 bytes
 .../juno/server/test/TestErrorConditions.class  |   Bin 0 -> 3775 bytes
 .../ibm/juno/server/test/TestFilters$A.class    |   Bin 0 -> 406 bytes
 .../juno/server/test/TestFilters$FilterA1.class |   Bin 0 -> 2313 bytes
 .../juno/server/test/TestFilters$FilterA2.class |   Bin 0 -> 2313 bytes
 .../juno/server/test/TestFilters$FilterA3.class |   Bin 0 -> 2313 bytes
 .../com/ibm/juno/server/test/TestFilters.class  |   Bin 0 -> 2166 bytes
 .../juno/server/test/TestFiltersParent.class    |   Bin 0 -> 703 bytes
 .../juno/server/test/TestGroups$PParser.class   |   Bin 0 -> 1609 bytes
 .../server/test/TestGroups$SSerializer.class    |   Bin 0 -> 1498 bytes
 .../com/ibm/juno/server/test/TestGroups.class   |   Bin 0 -> 1778 bytes
 .../juno/server/test/TestGzip$MyEncoder.class   |   Bin 0 -> 562 bytes
 .../juno/server/test/TestGzip$TestGzipOff.class |   Bin 0 -> 1195 bytes
 .../juno/server/test/TestGzip$TestGzipOn.class  |   Bin 0 -> 2641 bytes
 .../com/ibm/juno/server/test/TestGzip.class     |   Bin 0 -> 539 bytes
 .../test/TestInheritance$DummyParser.class      |   Bin 0 -> 1424 bytes
 .../test/TestInheritance$DummySerializer.class  |   Bin 0 -> 1239 bytes
 .../juno/server/test/TestInheritance$E1.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E2.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E3.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E4.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$F1.class   |   Bin 0 -> 1063 bytes
 .../juno/server/test/TestInheritance$F2.class   |   Bin 0 -> 1063 bytes
 .../juno/server/test/TestInheritance$F3.class   |   Bin 0 -> 1063 bytes
 .../juno/server/test/TestInheritance$Foo1.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$Foo2.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$Foo3.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$P1.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P2.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P3.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P4.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P5.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$S1.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S2.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S3.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S4.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S5.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$Sub.class  |   Bin 0 -> 1550 bytes
 .../test/TestInheritance$TestEncoders.class     |   Bin 0 -> 1291 bytes
 .../test/TestInheritance$TestFilters.class      |   Bin 0 -> 2078 bytes
 .../test/TestInheritance$TestParsers.class      |   Bin 0 -> 1688 bytes
 .../test/TestInheritance$TestProperties.class   |   Bin 0 -> 2637 bytes
 .../test/TestInheritance$TestSerializers.class  |   Bin 0 -> 1719 bytes
 .../ibm/juno/server/test/TestInheritance.class  |   Bin 0 -> 2994 bytes
 .../ibm/juno/server/test/TestLargePojos.class   |   Bin 0 -> 1100 bytes
 .../TestMessages$ResourceBundleFilter.class     |   Bin 0 -> 1643 bytes
 .../test/TestMessages$TestMessages2.class       |   Bin 0 -> 540 bytes
 .../com/ibm/juno/server/test/TestMessages.class |   Bin 0 -> 1170 bytes
 .../juno/server/test/TestMessages.properties    |    10 +
 .../juno/server/test/TestMessages2.properties   |    10 +
 .../ibm/juno/server/test/TestNls$Test1.class    |   Bin 0 -> 1835 bytes
 .../ibm/juno/server/test/TestNls$Test2.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test3.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test4.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test5.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test6.class    |   Bin 0 -> 1715 bytes
 .../com/ibm/juno/server/test/TestNls.class      |   Bin 0 -> 1177 bytes
 .../com/ibm/juno/server/test/TestNls.properties |    74 +
 .../test/TestNlsProperty$TestSerializer.class   |   Bin 0 -> 1512 bytes
 .../ibm/juno/server/test/TestNlsProperty.class  |   Bin 0 -> 1235 bytes
 .../juno/server/test/TestNlsProperty.properties |    10 +
 .../juno/server/test/TestNoParserInput.class    |   Bin 0 -> 1501 bytes
 .../test/TestOnPostCall$TestSerializer.class    |   Bin 0 -> 2449 bytes
 .../ibm/juno/server/test/TestOnPostCall.class   |   Bin 0 -> 2784 bytes
 .../server/test/TestOnPreCall$TestParserA.class |   Bin 0 -> 2353 bytes
 .../ibm/juno/server/test/TestOnPreCall.class    |   Bin 0 -> 2619 bytes
 .../server/test/TestOptionsWithoutNls.class     |   Bin 0 -> 1432 bytes
 .../TestOverlappingMethods$Test1Guard.class     |   Bin 0 -> 860 bytes
 .../TestOverlappingMethods$Test2Guard.class     |   Bin 0 -> 860 bytes
 .../TestOverlappingMethods$Test3aMatcher.class  |   Bin 0 -> 862 bytes
 .../TestOverlappingMethods$Test3bMatcher.class  |   Bin 0 -> 862 bytes
 .../server/test/TestOverlappingMethods.class    |   Bin 0 -> 3586 bytes
 .../com/ibm/juno/server/test/TestParams$A.class |   Bin 0 -> 450 bytes
 .../juno/server/test/TestParams$Test6Bean.class |   Bin 0 -> 460 bytes
 .../com/ibm/juno/server/test/TestParams.class   |   Bin 0 -> 12171 bytes
 .../server/test/TestParsers$TestParserA.class   |   Bin 0 -> 1831 bytes
 .../server/test/TestParsers$TestParserB.class   |   Bin 0 -> 1830 bytes
 .../server/test/TestParsers$TestParserC.class   |   Bin 0 -> 1830 bytes
 .../server/test/TestParsers$TestParserD.class   |   Bin 0 -> 1842 bytes
 .../com/ibm/juno/server/test/TestParsers.class  |   Bin 0 -> 2253 bytes
 .../juno/server/test/TestPath$TestPath2.class   |   Bin 0 -> 933 bytes
 .../juno/server/test/TestPath$TestPath3.class   |   Bin 0 -> 514 bytes
 .../juno/server/test/TestPath$TestPath3a.class  |   Bin 0 -> 800 bytes
 .../com/ibm/juno/server/test/TestPath.class     |   Bin 0 -> 997 bytes
 .../com/ibm/juno/server/test/TestPaths$A.class  |   Bin 0 -> 1481 bytes
 .../com/ibm/juno/server/test/TestPaths.class    |   Bin 0 -> 2510 bytes
 .../TestProperties$PropertySerializer1.class    |   Bin 0 -> 2006 bytes
 .../TestProperties$PropertySerializer2.class    |   Bin 0 -> 1775 bytes
 .../ibm/juno/server/test/TestProperties.class   |   Bin 0 -> 2070 bytes
 .../ibm/juno/server/test/TestRestClient.class   |   Bin 0 -> 986 bytes
 .../test/TestSerializers$TestSerializerA.class  |   Bin 0 -> 1513 bytes
 .../test/TestSerializers$TestSerializerB.class  |   Bin 0 -> 1513 bytes
 .../test/TestSerializers$TestSerializerC.class  |   Bin 0 -> 1513 bytes
 .../test/TestSerializers$TestSerializerD.class  |   Bin 0 -> 1544 bytes
 .../ibm/juno/server/test/TestSerializers.class  |   Bin 0 -> 2102 bytes
 .../ibm/juno/server/test/TestStaticFiles.class  |   Bin 0 -> 734 bytes
 .../ibm/juno/server/test/TestUris$Child.class   |   Bin 0 -> 1689 bytes
 .../juno/server/test/TestUris$GrandChild.class  |   Bin 0 -> 1590 bytes
 .../com/ibm/juno/server/test/TestUris.class     |   Bin 0 -> 2711 bytes
 .../server/test/TestUrlContent$TestBean.class   |   Bin 0 -> 473 bytes
 .../server/test/TestUrlContent$TestEnum.class   |   Bin 0 -> 1148 bytes
 .../ibm/juno/server/test/TestUrlContent.class   |   Bin 0 -> 2471 bytes
 .../com/ibm/juno/server/test/xdocs/test.txt     |     1 +
 .../ibm/juno/server/test/xdocs/xdocs/test.txt   |     1 +
 .../com/ibm/juno/server/tests/AllTests.class    |   Bin 0 -> 2573 bytes
 .../ibm/juno/server/tests/CT_JacocoDummy.class  |   Bin 0 -> 1275 bytes
 .../ibm/juno/server/tests/CT_RestUtils.class    |   Bin 0 -> 4727 bytes
 .../server/tests/CT_TestAcceptCharset.class     |   Bin 0 -> 4963 bytes
 .../tests/CT_TestBeanContextProperties.class    |   Bin 0 -> 1484 bytes
 .../server/tests/CT_TestCallbackStrings.class   |   Bin 0 -> 1857 bytes
 .../server/tests/CT_TestCharsetEncodings.class  |   Bin 0 -> 3667 bytes
 .../ibm/juno/server/tests/CT_TestConfig.class   |   Bin 0 -> 3590 bytes
 .../ibm/juno/server/tests/CT_TestContent.class  |   Bin 0 -> 15635 bytes
 .../tests/CT_TestDefaultContentTypes.class      |   Bin 0 -> 8733 bytes
 .../server/tests/CT_TestErrorConditions.class   |   Bin 0 -> 7368 bytes
 .../ibm/juno/server/tests/CT_TestFilters.class  |   Bin 0 -> 2240 bytes
 .../ibm/juno/server/tests/CT_TestGroups.class   |   Bin 0 -> 3700 bytes
 .../com/ibm/juno/server/tests/CT_TestGzip.class |   Bin 0 -> 8076 bytes
 .../juno/server/tests/CT_TestInheritance.class  |   Bin 0 -> 3289 bytes
 .../juno/server/tests/CT_TestLargePojos.class   |   Bin 0 -> 3128 bytes
 .../ibm/juno/server/tests/CT_TestMessages.class |   Bin 0 -> 1319 bytes
 .../com/ibm/juno/server/tests/CT_TestNls.class  |   Bin 0 -> 7065 bytes
 .../juno/server/tests/CT_TestNlsProperty.class  |   Bin 0 -> 1645 bytes
 .../server/tests/CT_TestNoParserInput.class     |   Bin 0 -> 2493 bytes
 .../juno/server/tests/CT_TestOnPostCall.class   |   Bin 0 -> 3695 bytes
 .../juno/server/tests/CT_TestOnPreCall.class    |   Bin 0 -> 2260 bytes
 .../server/tests/CT_TestOptionsWithoutNls.class |   Bin 0 -> 2058 bytes
 .../tests/CT_TestOverlappingMethods.class       |   Bin 0 -> 4150 bytes
 .../ibm/juno/server/tests/CT_TestParams.class   |   Bin 0 -> 13076 bytes
 .../ibm/juno/server/tests/CT_TestParsers.class  |   Bin 0 -> 4253 bytes
 .../com/ibm/juno/server/tests/CT_TestPath.class |   Bin 0 -> 1713 bytes
 .../ibm/juno/server/tests/CT_TestPaths.class    |   Bin 0 -> 16152 bytes
 .../juno/server/tests/CT_TestProperties.class   |   Bin 0 -> 2120 bytes
 .../juno/server/tests/CT_TestRestClient$1.class |   Bin 0 -> 1588 bytes
 .../juno/server/tests/CT_TestRestClient$2.class |   Bin 0 -> 1549 bytes
 .../juno/server/tests/CT_TestRestClient$3.class |   Bin 0 -> 1549 bytes
 .../juno/server/tests/CT_TestRestClient.class   |   Bin 0 -> 5184 bytes
 .../juno/server/tests/CT_TestSerializers.class  |   Bin 0 -> 4130 bytes
 .../juno/server/tests/CT_TestStaticFiles.class  |   Bin 0 -> 2121 bytes
 .../com/ibm/juno/server/tests/CT_TestUris.class |   Bin 0 -> 22260 bytes
 .../juno/server/tests/CT_TestUrlContent.class   |   Bin 0 -> 2246 bytes
 .../juno/server/tests/CT_UrlPathPattern.class   |   Bin 0 -> 1561 bytes
 .../com/ibm/juno/server/tests/Constants.class   |   Bin 0 -> 1504 bytes
 .../com/ibm/juno/server/tests/DTOs$A.class      |   Bin 0 -> 617 bytes
 .../com/ibm/juno/server/tests/DTOs$B$1.class    |   Bin 0 -> 633 bytes
 .../com/ibm/juno/server/tests/DTOs$B$10.class   |   Bin 0 -> 857 bytes
 .../com/ibm/juno/server/tests/DTOs$B$2.class    |   Bin 0 -> 692 bytes
 .../com/ibm/juno/server/tests/DTOs$B$3.class    |   Bin 0 -> 694 bytes
 .../com/ibm/juno/server/tests/DTOs$B$4.class    |   Bin 0 -> 736 bytes
 .../com/ibm/juno/server/tests/DTOs$B$5.class    |   Bin 0 -> 855 bytes
 .../com/ibm/juno/server/tests/DTOs$B$6.class    |   Bin 0 -> 633 bytes
 .../com/ibm/juno/server/tests/DTOs$B$7.class    |   Bin 0 -> 692 bytes
 .../com/ibm/juno/server/tests/DTOs$B$8.class    |   Bin 0 -> 694 bytes
 .../com/ibm/juno/server/tests/DTOs$B$9.class    |   Bin 0 -> 736 bytes
 .../com/ibm/juno/server/tests/DTOs$B.class      |   Bin 0 -> 5244 bytes
 .../com/ibm/juno/server/tests/DTOs$C$1.class    |   Bin 0 -> 633 bytes
 .../com/ibm/juno/server/tests/DTOs$C$10.class   |   Bin 0 -> 857 bytes
 .../com/ibm/juno/server/tests/DTOs$C$2.class    |   Bin 0 -> 692 bytes
 .../com/ibm/juno/server/tests/DTOs$C$3.class    |   Bin 0 -> 694 bytes
 .../com/ibm/juno/server/tests/DTOs$C$4.class    |   Bin 0 -> 736 bytes
 .../com/ibm/juno/server/tests/DTOs$C$5.class    |   Bin 0 -> 855 bytes
 .../com/ibm/juno/server/tests/DTOs$C$6.class    |   Bin 0 -> 633 bytes
 .../com/ibm/juno/server/tests/DTOs$C$7.class    |   Bin 0 -> 692 bytes
 .../com/ibm/juno/server/tests/DTOs$C$8.class    |   Bin 0 -> 694 bytes
 .../com/ibm/juno/server/tests/DTOs$C$9.class    |   Bin 0 -> 736 bytes
 .../com/ibm/juno/server/tests/DTOs$C.class      |   Bin 0 -> 2445 bytes
 .../com/ibm/juno/server/tests/DTOs.class        |   Bin 0 -> 466 bytes
 .../ibm/juno/server/tests/LargePojo$A1.class    |   Bin 0 -> 547 bytes
 .../juno/server/tests/LargePojo$A1List.class    |   Bin 0 -> 547 bytes
 .../ibm/juno/server/tests/LargePojo$A1Map.class |   Bin 0 -> 568 bytes
 .../com/ibm/juno/server/tests/LargePojo.class   |   Bin 0 -> 1298 bytes
 .../ibm/juno/server/tests/TestRestClient.class  |   Bin 0 -> 3779 bytes
 .../com/ibm/juno/server/tests/TestUtils.class   |   Bin 0 -> 2774 bytes
 .../CT_AddressBookResource$PersonList.class     |   Bin 0 -> 576 bytes
 .../tests/sample/CT_AddressBookResource.class   |   Bin 0 -> 8852 bytes
 .../sample/CT_AddressBookResource_test0.json    |    14 +
 .../server/tests/sample/CT_RootResources.class  |   Bin 0 -> 5376 bytes
 .../CT_SampleRemoteableServicesResource.class   |   Bin 0 -> 3458 bytes
 .../sample/CT_TestMultiPartFormPosts.class      |   Bin 0 -> 2439 bytes
 .../server/tests/sample/SamplesRestClient.class |   Bin 0 -> 3803 bytes
 .../bin/server/META-INF/MANIFEST.MF             |    21 +
 .../com/ibm/juno/server/ReaderResource.class    |   Bin 0 -> 2191 bytes
 .../com/ibm/juno/server/ReaderResource.java     |    96 +
 .../server/com/ibm/juno/server/Redirect.class   |   Bin 0 -> 1872 bytes
 .../server/com/ibm/juno/server/Redirect.java    |   133 +
 .../com/ibm/juno/server/ResponseHandler.class   |   Bin 0 -> 328 bytes
 .../com/ibm/juno/server/ResponseHandler.java    |    87 +
 .../com/ibm/juno/server/RestConverter.class     |   Bin 0 -> 491 bytes
 .../com/ibm/juno/server/RestConverter.java      |    70 +
 .../com/ibm/juno/server/RestException.class     |   Bin 0 -> 2966 bytes
 .../com/ibm/juno/server/RestException.java      |   133 +
 .../server/com/ibm/juno/server/RestGuard.class  |   Bin 0 -> 814 bytes
 .../server/com/ibm/juno/server/RestGuard.java   |    95 +
 .../com/ibm/juno/server/RestMatcher.class       |   Bin 0 -> 355 bytes
 .../server/com/ibm/juno/server/RestMatcher.java |    61 +
 .../com/ibm/juno/server/RestRequest$1.class     |   Bin 0 -> 919 bytes
 .../com/ibm/juno/server/RestRequest.class       |   Bin 0 -> 31670 bytes
 .../server/com/ibm/juno/server/RestRequest.java |  1743 +++
 .../com/ibm/juno/server/RestResponse$1.class    |   Bin 0 -> 1210 bytes
 .../com/ibm/juno/server/RestResponse.class      |   Bin 0 -> 9992 bytes
 .../com/ibm/juno/server/RestResponse.java       |   427 +
 .../com/ibm/juno/server/RestServlet$1.class     |   Bin 0 -> 1192 bytes
 .../com/ibm/juno/server/RestServlet$10.class    |   Bin 0 -> 846 bytes
 .../com/ibm/juno/server/RestServlet$11.class    |   Bin 0 -> 2518 bytes
 .../com/ibm/juno/server/RestServlet$12.class    |   Bin 0 -> 1599 bytes
 .../com/ibm/juno/server/RestServlet$2.class     |   Bin 0 -> 889 bytes
 .../com/ibm/juno/server/RestServlet$3.class     |   Bin 0 -> 807 bytes
 .../com/ibm/juno/server/RestServlet$4.class     |   Bin 0 -> 802 bytes
 .../com/ibm/juno/server/RestServlet$5.class     |   Bin 0 -> 895 bytes
 .../com/ibm/juno/server/RestServlet$6.class     |   Bin 0 -> 1316 bytes
 .../com/ibm/juno/server/RestServlet$7.class     |   Bin 0 -> 2419 bytes
 .../com/ibm/juno/server/RestServlet$8.class     |   Bin 0 -> 1191 bytes
 .../com/ibm/juno/server/RestServlet$9.class     |   Bin 0 -> 969 bytes
 .../juno/server/RestServlet$MethodMeta.class    |   Bin 0 -> 19810 bytes
 .../juno/server/RestServlet$MethodParam.class   |   Bin 0 -> 6575 bytes
 .../juno/server/RestServlet$MultiMethod.class   |   Bin 0 -> 4753 bytes
 .../ibm/juno/server/RestServlet$ParamType.class |   Bin 0 -> 2106 bytes
 .../server/RestServlet$ResourceMethod.class     |   Bin 0 -> 1073 bytes
 .../com/ibm/juno/server/RestServlet.class       |   Bin 0 -> 57121 bytes
 .../server/com/ibm/juno/server/RestServlet.java |  3045 ++++
 .../ibm/juno/server/RestServletDefault.class    |   Bin 0 -> 2959 bytes
 .../com/ibm/juno/server/RestServletDefault.java |   228 +
 .../ibm/juno/server/RestServletException.class  |   Bin 0 -> 1073 bytes
 .../ibm/juno/server/RestServletException.java   |    44 +
 .../juno/server/RestServletGroupDefault.class   |   Bin 0 -> 1001 bytes
 .../juno/server/RestServletGroupDefault.java    |    39 +
 .../com/ibm/juno/server/RestServletNls$1.class  |   Bin 0 -> 233 bytes
 .../server/RestServletNls$ClassBundleDef.class  |   Bin 0 -> 1337 bytes
 .../com/ibm/juno/server/RestServletNls.class    |   Bin 0 -> 4631 bytes
 .../com/ibm/juno/server/RestServletNls.java     |   102 +
 .../ibm/juno/server/RestServletProperties.class |   Bin 0 -> 1211 bytes
 .../ibm/juno/server/RestServletProperties.java  |   144 +
 .../com/ibm/juno/server/RestUtils$1.class       |   Bin 0 -> 1963 bytes
 .../server/com/ibm/juno/server/RestUtils.class  |   Bin 0 -> 4660 bytes
 .../server/com/ibm/juno/server/RestUtils.java   |   246 +
 .../com/ibm/juno/server/StreamResource.class    |   Bin 0 -> 1919 bytes
 .../com/ibm/juno/server/StreamResource.java     |    87 +
 .../com/ibm/juno/server/UrlPathPattern.class    |   Bin 0 -> 3843 bytes
 .../com/ibm/juno/server/UrlPathPattern.java     |   157 +
 .../com/ibm/juno/server/annotation/Attr.class   |   Bin 0 -> 537 bytes
 .../com/ibm/juno/server/annotation/Attr.java    |    70 +
 .../ibm/juno/server/annotation/Content.class    |   Bin 0 -> 480 bytes
 .../com/ibm/juno/server/annotation/Content.java |    54 +
 .../ibm/juno/server/annotation/HasParam.class   |   Bin 0 -> 513 bytes
 .../ibm/juno/server/annotation/HasParam.java    |    91 +
 .../ibm/juno/server/annotation/HasQParam.class  |   Bin 0 -> 515 bytes
 .../ibm/juno/server/annotation/HasQParam.java   |    57 +
 .../com/ibm/juno/server/annotation/Header.class |   Bin 0 -> 509 bytes
 .../com/ibm/juno/server/annotation/Header.java  |    50 +
 .../ibm/juno/server/annotation/Inherit.class    |   Bin 0 -> 1168 bytes
 .../com/ibm/juno/server/annotation/Inherit.java |    30 +
 .../ibm/juno/server/annotation/Messages.class   |   Bin 0 -> 482 bytes
 .../ibm/juno/server/annotation/Messages.java    |    48 +
 .../com/ibm/juno/server/annotation/Method.class |   Bin 0 -> 478 bytes
 .../com/ibm/juno/server/annotation/Method.java  |    47 +
 .../com/ibm/juno/server/annotation/Param.class  |   Bin 0 -> 567 bytes
 .../com/ibm/juno/server/annotation/Param.java   |    76 +
 .../juno/server/annotation/PathRemainder.class  |   Bin 0 -> 492 bytes
 .../juno/server/annotation/PathRemainder.java   |    44 +
 .../ibm/juno/server/annotation/Properties.class |   Bin 0 -> 486 bytes
 .../ibm/juno/server/annotation/Properties.java  |    62 +
 .../ibm/juno/server/annotation/Property.class   |   Bin 0 -> 534 bytes
 .../ibm/juno/server/annotation/Property.java    |    61 +
 .../com/ibm/juno/server/annotation/QParam.class |   Bin 0 -> 569 bytes
 .../com/ibm/juno/server/annotation/QParam.java  |    72 +
 .../ibm/juno/server/annotation/Response.class   |   Bin 0 -> 641 bytes
 .../ibm/juno/server/annotation/Response.java    |    67 +
 .../ibm/juno/server/annotation/RestMethod.class |   Bin 0 -> 1815 bytes
 .../ibm/juno/server/annotation/RestMethod.java  |   379 +
 .../juno/server/annotation/RestResource.class   |   Bin 0 -> 1670 bytes
 .../juno/server/annotation/RestResource.java    |   432 +
 .../com/ibm/juno/server/annotation/Var.class    |   Bin 0 -> 592 bytes
 .../com/ibm/juno/server/annotation/Var.java     |    66 +
 .../juno/server/annotation/VarCategory.class    |   Bin 0 -> 536 bytes
 .../ibm/juno/server/annotation/VarCategory.java |    32 +
 .../com/ibm/juno/server/annotation/package.html |    34 +
 .../juno/server/converters/Introspectable.class |   Bin 0 -> 1950 bytes
 .../juno/server/converters/Introspectable.java  |    55 +
 .../ibm/juno/server/converters/Queryable.class  |   Bin 0 -> 3469 bytes
 .../ibm/juno/server/converters/Queryable.java   |    97 +
 .../juno/server/converters/Traversable.class    |   Bin 0 -> 1791 bytes
 .../ibm/juno/server/converters/Traversable.java |    63 +
 .../com/ibm/juno/server/converters/package.html |    34 +
 .../ibm/juno/server/doc-files/AddressBook.png   |   Bin 0 -> 44553 bytes
 .../juno/server/doc-files/AddressBookJson.png   |   Bin 0 -> 30639 bytes
 .../server/doc-files/AddressBookOptions.png     |   Bin 0 -> 224346 bytes
 .../server/doc-files/AddressBook_junostyle.png  |   Bin 0 -> 52768 bytes
 .../server/doc-files/HelloWorldResource1.png    |   Bin 0 -> 14206 bytes
 .../server/doc-files/HelloWorldResource2.png    |   Bin 0 -> 30721 bytes
 .../server/doc-files/HelloWorldResource3.png    |   Bin 0 -> 11040 bytes
 .../server/doc-files/HelloWorldResource4.png    |   Bin 0 -> 16188 bytes
 .../doc-files/HelloWorldResourceOptions.png     |   Bin 0 -> 67692 bytes
 .../doc-files/HelloWorldResourceOptionsJson.png |   Bin 0 -> 27940 bytes
 .../com/ibm/juno/server/doc-files/Options2.png  |   Bin 0 -> 9809 bytes
 .../ibm/juno/server/doc-files/OptionsPage.png   |   Bin 0 -> 56895 bytes
 .../server/doc-files/Samples_RootResources.png  |   Bin 0 -> 62372 bytes
 .../juno/server/doc-files/UrlEncodedForm.png    |   Bin 0 -> 21379 bytes
 .../server/htdocs/MethodExampleResource1.png    |   Bin 0 -> 12276 bytes
 .../com/ibm/juno/server/htdocs/javadoc.css      |   782 +
 .../ibm/juno/server/jaxrs/BaseProvider.class    |   Bin 0 -> 9644 bytes
 .../com/ibm/juno/server/jaxrs/BaseProvider.java |   144 +
 .../ibm/juno/server/jaxrs/DefaultProvider.class |   Bin 0 -> 1858 bytes
 .../ibm/juno/server/jaxrs/DefaultProvider.java  |    69 +
 .../ibm/juno/server/jaxrs/JunoProvider.class    |   Bin 0 -> 879 bytes
 .../com/ibm/juno/server/jaxrs/JunoProvider.java |    85 +
 .../com/ibm/juno/server/jaxrs/package.html      |   354 +
 .../server/jaxrs/rdf/DefaultJenaProvider.class  |   Bin 0 -> 3048 bytes
 .../server/jaxrs/rdf/DefaultJenaProvider.java   |    89 +
 .../com/ibm/juno/server/jaxrs/rdf/package.html  |    27 +
 .../server/jena/RestServletJenaDefault.class    |   Bin 0 -> 4130 bytes
 .../server/jena/RestServletJenaDefault.java     |   268 +
 .../jena/RestServletJenaGroupDefault.class      |   Bin 0 -> 1032 bytes
 .../jena/RestServletJenaGroupDefault.java       |    39 +
 .../com/ibm/juno/server/jena/package.html       |    40 +
 .../bin/server/com/ibm/juno/server/juno.ico     |   Bin 0 -> 39438 bytes
 ...eanDescription$BeanPropertyDescription.class |   Bin 0 -> 979 bytes
 .../juno/server/labels/BeanDescription.class    |   Bin 0 -> 2083 bytes
 .../ibm/juno/server/labels/BeanDescription.java |    69 +
 .../labels/ChildResourceDescriptions.class      |   Bin 0 -> 2189 bytes
 .../labels/ChildResourceDescriptions.java       |    59 +
 .../ibm/juno/server/labels/DefaultLabels.class  |   Bin 0 -> 2899 bytes
 .../ibm/juno/server/labels/DefaultLabels.java   |    74 +
 .../labels/MethodDescription$Response.class     |   Bin 0 -> 1825 bytes
 .../juno/server/labels/MethodDescription.class  |   Bin 0 -> 5388 bytes
 .../juno/server/labels/MethodDescription.java   |   324 +
 .../juno/server/labels/NameDescription.class    |   Bin 0 -> 1024 bytes
 .../ibm/juno/server/labels/NameDescription.java |    70 +
 .../juno/server/labels/ParamDescription.class   |   Bin 0 -> 1308 bytes
 .../juno/server/labels/ParamDescription.java    |    99 +
 .../server/labels/ResourceDescription.class     |   Bin 0 -> 3402 bytes
 .../juno/server/labels/ResourceDescription.java |   104 +
 .../ibm/juno/server/labels/ResourceLink.class   |   Bin 0 -> 1926 bytes
 .../ibm/juno/server/labels/ResourceLink.java    |    64 +
 .../juno/server/labels/ResourceOptions.class    |   Bin 0 -> 6442 bytes
 .../ibm/juno/server/labels/ResourceOptions.java |   278 +
 .../server/com/ibm/juno/server/labels/Var.class |   Bin 0 -> 1911 bytes
 .../server/com/ibm/juno/server/labels/Var.java  |    83 +
 .../server/labels/nls/DefaultLabels.properties  |    36 +
 .../com/ibm/juno/server/labels/package.html     |    34 +
 .../matchers/MultipartFormDataMatcher.class     |   Bin 0 -> 816 bytes
 .../matchers/MultipartFormDataMatcher.java      |    24 +
 .../server/matchers/UrlEncodedFormMatcher.class |   Bin 0 -> 817 bytes
 .../server/matchers/UrlEncodedFormMatcher.java  |    24 +
 .../com/ibm/juno/server/matchers/package.html   |    27 +
 .../bin/server/com/ibm/juno/server/package.html |  3575 +++++
 .../RemoteableServiceProperties.class           |   Bin 0 -> 514 bytes
 .../remoteable/RemoteableServiceProperties.java |    35 +
 .../server/remoteable/RemoteableServlet.class   |   Bin 0 -> 5846 bytes
 .../server/remoteable/RemoteableServlet.java    |   150 +
 .../ibm/juno/server/remoteable/doc-files/1.png  |   Bin 0 -> 15845 bytes
 .../ibm/juno/server/remoteable/doc-files/2.png  |   Bin 0 -> 20379 bytes
 .../ibm/juno/server/remoteable/doc-files/3.png  |   Bin 0 -> 33919 bytes
 .../ibm/juno/server/remoteable/doc-files/4.png  |   Bin 0 -> 21108 bytes
 .../ibm/juno/server/remoteable/doc-files/5.png  |   Bin 0 -> 10553 bytes
 .../ibm/juno/server/remoteable/doc-files/6.png  |   Bin 0 -> 24934 bytes
 .../com/ibm/juno/server/remoteable/package.html |   349 +
 .../juno/server/response/DefaultHandler.class   |   Bin 0 -> 4623 bytes
 .../juno/server/response/DefaultHandler.java    |    85 +
 .../server/response/InputStreamHandler.class    |   Bin 0 -> 1376 bytes
 .../server/response/InputStreamHandler.java     |    40 +
 .../juno/server/response/ReaderHandler.class    |   Bin 0 -> 1183 bytes
 .../ibm/juno/server/response/ReaderHandler.java |    38 +
 .../juno/server/response/RedirectHandler.class  |   Bin 0 -> 1995 bytes
 .../juno/server/response/RedirectHandler.java   |    46 +
 .../server/response/StreamableHandler.class     |   Bin 0 -> 2161 bytes
 .../juno/server/response/StreamableHandler.java |    49 +
 .../juno/server/response/WritableHandler.class  |   Bin 0 -> 2123 bytes
 .../juno/server/response/WritableHandler.java   |    49 +
 .../response/ZipFileListResponseHandler.class   |   Bin 0 -> 2603 bytes
 .../response/ZipFileListResponseHandler.java    |    58 +
 .../com/ibm/juno/server/response/package.html   |    34 +
 .../com/ibm/juno/server/styles/devops.css       |   200 +
 .../server/com/ibm/juno/server/styles/juno.css  |   129 +
 com.ibm.team.juno.releng/build.properties       |    31 +
 com.ibm.team.juno.releng/build.xml              |   536 +
 .../build/Juno Cloud API (v5.2.0.0).zip         |   Bin 0 -> 36988162 bytes
 com.ibm.team.juno.releng/build/Readme.txt       |    33 +
 .../com.ibm.team.juno.client_5.2.0.0.jar        |   Bin 0 -> 56332 bytes
 .../com.ibm.team.juno.microservice_5.2.0.0.jar  |   Bin 0 -> 49605 bytes
 .../com.ibm.team.juno.server_5.2.0.0.jar        |   Bin 0 -> 178033 bytes
 .../build/bundles/com.ibm.team.juno_5.2.0.0.jar |   Bin 0 -> 669287 bytes
 com.ibm.team.juno.releng/build/derby.log        |     0
 .../build/doc/allclasses-frame.html             |   436 +
 .../build/doc/allclasses-noframe.html           |   436 +
 .../com/ibm/juno/client/AllowAllRedirects.html  |   299 +
 .../doc/com/ibm/juno/client/DateHeader.html     |   261 +
 .../doc/com/ibm/juno/client/HttpMethod.html     |   455 +
 .../doc/com/ibm/juno/client/NameValuePairs.html |   357 +
 .../com/ibm/juno/client/ResponsePattern.html    |   374 +
 .../build/doc/com/ibm/juno/client/RestCall.html |  1274 ++
 .../com/ibm/juno/client/RestCallException.html  |   449 +
 .../ibm/juno/client/RestCallInterceptor.html    |   338 +
 .../doc/com/ibm/juno/client/RestCallLogger.html |   367 +
 .../doc/com/ibm/juno/client/RestClient.html     |  2142 +++
 .../com/ibm/juno/client/RestRequestEntity.html  |   356 +
 .../build/doc/com/ibm/juno/client/RetryOn.html  |   255 +
 .../ibm/juno/client/SSLOpts.CertValidate.html   |   336 +
 .../com/ibm/juno/client/SSLOpts.HostVerify.html |   336 +
 .../build/doc/com/ibm/juno/client/SSLOpts.html  |   487 +
 .../juno/client/SerializedNameValuePair.html    |   304 +
 .../ibm/juno/client/SimpleX509TrustManager.html |   319 +
 .../client/class-use/AllowAllRedirects.html     |   117 +
 .../ibm/juno/client/class-use/DateHeader.html   |   117 +
 .../ibm/juno/client/class-use/HttpMethod.html   |   185 +
 .../juno/client/class-use/NameValuePairs.html   |   161 +
 .../juno/client/class-use/ResponsePattern.html  |   161 +
 .../com/ibm/juno/client/class-use/RestCall.html |   444 +
 .../client/class-use/RestCallException.html     |   327 +
 .../client/class-use/RestCallInterceptor.html   |   182 +
 .../juno/client/class-use/RestCallLogger.html   |   117 +
 .../ibm/juno/client/class-use/RestClient.html   |   515 +
 .../client/class-use/RestRequestEntity.html     |   117 +
 .../com/ibm/juno/client/class-use/RetryOn.html  |   178 +
 .../client/class-use/SSLOpts.CertValidate.html  |   204 +
 .../client/class-use/SSLOpts.HostVerify.html    |   204 +
 .../com/ibm/juno/client/class-use/SSLOpts.html  |   256 +
 .../class-use/SerializedNameValuePair.html      |   117 +
 .../class-use/SimpleX509TrustManager.html       |   117 +
 .../client/deprecated/CertificateStore.html     |   334 +
 .../deprecated/ICertificateValidator.Trust.html |   364 +
 .../deprecated/ICertificateValidator.html       |   249 +
 .../client/deprecated/ITrustStoreProvider.html  |   269 +
 .../deprecated/LenientCertificateValidator.html |   340 +
 .../deprecated/SharedTrustStoreProvider.html    |   337 +
 .../deprecated/ValidatingX509TrustManager.html  |   338 +
 .../deprecated/class-use/CertificateStore.html  |   180 +
 .../class-use/ICertificateValidator.Trust.html  |   181 +
 .../class-use/ICertificateValidator.html        |   189 +
 .../class-use/ITrustStoreProvider.html          |   159 +
 .../class-use/LenientCertificateValidator.html  |   117 +
 .../class-use/SharedTrustStoreProvider.html     |   117 +
 .../class-use/ValidatingX509TrustManager.html   |   117 +
 .../juno/client/deprecated/package-frame.html   |    30 +
 .../juno/client/deprecated/package-summary.html |   183 +
 .../juno/client/deprecated/package-tree.html    |   150 +
 .../ibm/juno/client/deprecated/package-use.html |   168 +
 .../ibm/juno/client/jazz/JazzRestClient.html    |   535 +
 .../client/jazz/class-use/JazzRestClient.html   |   117 +
 .../com/ibm/juno/client/jazz/package-frame.html |    18 +
 .../ibm/juno/client/jazz/package-summary.html   |   299 +
 .../com/ibm/juno/client/jazz/package-tree.html  |   142 +
 .../com/ibm/juno/client/jazz/package-use.html   |   117 +
 .../doc/com/ibm/juno/client/package-frame.html  |    43 +
 .../com/ibm/juno/client/package-summary.html    |  1094 ++
 .../doc/com/ibm/juno/client/package-tree.html   |   215 +
 .../doc/com/ibm/juno/client/package-use.html    |   234 +
 .../doc/com/ibm/juno/core/BeanContext.html      |  1454 ++
 .../com/ibm/juno/core/BeanContextFactory.html   |   553 +
 .../ibm/juno/core/BeanContextProperties.html    |   637 +
 .../build/doc/com/ibm/juno/core/BeanMap.html    |   840 ++
 .../doc/com/ibm/juno/core/BeanMapEntry.html     |   415 +
 .../build/doc/com/ibm/juno/core/BeanMeta.html   |   751 +
 .../doc/com/ibm/juno/core/BeanMetaFiltered.html |   398 +
 .../doc/com/ibm/juno/core/BeanPropertyMeta.html |   644 +
 .../juno/core/BeanProxyInvocationHandler.html   |   285 +
 .../com/ibm/juno/core/BeanRuntimeException.html |   341 +
 .../build/doc/com/ibm/juno/core/ClassMeta.html  |  1575 ++
 .../build/doc/com/ibm/juno/core/CoreApi.html    |   564 +
 .../build/doc/com/ibm/juno/core/Delegate.html   |   224 +
 .../com/ibm/juno/core/FormattedException.html   |   302 +
 .../juno/core/FormattedRuntimeException.html    |   291 +
 .../core/InvalidDataConversionException.html    |   267 +
 .../build/doc/com/ibm/juno/core/Lockable.html   |   362 +
 .../doc/com/ibm/juno/core/LockedException.html  |   225 +
 .../build/doc/com/ibm/juno/core/MediaRange.html |   470 +
 .../build/doc/com/ibm/juno/core/ObjectList.html |  1051 ++
 .../build/doc/com/ibm/juno/core/ObjectMap.html  |  2094 +++
 .../doc/com/ibm/juno/core/PropertyNamer.html    |   225 +
 .../ibm/juno/core/PropertyNamerDashedLC.html    |   282 +
 .../com/ibm/juno/core/PropertyNamerDefault.html |   285 +
 .../build/doc/com/ibm/juno/core/Streamable.html |   243 +
 .../build/doc/com/ibm/juno/core/Visibility.html |   579 +
 .../build/doc/com/ibm/juno/core/Writable.html   |   243 +
 .../doc/com/ibm/juno/core/annotation/Bean.html  |   485 +
 .../juno/core/annotation/BeanConstructor.html   |   263 +
 .../ibm/juno/core/annotation/BeanIgnore.html    |   167 +
 .../ibm/juno/core/annotation/BeanProperty.html  |   435 +
 .../ibm/juno/core/annotation/BeanSubType.html   |   233 +
 .../com/ibm/juno/core/annotation/Consumes.html  |   249 +
 .../com/ibm/juno/core/annotation/Filter.html    |   262 +
 .../ibm/juno/core/annotation/NameProperty.html  |   163 +
 .../juno/core/annotation/ParentProperty.html    |   163 +
 .../com/ibm/juno/core/annotation/Produces.html  |   277 +
 .../ibm/juno/core/annotation/Remoteable.html    |   157 +
 .../ibm/juno/core/annotation/ThreadSafe.html    |   160 +
 .../doc/com/ibm/juno/core/annotation/URI.html   |   195 +
 .../juno/core/annotation/class-use/Bean.html    |   243 +
 .../annotation/class-use/BeanConstructor.html   |   117 +
 .../core/annotation/class-use/BeanIgnore.html   |   253 +
 .../core/annotation/class-use/BeanProperty.html |   357 +
 .../core/annotation/class-use/BeanSubType.html  |   117 +
 .../core/annotation/class-use/Consumes.html     |   347 +
 .../juno/core/annotation/class-use/Filter.html  |   117 +
 .../core/annotation/class-use/NameProperty.html |   161 +
 .../annotation/class-use/ParentProperty.html    |   161 +
 .../core/annotation/class-use/Produces.html     |   483 +
 .../core/annotation/class-use/Remoteable.html   |   117 +
 .../core/annotation/class-use/ThreadSafe.html   |   161 +
 .../ibm/juno/core/annotation/class-use/URI.html |   117 +
 .../ibm/juno/core/annotation/package-frame.html |    30 +
 .../juno/core/annotation/package-summary.html   |   219 +
 .../ibm/juno/core/annotation/package-tree.html  |   138 +
 .../ibm/juno/core/annotation/package-use.html   |   601 +
 .../ibm/juno/core/class-use/BeanContext.html    |   678 +
 .../juno/core/class-use/BeanContextFactory.html |   248 +
 .../core/class-use/BeanContextProperties.html   |   117 +
 .../com/ibm/juno/core/class-use/BeanMap.html    |   309 +
 .../ibm/juno/core/class-use/BeanMapEntry.html   |   161 +
 .../com/ibm/juno/core/class-use/BeanMeta.html   |   290 +
 .../juno/core/class-use/BeanMetaFiltered.html   |   117 +
 .../juno/core/class-use/BeanPropertyMeta.html   |   479 +
 .../class-use/BeanProxyInvocationHandler.html   |   117 +
 .../core/class-use/BeanRuntimeException.html    |   221 +
 .../com/ibm/juno/core/class-use/ClassMeta.html  |  1337 ++
 .../com/ibm/juno/core/class-use/CoreApi.html    |   845 ++
 .../com/ibm/juno/core/class-use/Delegate.html   |   202 +
 .../juno/core/class-use/FormattedException.html |   187 +
 .../class-use/FormattedRuntimeException.html    |   161 +
 .../InvalidDataConversionException.html         |   187 +
 .../com/ibm/juno/core/class-use/Lockable.html   |   844 ++
 .../juno/core/class-use/LockedException.html    |   900 ++
 .../com/ibm/juno/core/class-use/MediaRange.html |   182 +
 .../com/ibm/juno/core/class-use/ObjectList.html |   294 +
 .../com/ibm/juno/core/class-use/ObjectMap.html  |  1169 ++
 .../ibm/juno/core/class-use/PropertyNamer.html  |   208 +
 .../core/class-use/PropertyNamerDashedLC.html   |   117 +
 .../core/class-use/PropertyNamerDefault.html    |   117 +
 .../com/ibm/juno/core/class-use/Streamable.html |   161 +
 .../com/ibm/juno/core/class-use/Visibility.html |   191 +
 .../com/ibm/juno/core/class-use/Writable.html   |   222 +
 .../com/ibm/juno/core/csv/CsvSerializer.html    |   375 +
 .../juno/core/csv/class-use/CsvSerializer.html  |   159 +
 .../com/ibm/juno/core/csv/package-frame.html    |    18 +
 .../com/ibm/juno/core/csv/package-summary.html  |   166 +
 .../doc/com/ibm/juno/core/csv/package-tree.html |   146 +
 .../doc/com/ibm/juno/core/csv/package-use.html  |   154 +
 .../ibm/juno/core/doc-files/AddressBook.html    |   106 +
 .../build/doc/com/ibm/juno/core/dto/Link.html   |   453 +
 .../com/ibm/juno/core/dto/ResultSetList.html    |   368 +
 .../com/ibm/juno/core/dto/atom/Category.html    |   444 +
 .../doc/com/ibm/juno/core/dto/atom/Common.html  |   337 +
 .../com/ibm/juno/core/dto/atom/CommonEntry.html |   650 +
 .../doc/com/ibm/juno/core/dto/atom/Content.html |   497 +
 .../doc/com/ibm/juno/core/dto/atom/Entry.html   |   769 +
 .../doc/com/ibm/juno/core/dto/atom/Feed.html    |   827 ++
 .../com/ibm/juno/core/dto/atom/Generator.html   |   445 +
 .../doc/com/ibm/juno/core/dto/atom/Icon.html    |   371 +
 .../doc/com/ibm/juno/core/dto/atom/Id.html      |   371 +
 .../doc/com/ibm/juno/core/dto/atom/Link.html    |   570 +
 .../doc/com/ibm/juno/core/dto/atom/Logo.html    |   371 +
 .../doc/com/ibm/juno/core/dto/atom/Person.html  |   441 +
 .../doc/com/ibm/juno/core/dto/atom/Source.html  |   744 +
 .../core/dto/atom/Text.TextContentHandler.html  |   342 +
 .../doc/com/ibm/juno/core/dto/atom/Text.html    |   472 +
 .../juno/core/dto/atom/class-use/Category.html  |   250 +
 .../juno/core/dto/atom/class-use/Common.html    |   254 +
 .../core/dto/atom/class-use/CommonEntry.html    |   254 +
 .../juno/core/dto/atom/class-use/Content.html   |   198 +
 .../ibm/juno/core/dto/atom/class-use/Entry.html |   280 +
 .../ibm/juno/core/dto/atom/class-use/Feed.html  |   247 +
 .../juno/core/dto/atom/class-use/Generator.html |   214 +
 .../ibm/juno/core/dto/atom/class-use/Icon.html  |   202 +
 .../ibm/juno/core/dto/atom/class-use/Id.html    |   231 +
 .../ibm/juno/core/dto/atom/class-use/Link.html  |   268 +
 .../ibm/juno/core/dto/atom/class-use/Logo.html  |   202 +
 .../juno/core/dto/atom/class-use/Person.html    |   292 +
 .../juno/core/dto/atom/class-use/Source.html    |   256 +
 .../atom/class-use/Text.TextContentHandler.html |   117 +
 .../ibm/juno/core/dto/atom/class-use/Text.html  |   322 +
 .../core/dto/atom/doc-files/Example_HTML.png    |   Bin 0 -> 31484 bytes
 .../ibm/juno/core/dto/atom/package-frame.html   |    32 +
 .../ibm/juno/core/dto/atom/package-summary.html |   777 +
 .../ibm/juno/core/dto/atom/package-tree.html    |   153 +
 .../com/ibm/juno/core/dto/atom/package-use.html |   219 +
 .../com/ibm/juno/core/dto/class-use/Link.html   |   267 +
 .../juno/core/dto/class-use/ResultSetList.html  |   117 +
 .../com/ibm/juno/core/dto/cognos/Column.html    |   439 +
 .../ibm/juno/core/dto/cognos/DataSet.Row.html   |   330 +
 .../com/ibm/juno/core/dto/cognos/DataSet.html   |   422 +
 .../juno/core/dto/cognos/class-use/Column.html  |   215 +
 .../core/dto/cognos/class-use/DataSet.Row.html  |   176 +
 .../juno/core/dto/cognos/class-use/DataSet.html |   167 +
 .../ibm/juno/core/dto/cognos/doc-files/HTML.png |   Bin 0 -> 8476 bytes
 .../ibm/juno/core/dto/cognos/doc-files/JSON.png |   Bin 0 -> 6963 bytes
 .../juno/core/dto/cognos/doc-files/RDFXML.png   |   Bin 0 -> 19981 bytes
 .../ibm/juno/core/dto/cognos/package-frame.html |    20 +
 .../juno/core/dto/cognos/package-summary.html   |   297 +
 .../ibm/juno/core/dto/cognos/package-tree.html  |   148 +
 .../ibm/juno/core/dto/cognos/package-use.html   |   164 +
 .../ibm/juno/core/dto/jsonschema/JsonType.html  |   473 +
 .../juno/core/dto/jsonschema/JsonTypeArray.html |   371 +
 .../Schema.BooleanOrSchemaArrayFilter.html      |   381 +
 .../Schema.BooleanOrSchemaFilter.html           |   381 +
 .../Schema.JsonTypeOrJsonTypeArrayFilter.html   |   381 +
 .../Schema.SchemaOrSchemaArrayFilter.html       |   381 +
 .../ibm/juno/core/dto/jsonschema/Schema.html    |  2062 +++
 .../juno/core/dto/jsonschema/SchemaArray.html   |   371 +
 .../ibm/juno/core/dto/jsonschema/SchemaMap.html |   415 +
 .../core/dto/jsonschema/SchemaProperty.html     |   303 +
 .../jsonschema/SchemaPropertySimpleArray.html   |   281 +
 .../ibm/juno/core/dto/jsonschema/SchemaRef.html |   270 +
 .../core/dto/jsonschema/class-use/JsonType.html |   227 +
 .../dto/jsonschema/class-use/JsonTypeArray.html |   168 +
 .../Schema.BooleanOrSchemaArrayFilter.html      |   117 +
 .../class-use/Schema.BooleanOrSchemaFilter.html |   117 +
 .../Schema.JsonTypeOrJsonTypeArrayFilter.html   |   117 +
 .../Schema.SchemaOrSchemaArrayFilter.html       |   117 +
 .../core/dto/jsonschema/class-use/Schema.html   |   749 +
 .../dto/jsonschema/class-use/SchemaArray.html   |   168 +
 .../dto/jsonschema/class-use/SchemaMap.html     |   177 +
 .../jsonschema/class-use/SchemaProperty.html    |   182 +
 .../class-use/SchemaPropertySimpleArray.html    |   117 +
 .../dto/jsonschema/class-use/SchemaRef.html     |   117 +
 .../dto/jsonschema/doc-files/Example_Html.png   |   Bin 0 -> 31260 bytes
 .../dto/jsonschema/doc-files/Example_Json.png   |   Bin 0 -> 22006 bytes
 .../jsonschema/doc-files/Example_Options.png    |   Bin 0 -> 41887 bytes
 .../dto/jsonschema/doc-files/Example_Turtle.png |   Bin 0 -> 28988 bytes
 .../jsonschema/doc-files/Example_UrlEncoded.png |   Bin 0 -> 21715 bytes
 .../dto/jsonschema/doc-files/Example_Xml.png    |   Bin 0 -> 28095 bytes
 .../doc-files/Example_XmlRdfAbbrev.png          |   Bin 0 -> 36296 bytes
 .../juno/core/dto/jsonschema/package-frame.html |    32 +
 .../core/dto/jsonschema/package-summary.html    |   700 +
 .../juno/core/dto/jsonschema/package-tree.html  |   190 +
 .../juno/core/dto/jsonschema/package-use.html   |   179 +
 .../com/ibm/juno/core/dto/package-frame.html    |    19 +
 .../com/ibm/juno/core/dto/package-summary.html  |   152 +
 .../doc/com/ibm/juno/core/dto/package-tree.html |   147 +
 .../doc/com/ibm/juno/core/dto/package-use.html  |   200 +
 .../doc/com/ibm/juno/core/encoders/Encoder.html |   320 +
 .../ibm/juno/core/encoders/EncoderGroup.html    |   418 +
 .../com/ibm/juno/core/encoders/GzipEncoder.html |   323 +
 .../ibm/juno/core/encoders/IdentityEncoder.html |   367 +
 .../juno/core/encoders/class-use/Encoder.html   |   212 +
 .../core/encoders/class-use/EncoderGroup.html   |   226 +
 .../core/encoders/class-use/GzipEncoder.html    |   117 +
 .../encoders/class-use/IdentityEncoder.html     |   161 +
 .../ibm/juno/core/encoders/package-frame.html   |    21 +
 .../ibm/juno/core/encoders/package-summary.html |   182 +
 .../ibm/juno/core/encoders/package-tree.html    |   136 +
 .../com/ibm/juno/core/encoders/package-use.html |   187 +
 .../juno/core/filter/AnnotationBeanFilter.html  |   296 +
 .../com/ibm/juno/core/filter/BeanFilter.html    |   838 ++
 .../ibm/juno/core/filter/Filter.FilterType.html |   334 +
 .../com/ibm/juno/core/filter/Filter.NULL.html   |   277 +
 .../doc/com/ibm/juno/core/filter/Filter.html    |   462 +
 .../juno/core/filter/InterfaceBeanFilter.html   |   296 +
 .../ibm/juno/core/filter/PojoFilter.NULL.html   |   296 +
 .../com/ibm/juno/core/filter/PojoFilter.html    |   585 +
 .../ibm/juno/core/filter/SurrogateFilter.html   |   505 +
 .../filter/class-use/AnnotationBeanFilter.html  |   117 +
 .../juno/core/filter/class-use/BeanFilter.html  |   283 +
 .../filter/class-use/Filter.FilterType.html     |   189 +
 .../juno/core/filter/class-use/Filter.NULL.html |   117 +
 .../ibm/juno/core/filter/class-use/Filter.html  |   514 +
 .../filter/class-use/InterfaceBeanFilter.html   |   117 +
 .../core/filter/class-use/PojoFilter.NULL.html  |   117 +
 .../juno/core/filter/class-use/PojoFilter.html  |   528 +
 .../core/filter/class-use/SurrogateFilter.html  |   161 +
 .../ibm/juno/core/filter/doc-files/classes.dnx  |    99 +
 .../ibm/juno/core/filter/doc-files/classes.png  |   Bin 0 -> 15527 bytes
 .../com/ibm/juno/core/filter/package-frame.html |    29 +
 .../ibm/juno/core/filter/package-summary.html   |   936 ++
 .../com/ibm/juno/core/filter/package-tree.html  |   158 +
 .../com/ibm/juno/core/filter/package-use.html   |   281 +
 .../ibm/juno/core/filters/BeanStringFilter.html |   339 +
 .../core/filters/ByteArrayBase64Filter.html     |   361 +
 .../core/filters/CalendarFilter.ISO8601DT.html  |   399 +
 .../core/filters/CalendarFilter.ISO8601DTZ.html |   379 +
 .../core/filters/CalendarFilter.Medium.html     |   318 +
 .../core/filters/CalendarFilter.RFC2822D.html   |   318 +
 .../core/filters/CalendarFilter.RFC2822DT.html  |   318 +
 .../core/filters/CalendarFilter.RFC2822DTZ.html |   320 +
 .../core/filters/CalendarFilter.Simple.html     |   318 +
 .../core/filters/CalendarFilter.ToString.html   |   327 +
 .../ibm/juno/core/filters/CalendarFilter.html   |   497 +
 .../juno/core/filters/CalendarLongFilter.html   |   360 +
 .../juno/core/filters/CalendarMapFilter.html    |   360 +
 .../com/ibm/juno/core/filters/ClassFilter.html  |   358 +
 .../juno/core/filters/DateFilter.ISO8601DT.html |   422 +
 .../core/filters/DateFilter.ISO8601DTP.html     |   325 +
 .../core/filters/DateFilter.ISO8601DTPNZ.html   |   320 +
 .../core/filters/DateFilter.ISO8601DTZ.html     |   383 +
 .../core/filters/DateFilter.ISO8601DTZP.html    |   325 +
 .../juno/core/filters/DateFilter.Medium.html    |   318 +
 .../juno/core/filters/DateFilter.RFC2822D.html  |   318 +
 .../juno/core/filters/DateFilter.RFC2822DT.html |   318 +
 .../core/filters/DateFilter.RFC2822DTZ.html     |   320 +
 .../juno/core/filters/DateFilter.Simple.html    |   318 +
 .../juno/core/filters/DateFilter.SimpleP.html   |   318 +
 .../juno/core/filters/DateFilter.ToString.html  |   327 +
 .../com/ibm/juno/core/filters/DateFilter.html   |   506 +
 .../ibm/juno/core/filters/DateLongFilter.html   |   358 +
 .../ibm/juno/core/filters/DateMapFilter.html    |   358 +
 .../juno/core/filters/EnumerationFilter.html    |   332 +
 .../ibm/juno/core/filters/IteratorFilter.html   |   332 +
 .../juno/core/filters/ReaderFilter.Html.html    |   318 +
 .../juno/core/filters/ReaderFilter.Json.html    |   318 +
 .../core/filters/ReaderFilter.PlainText.html    |   318 +
 .../ibm/juno/core/filters/ReaderFilter.Xml.html |   318 +
 .../com/ibm/juno/core/filters/ReaderFilter.html |   392 +
 .../filters/XMLGregorianCalendarFilter.html     |   368 +
 .../filters/class-use/BeanStringFilter.html     |   117 +
 .../class-use/ByteArrayBase64Filter.html        |   117 +
 .../class-use/CalendarFilter.ISO8601DT.html     |   117 +
 .../class-use/CalendarFilter.ISO8601DTZ.html    |   117 +
 .../class-use/CalendarFilter.Medium.html        |   117 +
 .../class-use/CalendarFilter.RFC2822D.html      |   117 +
 .../class-use/CalendarFilter.RFC2822DT.html     |   117 +
 .../class-use/CalendarFilter.RFC2822DTZ.html    |   117 +
 .../class-use/CalendarFilter.Simple.html        |   117 +
 .../class-use/CalendarFilter.ToString.html      |   117 +
 .../core/filters/class-use/CalendarFilter.html  |   203 +
 .../filters/class-use/CalendarLongFilter.html   |   117 +
 .../filters/class-use/CalendarMapFilter.html    |   117 +
 .../core/filters/class-use/ClassFilter.html     |   117 +
 .../filters/class-use/DateFilter.ISO8601DT.html |   167 +
 .../class-use/DateFilter.ISO8601DTP.html        |   117 +
 .../class-use/DateFilter.ISO8601DTPNZ.html      |   117 +
 .../class-use/DateFilter.ISO8601DTZ.html        |   117 +
 .../class-use/DateFilter.ISO8601DTZP.html       |   117 +
 .../filters/class-use/DateFilter.Medium.html    |   117 +
 .../filters/class-use/DateFilter.RFC2822D.html  |   117 +
 .../filters/class-use/DateFilter.RFC2822DT.html |   117 +
 .../class-use/DateFilter.RFC2822DTZ.html        |   117 +
 .../filters/class-use/DateFilter.Simple.html    |   117 +
 .../filters/class-use/DateFilter.SimpleP.html   |   117 +
 .../filters/class-use/DateFilter.ToString.html  |   117 +
 .../juno/core/filters/class-use/DateFilter.html |   227 +
 .../core/filters/class-use/DateLongFilter.html  |   117 +
 .../core/filters/class-use/DateMapFilter.html   |   117 +
 .../filters/class-use/EnumerationFilter.html    |   117 +
 .../core/filters/class-use/IteratorFilter.html  |   117 +
 .../filters/class-use/ReaderFilter.Html.html    |   117 +
 .../filters/class-use/ReaderFilter.Json.html    |   117 +
 .../class-use/ReaderFilter.PlainText.html       |   117 +
 .../filters/class-use/ReaderFilter.Xml.html     |   117 +
 .../core/filters/class-use/ReaderFilter.html    |   179 +
 .../class-use/XMLGregorianCalendarFilter.html   |   117 +
 .../ibm/juno/core/filters/package-frame.html    |    54 +
 .../ibm/juno/core/filters/package-summary.html  |   388 +
 .../com/ibm/juno/core/filters/package-tree.html |   186 +
 .../com/ibm/juno/core/filters/package-use.html  |   169 +
 .../juno/core/html/HtmlBeanPropertyMeta.html    |   321 +
 .../com/ibm/juno/core/html/HtmlClassMeta.html   |   337 +
 .../ibm/juno/core/html/HtmlDocSerializer.html   |   449 +
 .../core/html/HtmlDocSerializerProperties.html  |   487 +
 .../doc/com/ibm/juno/core/html/HtmlLink.html    |   243 +
 .../doc/com/ibm/juno/core/html/HtmlParser.html  |   765 +
 .../ibm/juno/core/html/HtmlParserContext.html   |   300 +
 .../juno/core/html/HtmlParserProperties.html    |   298 +
 .../juno/core/html/HtmlSchemaDocSerializer.html |   447 +
 .../ibm/juno/core/html/HtmlSerializer.Sq.html   |   376 +
 .../core/html/HtmlSerializer.SqReadable.html    |   377 +
 .../com/ibm/juno/core/html/HtmlSerializer.html  |   876 ++
 .../juno/core/html/HtmlSerializerContext.html   |   332 +
 .../core/html/HtmlSerializerProperties.html     |   418 +
 .../juno/core/html/HtmlSerializerWriter.html    |  1494 ++
 .../core/html/HtmlStrippedDocSerializer.html    |   434 +
 .../ibm/juno/core/html/SimpleHtmlWriter.html    |   347 +
 .../com/ibm/juno/core/html/annotation/Html.html |   280 +
 .../core/html/annotation/class-use/Html.html    |   187 +
 .../core/html/annotation/package-frame.html     |    18 +
 .../core/html/annotation/package-summary.html   |   147 +
 .../juno/core/html/annotation/package-tree.html |   126 +
 .../juno/core/html/annotation/package-use.html  |   179 +
 .../html/class-use/HtmlBeanPropertyMeta.html    |   176 +
 .../juno/core/html/class-use/HtmlClassMeta.html |   161 +
 .../core/html/class-use/HtmlDocSerializer.html  |   161 +
 .../class-use/HtmlDocSerializerProperties.html  |   117 +
 .../ibm/juno/core/html/class-use/HtmlLink.html  |   161 +
 .../juno/core/html/class-use/HtmlParser.html    |   204 +
 .../core/html/class-use/HtmlParserContext.html  |   161 +
 .../html/class-use/HtmlParserProperties.html    |   192 +
 .../html/class-use/HtmlSchemaDocSerializer.html |   117 +
 .../core/html/class-use/HtmlSerializer.Sq.html  |   161 +
 .../class-use/HtmlSerializer.SqReadable.html    |   117 +
 .../core/html/class-use/HtmlSerializer.html     |   261 +
 .../html/class-use/HtmlSerializerContext.html   |   181 +
 .../class-use/HtmlSerializerProperties.html     |   192 +
 .../html/class-use/HtmlSerializerWriter.html    |   420 +
 .../class-use/HtmlStrippedDocSerializer.html    |   167 +
 .../core/html/class-use/SimpleHtmlWriter.html   |   117 +
 .../core/html/doc-files/HTML_DESCRIPTION.png    |   Bin 0 -> 3644 bytes
 .../ibm/juno/core/html/doc-files/HTML_LINKS.png |   Bin 0 -> 593 bytes
 .../ibm/juno/core/html/doc-files/HTML_TITLE.png |   Bin 0 -> 2435 bytes
 .../com/ibm/juno/core/html/dto/HtmlElement.html |   241 +
 .../doc/com/ibm/juno/core/html/dto/Img.html     |   283 +
 .../core/html/dto/class-use/HtmlElement.html    |   161 +
 .../ibm/juno/core/html/dto/class-use/Img.html   |   117 +
 .../ibm/juno/core/html/dto/package-frame.html   |    19 +
 .../ibm/juno/core/html/dto/package-summary.html |   152 +
 .../ibm/juno/core/html/dto/package-tree.html    |   134 +
 .../com/ibm/juno/core/html/dto/package-use.html |   154 +
 .../com/ibm/juno/core/html/package-frame.html   |    37 +
 .../com/ibm/juno/core/html/package-summary.html |   290 +
 .../com/ibm/juno/core/html/package-tree.html    |   216 +
 .../doc/com/ibm/juno/core/html/package-use.html |   250 +
 .../doc/com/ibm/juno/core/ini/ConfigFile.html   |  1434 ++
 .../com/ibm/juno/core/ini/ConfigFileFormat.html |   345 +
 .../com/ibm/juno/core/ini/ConfigFileImpl.html   |  1228 ++
 .../ibm/juno/core/ini/ConfigFileListener.html   |   305 +
 .../ibm/juno/core/ini/ConfigFileWrapped.html    |  1151 ++
 .../doc/com/ibm/juno/core/ini/ConfigMgr.html    |   513 +
 .../doc/com/ibm/juno/core/ini/ConfigUtils.html  |   233 +
 .../doc/com/ibm/juno/core/ini/Encoder.html      |   242 +
 .../com/ibm/juno/core/ini/EntryListener.html    |   304 +
 .../doc/com/ibm/juno/core/ini/Section.html      |   627 +
 .../com/ibm/juno/core/ini/SectionListener.html  |   304 +
 .../doc/com/ibm/juno/core/ini/XorEncoder.html   |   342 +
 .../ibm/juno/core/ini/class-use/ConfigFile.html |   613 +
 .../core/ini/class-use/ConfigFileFormat.html    |   201 +
 .../juno/core/ini/class-use/ConfigFileImpl.html |   213 +
 .../core/ini/class-use/ConfigFileListener.html  |   190 +
 .../core/ini/class-use/ConfigFileWrapped.html   |   117 +
 .../ibm/juno/core/ini/class-use/ConfigMgr.html  |   187 +
 .../juno/core/ini/class-use/ConfigUtils.html    |   117 +
 .../ibm/juno/core/ini/class-use/Encoder.html    |   189 +
 .../juno/core/ini/class-use/EntryListener.html  |   117 +
 .../ibm/juno/core/ini/class-use/Section.html    |   291 +
 .../core/ini/class-use/SectionListener.html     |   117 +
 .../ibm/juno/core/ini/class-use/XorEncoder.html |   161 +
 .../com/ibm/juno/core/ini/doc-files/config1.png |   Bin 0 -> 39851 bytes
 .../com/ibm/juno/core/ini/doc-files/config2.png |   Bin 0 -> 48881 bytes
 .../com/ibm/juno/core/ini/doc-files/config3.png |   Bin 0 -> 59095 bytes
 .../com/ibm/juno/core/ini/package-frame.html    |    35 +
 .../com/ibm/juno/core/ini/package-summary.html  |   843 ++
 .../doc/com/ibm/juno/core/ini/package-tree.html |   161 +
 .../doc/com/ibm/juno/core/ini/package-use.html  |   263 +
 .../doc/com/ibm/juno/core/jena/Constants.html   |   473 +
 .../ibm/juno/core/jena/RdfBeanPropertyMeta.html |   301 +
 .../com/ibm/juno/core/jena/RdfClassMeta.html    |   314 +
 .../ibm/juno/core/jena/RdfCollectionFormat.html |   384 +
 .../com/ibm/juno/core/jena/RdfParser.N3.html    |   347 +
 .../ibm/juno/core/jena/RdfParser.NTriple.html   |   347 +
 .../ibm/juno/core/jena/RdfParser.Turtle.html    |   347 +
 .../com/ibm/juno/core/jena/RdfParser.Xml.html   |   347 +
 .../doc/com/ibm/juno/core/jena/RdfParser.html   |   746 +
 .../ibm/juno/core/jena/RdfParserContext.html    |   267 +
 .../ibm/juno/core/jena/RdfParserProperties.html |   356 +
 .../com/ibm/juno/core/jena/RdfProperties.html   |  1010 ++
 .../ibm/juno/core/jena/RdfSerializer.N3.html    |   347 +
 .../juno/core/jena/RdfSerializer.NTriple.html   |   347 +
 .../juno/core/jena/RdfSerializer.Turtle.html    |   347 +
 .../ibm/juno/core/jena/RdfSerializer.Xml.html   |   347 +
 .../juno/core/jena/RdfSerializer.XmlAbbrev.html |   348 +
 .../com/ibm/juno/core/jena/RdfSerializer.html   |   781 +
 .../juno/core/jena/RdfSerializerContext.html    |   328 +
 .../juno/core/jena/RdfSerializerProperties.html |   379 +
 .../doc/com/ibm/juno/core/jena/RdfUtils.html    |   268 +
 .../com/ibm/juno/core/jena/annotation/Rdf.html  |   269 +
 .../ibm/juno/core/jena/annotation/RdfNs.html    |   228 +
 .../juno/core/jena/annotation/RdfSchema.html    |   307 +
 .../core/jena/annotation/class-use/Rdf.html     |   177 +
 .../core/jena/annotation/class-use/RdfNs.html   |   117 +
 .../jena/annotation/class-use/RdfSchema.html    |   162 +
 .../core/jena/annotation/package-frame.html     |    20 +
 .../core/jena/annotation/package-summary.html   |   158 +
 .../juno/core/jena/annotation/package-tree.html |   128 +
 .../juno/core/jena/annotation/package-use.html  |   159 +
 .../ibm/juno/core/jena/class-use/Constants.html |   117 +
 .../jena/class-use/RdfBeanPropertyMeta.html     |   176 +
 .../juno/core/jena/class-use/RdfClassMeta.html  |   161 +
 .../jena/class-use/RdfCollectionFormat.html     |   180 +
 .../juno/core/jena/class-use/RdfParser.N3.html  |   117 +
 .../core/jena/class-use/RdfParser.NTriple.html  |   117 +
 .../core/jena/class-use/RdfParser.Turtle.html   |   117 +
 .../juno/core/jena/class-use/RdfParser.Xml.html |   117 +
 .../ibm/juno/core/jena/class-use/RdfParser.html |   255 +
 .../core/jena/class-use/RdfParserContext.html   |   161 +
 .../jena/class-use/RdfParserProperties.html     |   192 +
 .../juno/core/jena/class-use/RdfProperties.html |   167 +
 .../core/jena/class-use/RdfSerializer.N3.html   |   117 +
 .../jena/class-use/RdfSerializer.NTriple.html   |   117 +
 .../jena/class-use/RdfSerializer.Turtle.html    |   117 +
 .../core/jena/class-use/RdfSerializer.Xml.html  |   117 +
 .../jena/class-use/RdfSerializer.XmlAbbrev.html |   117 +
 .../juno/core/jena/class-use/RdfSerializer.html |   267 +
 .../jena/class-use/RdfSerializerContext.html    |   160 +
 .../jena/class-use/RdfSerializerProperties.html |   192 +
 .../ibm/juno/core/jena/class-use/RdfUtils.html  |   117 +
 .../juno/core/jena/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/jena/doc-files/Example_N3.png |   Bin 0 -> 37430 bytes
 .../core/jena/doc-files/Example_NTriple.png     |   Bin 0 -> 48413 bytes
 .../juno/core/jena/doc-files/Example_RDFXML.png |   Bin 0 -> 30486 bytes
 .../jena/doc-files/Example_RDFXMLABBREV.png     |   Bin 0 -> 30356 bytes
 .../juno/core/jena/doc-files/Example_Turtle.png |   Bin 0 -> 35328 bytes
 .../com/ibm/juno/core/jena/package-frame.html   |    41 +
 .../com/ibm/juno/core/jena/package-summary.html |  1930 +++
 .../com/ibm/juno/core/jena/package-tree.html    |   206 +
 .../doc/com/ibm/juno/core/jena/package-use.html |   218 +
 .../core/jso/JavaSerializedObjectParser.html    |   385 +
 .../jso/JavaSerializedObjectSerializer.html     |   384 +
 .../class-use/JavaSerializedObjectParser.html   |   159 +
 .../JavaSerializedObjectSerializer.html         |   159 +
 .../com/ibm/juno/core/jso/package-frame.html    |    19 +
 .../com/ibm/juno/core/jso/package-summary.html  |   152 +
 .../doc/com/ibm/juno/core/jso/package-tree.html |   155 +
 .../doc/com/ibm/juno/core/jso/package-use.html  |   159 +
 .../com/ibm/juno/core/json/JsonClassMeta.html   |   286 +
 .../doc/com/ibm/juno/core/json/JsonParser.html  |   820 ++
 .../ibm/juno/core/json/JsonParserContext.html   |   297 +
 .../juno/core/json/JsonParserProperties.html    |   367 +
 .../juno/core/json/JsonSchemaSerializer.html    |   427 +
 .../juno/core/json/JsonSerializer.Readable.html |   346 +
 .../juno/core/json/JsonSerializer.Simple.html   |   352 +
 .../json/JsonSerializer.SimpleReadable.html     |   355 +
 .../json/JsonSerializer.SimpleReadableSafe.html |   357 +
 .../com/ibm/juno/core/json/JsonSerializer.html  |   820 ++
 .../juno/core/json/JsonSerializerContext.html   |   315 +
 .../core/json/JsonSerializerProperties.html     |   382 +
 .../juno/core/json/JsonSerializerWriter.html    |   721 +
 .../com/ibm/juno/core/json/annotation/Json.html |   255 +
 .../core/json/annotation/class-use/Json.html    |   161 +
 .../core/json/annotation/package-frame.html     |    18 +
 .../core/json/annotation/package-summary.html   |   146 +
 .../juno/core/json/annotation/package-tree.html |   126 +
 .../juno/core/json/annotation/package-use.html  |   154 +
 .../juno/core/json/class-use/JsonClassMeta.html |   161 +
 .../juno/core/json/class-use/JsonParser.html    |   210 +
 .../core/json/class-use/JsonParserContext.html  |   161 +
 .../json/class-use/JsonParserProperties.html    |   192 +
 .../json/class-use/JsonSchemaSerializer.html    |   165 +
 .../json/class-use/JsonSerializer.Readable.html |   117 +
 .../json/class-use/JsonSerializer.Simple.html   |   167 +
 .../JsonSerializer.SimpleReadable.html          |   161 +
 .../JsonSerializer.SimpleReadableSafe.html      |   117 +
 .../core/json/class-use/JsonSerializer.html     |   267 +
 .../json/class-use/JsonSerializerContext.html   |   160 +
 .../class-use/JsonSerializerProperties.html     |   191 +
 .../json/class-use/JsonSerializerWriter.html    |   234 +
 .../juno/core/json/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../juno/core/json/doc-files/Example_JSON.png   |   Bin 0 -> 26954 bytes
 .../core/json/doc-files/Example_JSONSchema.png  |   Bin 0 -> 34114 bytes
 .../core/json/doc-files/Example_JSONSimple.png  |   Bin 0 -> 30920 bytes
 .../com/ibm/juno/core/json/package-frame.html   |    30 +
 .../com/ibm/juno/core/json/package-summary.html |  1643 +++
 .../com/ibm/juno/core/json/package-tree.html    |   191 +
 .../doc/com/ibm/juno/core/json/package-use.html |   222 +
 .../doc/com/ibm/juno/core/package-frame.html    |    53 +
 .../doc/com/ibm/juno/core/package-summary.html  |   513 +
 .../doc/com/ibm/juno/core/package-tree.html     |   219 +
 .../doc/com/ibm/juno/core/package-use.html      |  1187 ++
 .../ibm/juno/core/parser/InputStreamParser.html |   387 +
 .../ibm/juno/core/parser/ParseException.html    |   358 +
 .../doc/com/ibm/juno/core/parser/Parser.html    |  1060 ++
 .../com/ibm/juno/core/parser/ParserContext.html |   468 +
 .../com/ibm/juno/core/parser/ParserGroup.html   |   581 +
 .../ibm/juno/core/parser/ParserListener.html    |   282 +
 .../ibm/juno/core/parser/ParserProperties.html  |   361 +
 .../com/ibm/juno/core/parser/ParserReader.html  |   689 +
 .../com/ibm/juno/core/parser/ReaderParser.html  |   990 ++
 .../parser/class-use/InputStreamParser.html     |   161 +
 .../core/parser/class-use/ParseException.html   |  1415 ++
 .../ibm/juno/core/parser/class-use/Parser.html  |   662 +
 .../core/parser/class-use/ParserContext.html    |   633 +
 .../juno/core/parser/class-use/ParserGroup.html |   250 +
 .../core/parser/class-use/ParserListener.html   |   176 +
 .../core/parser/class-use/ParserProperties.html |   345 +
 .../core/parser/class-use/ParserReader.html     |   293 +
 .../core/parser/class-use/ReaderParser.html     |   587 +
 .../com/ibm/juno/core/parser/package-frame.html |    29 +
 .../ibm/juno/core/parser/package-summary.html   |   296 +
 .../com/ibm/juno/core/parser/package-tree.html  |   165 +
 .../com/ibm/juno/core/parser/package-use.html   |   765 +
 .../juno/core/plaintext/PlainTextParser.html    |   403 +
 .../core/plaintext/PlainTextSerializer.html     |   399 +
 .../plaintext/class-use/PlainTextParser.html    |   159 +
 .../class-use/PlainTextSerializer.html          |   159 +
 .../ibm/juno/core/plaintext/package-frame.html  |    19 +
 .../juno/core/plaintext/package-summary.html    |   152 +
 .../ibm/juno/core/plaintext/package-tree.html   |   155 +
 .../ibm/juno/core/plaintext/package-use.html    |   159 +
 .../core/serializer/OutputStreamSerializer.html |   385 +
 .../core/serializer/SerializeException.html     |   318 +
 .../ibm/juno/core/serializer/Serializer.html    |   730 +
 .../juno/core/serializer/SerializerContext.html |   886 ++
 .../juno/core/serializer/SerializerGroup.html   |   607 +
 .../core/serializer/SerializerProperties.html   |   728 +
 .../juno/core/serializer/SerializerWriter.html  |   833 ++
 .../ibm/juno/core/serializer/StringObject.html  |   386 +
 .../juno/core/serializer/WriterSerializer.html  |   643 +
 .../class-use/OutputStreamSerializer.html       |   161 +
 .../class-use/SerializeException.html           |   820 ++
 .../core/serializer/class-use/Serializer.html   |   856 ++
 .../serializer/class-use/SerializerContext.html |   577 +
 .../serializer/class-use/SerializerGroup.html   |   256 +
 .../class-use/SerializerProperties.html         |   333 +
 .../serializer/class-use/SerializerWriter.html  |   388 +
 .../core/serializer/class-use/StringObject.html |   161 +
 .../serializer/class-use/WriterSerializer.html  |   705 +
 .../ibm/juno/core/serializer/package-frame.html |    29 +
 .../juno/core/serializer/package-summary.html   |   298 +
 .../ibm/juno/core/serializer/package-tree.html  |   165 +
 .../ibm/juno/core/serializer/package-use.html   |   775 +
 .../ibm/juno/core/soap/SoapXmlSerializer.html   |   442 +
 .../core/soap/SoapXmlSerializerProperties.html  |   275 +
 .../core/soap/class-use/SoapXmlSerializer.html  |   117 +
 .../class-use/SoapXmlSerializerProperties.html  |   117 +
 .../com/ibm/juno/core/soap/package-frame.html   |    19 +
 .../com/ibm/juno/core/soap/package-summary.html |   152 +
 .../com/ibm/juno/core/soap/package-tree.html    |   151 +
 .../doc/com/ibm/juno/core/soap/package-use.html |   117 +
 .../core/urlencoding/UonParser.Decoding.html    |   346 +
 .../ibm/juno/core/urlencoding/UonParser.html    |   870 ++
 .../juno/core/urlencoding/UonParserContext.html |   289 +
 .../core/urlencoding/UonParserProperties.html   |   358 +
 .../juno/core/urlencoding/UonParserReader.html  |   360 +
 .../urlencoding/UonSerializer.Encoding.html     |   346 +
 .../urlencoding/UonSerializer.Readable.html     |   346 +
 .../core/urlencoding/UonSerializer.Simple.html  |   348 +
 .../UonSerializer.SimpleEncoding.html           |   348 +
 .../juno/core/urlencoding/UonSerializer.html    |   926 ++
 .../core/urlencoding/UonSerializerContext.html  |   284 +
 .../urlencoding/UonSerializerProperties.html    |   426 +
 .../core/urlencoding/UonSerializerWriter.html   |   722 +
 .../core/urlencoding/UrlEncodingClassMeta.html  |   286 +
 .../core/urlencoding/UrlEncodingParser.html     |   804 ++
 .../core/urlencoding/UrlEncodingProperties.html |   356 +
 .../UrlEncodingSerializer.Readable.html         |   372 +
 .../UrlEncodingSerializer.Simple.html           |   378 +
 .../UrlEncodingSerializer.SimpleExpanded.html   |   379 +
 .../core/urlencoding/UrlEncodingSerializer.html |   882 ++
 .../urlencoding/annotation/UrlEncoding.html     |   218 +
 .../annotation/class-use/UrlEncoding.html       |   161 +
 .../urlencoding/annotation/package-frame.html   |    18 +
 .../urlencoding/annotation/package-summary.html |   147 +
 .../urlencoding/annotation/package-tree.html    |   126 +
 .../urlencoding/annotation/package-use.html     |   155 +
 .../class-use/UonParser.Decoding.html           |   117 +
 .../core/urlencoding/class-use/UonParser.html   |   237 +
 .../urlencoding/class-use/UonParserContext.html |   182 +
 .../class-use/UonParserProperties.html          |   201 +
 .../urlencoding/class-use/UonParserReader.html  |   117 +
 .../class-use/UonSerializer.Encoding.html       |   117 +
 .../class-use/UonSerializer.Readable.html       |   117 +
 .../class-use/UonSerializer.Simple.html         |   117 +
 .../class-use/UonSerializer.SimpleEncoding.html |   117 +
 .../urlencoding/class-use/UonSerializer.html    |   285 +
 .../class-use/UonSerializerContext.html         |   187 +
 .../class-use/UonSerializerProperties.html      |   192 +
 .../class-use/UonSerializerWriter.html          |   249 +
 .../class-use/UrlEncodingClassMeta.html         |   161 +
 .../class-use/UrlEncodingParser.html            |   242 +
 .../class-use/UrlEncodingProperties.html        |   217 +
 .../UrlEncodingSerializer.Readable.html         |   117 +
 .../class-use/UrlEncodingSerializer.Simple.html |   161 +
 .../UrlEncodingSerializer.SimpleExpanded.html   |   117 +
 .../class-use/UrlEncodingSerializer.html        |   328 +
 .../core/urlencoding/doc-files/Example_HTML.png |   Bin 0 -> 32778 bytes
 .../doc-files/Example_UrlEncoding.png           |   Bin 0 -> 20958 bytes
 .../juno/core/urlencoding/doc-files/rfc_uon.txt |   352 +
 .../juno/core/urlencoding/package-frame.html    |    37 +
 .../juno/core/urlencoding/package-summary.html  |  1635 +++
 .../ibm/juno/core/urlencoding/package-tree.html |   209 +
 .../ibm/juno/core/urlencoding/package-use.html  |   278 +
 .../build/doc/com/ibm/juno/core/utils/Args.html |   570 +
 .../doc/com/ibm/juno/core/utils/ArrayUtils.html |   484 +
 .../doc/com/ibm/juno/core/utils/AsciiSet.html   |   288 +
 .../com/ibm/juno/core/utils/ByteArrayCache.html |   347 +
 .../juno/core/utils/ByteArrayInOutStream.html   |   309 +
 .../ibm/juno/core/utils/CharSequenceReader.html |   405 +
 .../core/utils/ClassUtils.ClassComparator.html  |   284 +
 .../doc/com/ibm/juno/core/utils/ClassUtils.html |   452 +
 .../ibm/juno/core/utils/CollectionUtils.html    |   288 +
 .../ibm/juno/core/utils/DelegateBeanMap.html    |   494 +
 .../com/ibm/juno/core/utils/DelegateList.html   |   339 +
 .../com/ibm/juno/core/utils/DelegateMap.html    |   347 +
 .../doc/com/ibm/juno/core/utils/FileUtils.html  |   368 +
 .../com/ibm/juno/core/utils/FilteredMap.html    |   314 +
 .../juno/core/utils/IOPipe.LineProcessor.html   |   218 +
 .../doc/com/ibm/juno/core/utils/IOPipe.html     |   394 +
 .../doc/com/ibm/juno/core/utils/IOUtils.html    |   694 +
 .../com/ibm/juno/core/utils/IdentityList.html   |   387 +
 .../doc/com/ibm/juno/core/utils/KeywordSet.html |   276 +
 .../com/ibm/juno/core/utils/ManifestFile.html   |   400 +
 .../com/ibm/juno/core/utils/MessageBundle.html  |   583 +
 .../com/ibm/juno/core/utils/MultiIterable.html  |   291 +
 .../doc/com/ibm/juno/core/utils/MultiSet.html   |   371 +
 .../ibm/juno/core/utils/PojoIntrospector.html   |   356 +
 .../doc/com/ibm/juno/core/utils/PojoQuery.html  |   511 +
 .../doc/com/ibm/juno/core/utils/PojoRest.html   |  1036 ++
 .../ibm/juno/core/utils/PojoRestException.html  |   311 +
 .../juno/core/utils/ProcBuilder.Matcher.html    |   235 +
 .../com/ibm/juno/core/utils/ProcBuilder.html    |   779 +
 .../ibm/juno/core/utils/ReflectionUtils.html    |   382 +
 .../ibm/juno/core/utils/SafeResourceBundle.html |   428 +
 .../core/utils/SafeResourceMultiBundle.html     |   420 +
 .../doc/com/ibm/juno/core/utils/SimpleMap.html  |   377 +
 .../juno/core/utils/StringBuilderWriter.html    |   498 +
 .../com/ibm/juno/core/utils/StringMapVar.html   |   293 +
 .../com/ibm/juno/core/utils/StringUtils.html    |  1017 ++
 .../doc/com/ibm/juno/core/utils/StringVar.html  |   290 +
 .../ibm/juno/core/utils/StringVarMultipart.html |   300 +
 .../ibm/juno/core/utils/StringVarResolver.html  |   476 +
 .../juno/core/utils/StringVarWithDefault.html   |   289 +
 .../doc/com/ibm/juno/core/utils/StringVars.html |   289 +
 .../ibm/juno/core/utils/TeeOutputStream.html    |   452 +
 .../doc/com/ibm/juno/core/utils/TeeWriter.html  |   448 +
 .../com/ibm/juno/core/utils/ThrowableUtils.html |   362 +
 .../doc/com/ibm/juno/core/utils/Utils.html      |   274 +
 .../juno/core/utils/ZipFileList.FileEntry.html  |   396 +
 .../core/utils/ZipFileList.ZipFileEntry.html    |   224 +
 .../com/ibm/juno/core/utils/ZipFileList.html    |   413 +
 .../com/ibm/juno/core/utils/class-use/Args.html |   161 +
 .../juno/core/utils/class-use/ArrayUtils.html   |   117 +
 .../ibm/juno/core/utils/class-use/AsciiSet.html |   117 +
 .../core/utils/class-use/ByteArrayCache.html    |   161 +
 .../utils/class-use/ByteArrayInOutStream.html   |   117 +
 .../utils/class-use/CharSequenceReader.html     |   117 +
 .../class-use/ClassUtils.ClassComparator.html   |   117 +
 .../juno/core/utils/class-use/ClassUtils.html   |   117 +
 .../core/utils/class-use/CollectionUtils.html   |   117 +
 .../core/utils/class-use/DelegateBeanMap.html   |   117 +
 .../juno/core/utils/class-use/DelegateList.html |   117 +
 .../juno/core/utils/class-use/DelegateMap.html  |   117 +
 .../juno/core/utils/class-use/FileUtils.html    |   117 +
 .../juno/core/utils/class-use/FilteredMap.html  |   117 +
 .../utils/class-use/IOPipe.LineProcessor.html   |   167 +
 .../ibm/juno/core/utils/class-use/IOPipe.html   |   199 +
 .../ibm/juno/core/utils/class-use/IOUtils.html  |   117 +
 .../juno/core/utils/class-use/IdentityList.html |   117 +
 .../juno/core/utils/class-use/KeywordSet.html   |   117 +
 .../juno/core/utils/class-use/ManifestFile.html |   117 +
 .../core/utils/class-use/MessageBundle.html     |   206 +
 .../core/utils/class-use/MultiIterable.html     |   161 +
 .../ibm/juno/core/utils/class-use/MultiSet.html |   161 +
 .../core/utils/class-use/PojoIntrospector.html  |   117 +
 .../juno/core/utils/class-use/PojoQuery.html    |   117 +
 .../ibm/juno/core/utils/class-use/PojoRest.html |   193 +
 .../core/utils/class-use/PojoRestException.html |   117 +
 .../utils/class-use/ProcBuilder.Matcher.html    |   202 +
 .../juno/core/utils/class-use/ProcBuilder.html  |   269 +
 .../core/utils/class-use/ReflectionUtils.html   |   117 +
 .../utils/class-use/SafeResourceBundle.html     |   212 +
 .../class-use/SafeResourceMultiBundle.html      |   117 +
 .../juno/core/utils/class-use/SimpleMap.html    |   117 +
 .../utils/class-use/StringBuilderWriter.html    |   169 +
 .../juno/core/utils/class-use/StringMapVar.html |   117 +
 .../juno/core/utils/class-use/StringUtils.html  |   117 +
 .../juno/core/utils/class-use/StringVar.html    |   258 +
 .../utils/class-use/StringVarMultipart.html     |   117 +
 .../core/utils/class-use/StringVarResolver.html |   380 +
 .../utils/class-use/StringVarWithDefault.html   |   162 +
 .../juno/core/utils/class-use/StringVars.html   |   117 +
 .../core/utils/class-use/TeeOutputStream.html   |   171 +
 .../juno/core/utils/class-use/TeeWriter.html    |   171 +
 .../core/utils/class-use/ThrowableUtils.html    |   117 +
 .../ibm/juno/core/utils/class-use/Utils.html    |   117 +
 .../utils/class-use/ZipFileList.FileEntry.html  |   117 +
 .../class-use/ZipFileList.ZipFileEntry.html     |   176 +
 .../juno/core/utils/class-use/ZipFileList.html  |   161 +
 .../com/ibm/juno/core/utils/log/JunoLogger.html |   639 +
 .../core/utils/log/class-use/JunoLogger.html    |   199 +
 .../ibm/juno/core/utils/log/package-frame.html  |    18 +
 .../juno/core/utils/log/package-summary.html    |   137 +
 .../ibm/juno/core/utils/log/package-tree.html   |   134 +
 .../ibm/juno/core/utils/log/package-use.html    |   175 +
 .../com/ibm/juno/core/utils/package-frame.html  |    69 +
 .../ibm/juno/core/utils/package-summary.html    |   464 +
 .../com/ibm/juno/core/utils/package-tree.html   |   264 +
 .../com/ibm/juno/core/utils/package-use.html    |   345 +
 .../doc/com/ibm/juno/core/xml/Namespace.html    |   373 +
 .../com/ibm/juno/core/xml/NamespaceFactory.html |   326 +
 .../doc/com/ibm/juno/core/xml/XmlBeanMeta.html  |   345 +
 .../ibm/juno/core/xml/XmlBeanPropertyMeta.html  |   352 +
 .../doc/com/ibm/juno/core/xml/XmlClassMeta.html |   348 +
 .../juno/core/xml/XmlContentHandler.NULL.html   |   206 +
 .../ibm/juno/core/xml/XmlContentHandler.html    |   363 +
 .../juno/core/xml/XmlDocSerializer.Simple.html  |   367 +
 .../com/ibm/juno/core/xml/XmlDocSerializer.html |   419 +
 .../doc/com/ibm/juno/core/xml/XmlParser.html    |   764 +
 .../com/ibm/juno/core/xml/XmlParserContext.html |   299 +
 .../ibm/juno/core/xml/XmlParserProperties.html  |   668 +
 .../juno/core/xml/XmlSchemaDocSerializer.html   |   414 +
 .../ibm/juno/core/xml/XmlSchemaSerializer.html  |   472 +
 .../ibm/juno/core/xml/XmlSerializer.Simple.html |   352 +
 .../juno/core/xml/XmlSerializer.SimpleSq.html   |   355 +
 .../core/xml/XmlSerializer.SimpleXmlJsonSq.html |   356 +
 .../com/ibm/juno/core/xml/XmlSerializer.Sq.html |   350 +
 .../juno/core/xml/XmlSerializer.SqReadable.html |   351 +
 .../juno/core/xml/XmlSerializer.XmlJson.html    |   352 +
 .../juno/core/xml/XmlSerializer.XmlJsonSq.html  |   351 +
 .../com/ibm/juno/core/xml/XmlSerializer.html    |   957 ++
 .../ibm/juno/core/xml/XmlSerializerContext.html |   470 +
 .../juno/core/xml/XmlSerializerProperties.html  |   519 +
 .../ibm/juno/core/xml/XmlSerializerWriter.html  |  1594 ++
 .../doc/com/ibm/juno/core/xml/XmlUtils.html     |   491 +
 .../com/ibm/juno/core/xml/annotation/Xml.html   |   453 +
 .../ibm/juno/core/xml/annotation/XmlFormat.html |   388 +
 .../com/ibm/juno/core/xml/annotation/XmlNs.html |   228 +
 .../ibm/juno/core/xml/annotation/XmlSchema.html |   307 +
 .../juno/core/xml/annotation/class-use/Xml.html |   534 +
 .../xml/annotation/class-use/XmlFormat.html     |   223 +
 .../core/xml/annotation/class-use/XmlNs.html    |   117 +
 .../xml/annotation/class-use/XmlSchema.html     |   185 +
 .../juno/core/xml/annotation/package-frame.html |    24 +
 .../core/xml/annotation/package-summary.html    |   175 +
 .../juno/core/xml/annotation/package-tree.html  |   140 +
 .../juno/core/xml/annotation/package-use.html   |   279 +
 .../ibm/juno/core/xml/class-use/Namespace.html  |   342 +
 .../core/xml/class-use/NamespaceFactory.html    |   117 +
 .../juno/core/xml/class-use/XmlBeanMeta.html    |   176 +
 .../core/xml/class-use/XmlBeanPropertyMeta.html |   176 +
 .../juno/core/xml/class-use/XmlClassMeta.html   |   161 +
 .../xml/class-use/XmlContentHandler.NULL.html   |   117 +
 .../core/xml/class-use/XmlContentHandler.html   |   209 +
 .../xml/class-use/XmlDocSerializer.Simple.html  |   117 +
 .../core/xml/class-use/XmlDocSerializer.html    |   161 +
 .../ibm/juno/core/xml/class-use/XmlParser.html  |   204 +
 .../core/xml/class-use/XmlParserContext.html    |   161 +
 .../core/xml/class-use/XmlParserProperties.html |   192 +
 .../xml/class-use/XmlSchemaDocSerializer.html   |   117 +
 .../core/xml/class-use/XmlSchemaSerializer.html |   161 +
 .../xml/class-use/XmlSerializer.Simple.html     |   167 +
 .../xml/class-use/XmlSerializer.SimpleSq.html   |   161 +
 .../XmlSerializer.SimpleXmlJsonSq.html          |   117 +
 .../core/xml/class-use/XmlSerializer.Sq.html    |   161 +
 .../xml/class-use/XmlSerializer.SqReadable.html |   117 +
 .../xml/class-use/XmlSerializer.XmlJson.html    |   161 +
 .../xml/class-use/XmlSerializer.XmlJsonSq.html  |   117 +
 .../juno/core/xml/class-use/XmlSerializer.html  |   409 +
 .../xml/class-use/XmlSerializerContext.html     |   247 +
 .../xml/class-use/XmlSerializerProperties.html  |   264 +
 .../core/xml/class-use/XmlSerializerWriter.html |   605 +
 .../ibm/juno/core/xml/class-use/XmlUtils.html   |   117 +
 .../juno/core/xml/doc-files/Example_HTML.png    |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/xml/doc-files/Example_XML.png |   Bin 0 -> 32865 bytes
 .../core/xml/doc-files/Example_XMLSchema.png    |   Bin 0 -> 45685 bytes
 .../core/xml/doc-files/Example_XMLSimple.png    |   Bin 0 -> 34372 bytes
 .../com/ibm/juno/core/xml/package-frame.html    |    46 +
 .../com/ibm/juno/core/xml/package-summary.html  |  2593 ++++
 .../doc/com/ibm/juno/core/xml/package-tree.html |   222 +
 .../doc/com/ibm/juno/core/xml/package-use.html  |   379 +
 .../com/ibm/juno/microservice/Microservice.html |   708 +
 .../doc/com/ibm/juno/microservice/Resource.html |   344 +
 .../ibm/juno/microservice/ResourceGroup.html    |   402 +
 .../com/ibm/juno/microservice/ResourceJena.html |   289 +
 .../ibm/juno/microservice/RestMicroservice.html |   727 +
 .../microservice/class-use/Microservice.html    |   182 +
 .../juno/microservice/class-use/Resource.html   |   179 +
 .../microservice/class-use/ResourceGroup.html   |   161 +
 .../microservice/class-use/ResourceJena.html    |   117 +
 .../class-use/RestMicroservice.html             |   117 +
 .../ibm/juno/microservice/doc-files/build1.png  |   Bin 0 -> 2633 bytes
 .../ibm/juno/microservice/doc-files/build2.png  |   Bin 0 -> 8634 bytes
 .../juno/microservice/doc-files/helloworld1.png |   Bin 0 -> 14050 bytes
 .../microservice/doc-files/instructions1.png    |   Bin 0 -> 44658 bytes
 .../microservice/doc-files/instructions2.png    |   Bin 0 -> 54971 bytes
 .../microservice/doc-files/instructions3.png    |   Bin 0 -> 20755 bytes
 .../microservice/doc-files/instructions4.png    |   Bin 0 -> 28672 bytes
 .../microservice/doc-files/instructions5.png    |   Bin 0 -> 8894 bytes
 .../microservice/doc-files/instructions6.png    |   Bin 0 -> 22345 bytes
 .../juno/microservice/doc-files/manifest1.png   |   Bin 0 -> 10493 bytes
 .../ibm/juno/microservice/package-frame.html    |    22 +
 .../ibm/juno/microservice/package-summary.html  |  1078 ++
 .../com/ibm/juno/microservice/package-tree.html |   161 +
 .../com/ibm/juno/microservice/package-use.html  |   182 +
 .../microservice/resources/ConfigResource.html  |   530 +
 .../DirectoryResource.FileResource.html         |   378 +
 .../resources/DirectoryResource.html            |   549 +
 .../resources/LogEntryFormatter.html            |   372 +
 .../microservice/resources/LogParser.Entry.html |   401 +
 .../juno/microservice/resources/LogParser.html  |   403 +
 .../resources/LogsResource.FileResource.html    |   381 +
 .../microservice/resources/LogsResource.html    |   511 +
 .../resources/SampleRootResource.html           |   314 +
 .../resources/ShutdownResource.html             |   336 +
 .../resources/class-use/ConfigResource.html     |   117 +
 .../DirectoryResource.FileResource.html         |   117 +
 .../resources/class-use/DirectoryResource.html  |   117 +
 .../resources/class-use/LogEntryFormatter.html  |   165 +
 .../resources/class-use/LogParser.Entry.html    |   172 +
 .../resources/class-use/LogParser.html          |   167 +
 .../class-use/LogsResource.FileResource.html    |   117 +
 .../resources/class-use/LogsResource.html       |   117 +
 .../resources/class-use/SampleRootResource.html |   117 +
 .../resources/class-use/ShutdownResource.html   |   117 +
 .../microservice/resources/package-frame.html   |    25 +
 .../microservice/resources/package-summary.html |   188 +
 .../microservice/resources/package-tree.html    |   171 +
 .../microservice/resources/package-use.html     |   164 +
 .../doc/com/ibm/juno/server/ReaderResource.html |   383 +
 .../build/doc/com/ibm/juno/server/Redirect.html |   384 +
 .../com/ibm/juno/server/ResponseHandler.html    |   280 +
 .../doc/com/ibm/juno/server/RestConverter.html  |   265 +
 .../doc/com/ibm/juno/server/RestException.html  |   400 +
 .../doc/com/ibm/juno/server/RestGuard.html      |   342 +
 .../doc/com/ibm/juno/server/RestMatcher.html    |   304 +
 .../doc/com/ibm/juno/server/RestRequest.html    |  2358 +++
 .../doc/com/ibm/juno/server/RestResponse.html   |   718 +
 .../doc/com/ibm/juno/server/RestServlet.html    |  2652 ++++
 .../com/ibm/juno/server/RestServletDefault.html |   485 +
 .../ibm/juno/server/RestServletException.html   |   309 +
 .../juno/server/RestServletGroupDefault.html    |   332 +
 .../doc/com/ibm/juno/server/RestServletNls.html |   298 +
 .../ibm/juno/server/RestServletProperties.html  |   518 +
 .../doc/com/ibm/juno/server/RestUtils.html      |   398 +
 .../doc/com/ibm/juno/server/StreamResource.html |   367 +
 .../doc/com/ibm/juno/server/UrlPathPattern.html |   380 +
 .../com/ibm/juno/server/annotation/Attr.html    |   253 +
 .../com/ibm/juno/server/annotation/Content.html |   188 +
 .../ibm/juno/server/annotation/HasParam.html    |   268 +
 .../ibm/juno/server/annotation/HasQParam.html   |   234 +
 .../com/ibm/juno/server/annotation/Header.html  |   229 +
 .../com/ibm/juno/server/annotation/Inherit.html |   363 +
 .../ibm/juno/server/annotation/Messages.html    |   179 +
 .../com/ibm/juno/server/annotation/Method.html  |   180 +
 .../com/ibm/juno/server/annotation/Param.html   |   283 +
 .../juno/server/annotation/PathRemainder.html   |   178 +
 .../ibm/juno/server/annotation/Properties.html  |   194 +
 .../ibm/juno/server/annotation/Property.html    |   244 +
 .../com/ibm/juno/server/annotation/QParam.html  |   279 +
 .../ibm/juno/server/annotation/Response.html    |   289 +
 .../ibm/juno/server/annotation/RestMethod.html  |   825 ++
 .../juno/server/annotation/RestResource.html    |   875 ++
 .../doc/com/ibm/juno/server/annotation/Var.html |   290 +
 .../ibm/juno/server/annotation/VarCategory.html |   341 +
 .../juno/server/annotation/class-use/Attr.html  |   240 +
 .../server/annotation/class-use/Content.html    |   176 +
 .../server/annotation/class-use/HasParam.html   |   117 +
 .../server/annotation/class-use/HasQParam.html  |   117 +
 .../server/annotation/class-use/Header.html     |   117 +
 .../server/annotation/class-use/Inherit.html    |   168 +
 .../server/annotation/class-use/Messages.html   |   117 +
 .../server/annotation/class-use/Method.html     |   117 +
 .../juno/server/annotation/class-use/Param.html |   311 +
 .../annotation/class-use/PathRemainder.html     |   203 +
 .../server/annotation/class-use/Properties.html |   178 +
 .../server/annotation/class-use/Property.html   |   117 +
 .../server/annotation/class-use/QParam.html     |   117 +
 .../server/annotation/class-use/Response.html   |   117 +
 .../server/annotation/class-use/RestMethod.html |   402 +
 .../annotation/class-use/RestResource.html      |   287 +
 .../juno/server/annotation/class-use/Var.html   |   117 +
 .../annotation/class-use/VarCategory.html       |   117 +
 .../juno/server/annotation/package-frame.html   |    41 +
 .../juno/server/annotation/package-summary.html |   283 +
 .../juno/server/annotation/package-tree.html    |   161 +
 .../ibm/juno/server/annotation/package-use.html |   321 +
 .../juno/server/class-use/ReaderResource.html   |   217 +
 .../com/ibm/juno/server/class-use/Redirect.html |   117 +
 .../juno/server/class-use/ResponseHandler.html  |   238 +
 .../juno/server/class-use/RestConverter.html    |   231 +
 .../juno/server/class-use/RestException.html    |   369 +
 .../ibm/juno/server/class-use/RestGuard.html    |   193 +
 .../ibm/juno/server/class-use/RestMatcher.html  |   167 +
 .../ibm/juno/server/class-use/RestRequest.html  |   669 +
 .../ibm/juno/server/class-use/RestResponse.html |   365 +
 .../ibm/juno/server/class-use/RestServlet.html  |   442 +
 .../server/class-use/RestServletDefault.html    |   269 +
 .../server/class-use/RestServletException.html  |   294 +
 .../class-use/RestServletGroupDefault.html      |   187 +
 .../juno/server/class-use/RestServletNls.html   |   162 +
 .../server/class-use/RestServletProperties.html |   117 +
 .../ibm/juno/server/class-use/RestUtils.html    |   117 +
 .../juno/server/class-use/StreamResource.html   |   180 +
 .../juno/server/class-use/UrlPathPattern.html   |   161 +
 .../juno/server/converters/Introspectable.html  |   294 +
 .../ibm/juno/server/converters/Queryable.html   |   307 +
 .../ibm/juno/server/converters/Traversable.html |   300 +
 .../converters/class-use/Introspectable.html    |   117 +
 .../server/converters/class-use/Queryable.html  |   117 +
 .../converters/class-use/Traversable.html       |   117 +
 .../juno/server/converters/package-frame.html   |    20 +
 .../juno/server/converters/package-summary.html |   158 +
 .../juno/server/converters/package-tree.html    |   132 +
 .../ibm/juno/server/converters/package-use.html |   117 +
 .../ibm/juno/server/doc-files/AddressBook.png   |   Bin 0 -> 44553 bytes
 .../juno/server/doc-files/AddressBookJson.png   |   Bin 0 -> 30639 bytes
 .../server/doc-files/AddressBookOptions.png     |   Bin 0 -> 224346 bytes
 .../server/doc-files/AddressBook_junostyle.png  |   Bin 0 -> 52768 bytes
 .../server/doc-files/HelloWorldResource1.png    |   Bin 0 -> 14206 bytes
 .../server/doc-files/HelloWorldResource2.png    |   Bin 0 -> 30721 bytes
 .../server/doc-files/HelloWorldResource3.png    |   Bin 0 -> 11040 bytes
 .../server/doc-files/HelloWorldResource4.png    |   Bin 0 -> 16188 bytes
 .../doc-files/HelloWorldResourceOptions.png     |   Bin 0 -> 67692 bytes
 .../doc-files/HelloWorldResourceOptionsJson.png |   Bin 0 -> 27940 bytes
 .../com/ibm/juno/server/doc-files/Options2.png  |   Bin 0 -> 9809 bytes
 .../ibm/juno/server/doc-files/OptionsPage.png   |   Bin 0 -> 56895 bytes
 .../server/doc-files/Samples_RootResources.png  |   Bin 0 -> 62372 bytes
 .../juno/server/doc-files/UrlEncodedForm.png    |   Bin 0 -> 21379 bytes
 .../com/ibm/juno/server/jaxrs/BaseProvider.html |   419 +
 .../ibm/juno/server/jaxrs/DefaultProvider.html  |   252 +
 .../com/ibm/juno/server/jaxrs/JunoProvider.html |   304 +
 .../server/jaxrs/class-use/BaseProvider.html    |   187 +
 .../server/jaxrs/class-use/DefaultProvider.html |   117 +
 .../server/jaxrs/class-use/JunoProvider.html    |   187 +
 .../ibm/juno/server/jaxrs/package-frame.html    |    23 +
 .../ibm/juno/server/jaxrs/package-summary.html  |   488 +
 .../com/ibm/juno/server/jaxrs/package-tree.html |   138 +
 .../com/ibm/juno/server/jaxrs/package-use.html  |   187 +
 .../server/jaxrs/rdf/DefaultJenaProvider.html   |   252 +
 .../rdf/class-use/DefaultJenaProvider.html      |   117 +
 .../juno/server/jaxrs/rdf/package-frame.html    |    18 +
 .../juno/server/jaxrs/rdf/package-summary.html  |   146 +
 .../ibm/juno/server/jaxrs/rdf/package-tree.html |   134 +
 .../ibm/juno/server/jaxrs/rdf/package-use.html  |   117 +
 .../server/jena/RestServletJenaDefault.html     |   513 +
 .../jena/RestServletJenaGroupDefault.html       |   328 +
 .../jena/class-use/RestServletJenaDefault.html  |   187 +
 .../class-use/RestServletJenaGroupDefault.html  |   117 +
 .../com/ibm/juno/server/jena/package-frame.html |    19 +
 .../ibm/juno/server/jena/package-summary.html   |   156 +
 .../com/ibm/juno/server/jena/package-tree.html  |   146 +
 .../com/ibm/juno/server/jena/package-use.html   |   177 +
 ...BeanDescription.BeanPropertyDescription.html |   296 +
 .../ibm/juno/server/labels/BeanDescription.html |   320 +
 .../labels/ChildResourceDescriptions.html       |   360 +
 .../ibm/juno/server/labels/DefaultLabels.html   |   286 +
 .../labels/MethodDescription.Response.html      |   378 +
 .../juno/server/labels/MethodDescription.html   |   671 +
 .../ibm/juno/server/labels/NameDescription.html |   344 +
 .../juno/server/labels/ParamDescription.html    |   377 +
 .../juno/server/labels/ResourceDescription.html |   427 +
 .../ibm/juno/server/labels/ResourceLink.html    |   279 +
 .../ibm/juno/server/labels/ResourceOptions.html |   675 +
 .../doc/com/ibm/juno/server/labels/Var.html     |   413 +
 ...BeanDescription.BeanPropertyDescription.html |   161 +
 .../labels/class-use/BeanDescription.html       |   117 +
 .../class-use/ChildResourceDescriptions.html    |   228 +
 .../server/labels/class-use/DefaultLabels.html  |   117 +
 .../class-use/MethodDescription.Response.html   |   182 +
 .../labels/class-use/MethodDescription.html     |   292 +
 .../labels/class-use/NameDescription.html       |   161 +
 .../labels/class-use/ParamDescription.html      |   186 +
 .../labels/class-use/ResourceDescription.html   |   159 +
 .../server/labels/class-use/ResourceLink.html   |   117 +
 .../labels/class-use/ResourceOptions.html       |   285 +
 .../ibm/juno/server/labels/class-use/Var.html   |   218 +
 .../ibm/juno/server/labels/package-frame.html   |    29 +
 .../ibm/juno/server/labels/package-summary.html |   212 +
 .../ibm/juno/server/labels/package-tree.html    |   164 +
 .../com/ibm/juno/server/labels/package-use.html |   255 +
 .../matchers/MultipartFormDataMatcher.html      |   275 +
 .../server/matchers/UrlEncodedFormMatcher.html  |   275 +
 .../class-use/MultipartFormDataMatcher.html     |   117 +
 .../class-use/UrlEncodedFormMatcher.html        |   117 +
 .../ibm/juno/server/matchers/package-frame.html |    19 +
 .../juno/server/matchers/package-summary.html   |   152 +
 .../ibm/juno/server/matchers/package-tree.html  |   135 +
 .../ibm/juno/server/matchers/package-use.html   |   117 +
 .../doc/com/ibm/juno/server/package-frame.html  |    40 +
 .../com/ibm/juno/server/package-summary.html    |  3805 +++++
 .../doc/com/ibm/juno/server/package-tree.html   |   195 +
 .../doc/com/ibm/juno/server/package-use.html    |   490 +
 .../remoteable/RemoteableServiceProperties.html |   282 +
 .../server/remoteable/RemoteableServlet.html    |   406 +
 .../class-use/RemoteableServiceProperties.html  |   117 +
 .../remoteable/class-use/RemoteableServlet.html |   117 +
 .../ibm/juno/server/remoteable/doc-files/1.png  |   Bin 0 -> 15845 bytes
 .../ibm/juno/server/remoteable/doc-files/2.png  |   Bin 0 -> 20379 bytes
 .../ibm/juno/server/remoteable/doc-files/3.png  |   Bin 0 -> 33919 bytes
 .../ibm/juno/server/remoteable/doc-files/4.png  |   Bin 0 -> 21108 bytes
 .../ibm/juno/server/remoteable/doc-files/5.png  |   Bin 0 -> 10553 bytes
 .../ibm/juno/server/remoteable/doc-files/6.png  |   Bin 0 -> 24934 bytes
 .../juno/server/remoteable/package-frame.html   |    19 +
 .../juno/server/remoteable/package-summary.html |   467 +
 .../juno/server/remoteable/package-tree.html    |   147 +
 .../ibm/juno/server/remoteable/package-use.html |   117 +
 .../juno/server/response/DefaultHandler.html    |   295 +
 .../server/response/InputStreamHandler.html     |   292 +
 .../ibm/juno/server/response/ReaderHandler.html |   290 +
 .../juno/server/response/RedirectHandler.html   |   288 +
 .../juno/server/response/StreamableHandler.html |   290 +
 .../juno/server/response/WritableHandler.html   |   290 +
 .../response/ZipFileListResponseHandler.html    |   292 +
 .../response/class-use/DefaultHandler.html      |   117 +
 .../response/class-use/InputStreamHandler.html  |   117 +
 .../response/class-use/ReaderHandler.html       |   117 +
 .../response/class-use/RedirectHandler.html     |   117 +
 .../response/class-use/StreamableHandler.html   |   117 +
 .../response/class-use/WritableHandler.html     |   117 +
 .../class-use/ZipFileListResponseHandler.html   |   117 +
 .../ibm/juno/server/response/package-frame.html |    24 +
 .../juno/server/response/package-summary.html   |   182 +
 .../ibm/juno/server/response/package-tree.html  |   136 +
 .../ibm/juno/server/response/package-use.html   |   117 +
 .../build/doc/constant-values.html              |  1376 ++
 .../build/doc/deprecated-list.html              |   194 +
 .../build/doc/doc-files/Microservices.1.png     |   Bin 0 -> 22345 bytes
 .../doc-files/Samples.AddressBookResource.1.png |   Bin 0 -> 44553 bytes
 .../doc-files/Samples.AddressBookResource.2.png |   Bin 0 -> 224346 bytes
 .../Samples.AddressBookResource.Demo.1.png      |   Bin 0 -> 17539 bytes
 .../Samples.AddressBookResource.Demo.10.png     |   Bin 0 -> 37153 bytes
 .../Samples.AddressBookResource.Demo.2.png      |   Bin 0 -> 47285 bytes
 .../Samples.AddressBookResource.Demo.3.png      |   Bin 0 -> 40911 bytes
 .../Samples.AddressBookResource.Demo.4.png      |   Bin 0 -> 40461 bytes
 .../Samples.AddressBookResource.Demo.5.png      |   Bin 0 -> 49884 bytes
 .../Samples.AddressBookResource.Demo.6.png      |   Bin 0 -> 52332 bytes
 .../Samples.AddressBookResource.Demo.7.png      |   Bin 0 -> 39401 bytes
 .../Samples.AddressBookResource.Demo.8.png      |   Bin 0 -> 34154 bytes
 .../Samples.AddressBookResource.Demo.9.png      |   Bin 0 -> 51831 bytes
 ...les.AddressBookResource.Introspectable.1.png |   Bin 0 -> 21714 bytes
 .../Samples.AddressBookResource.Queryable.1.png |   Bin 0 -> 43970 bytes
 .../Samples.AddressBookResource.Queryable.2.png |   Bin 0 -> 35177 bytes
 .../Samples.AddressBookResource.Queryable.3.png |   Bin 0 -> 35137 bytes
 ...amples.AddressBookResource.Traversable.1.png |   Bin 0 -> 28868 bytes
 ...amples.AddressBookResource.Traversable.2.png |   Bin 0 -> 20464 bytes
 .../doc-files/Samples.AtomFeedResource.1.png    |   Bin 0 -> 45184 bytes
 .../doc-files/Samples.AtomFeedResource.2.png    |   Bin 0 -> 78940 bytes
 .../doc-files/Samples.AtomFeedResource.3.png    |   Bin 0 -> 28698 bytes
 .../build/doc/doc-files/Samples.Building.1.png  |   Bin 0 -> 14082 bytes
 .../build/doc/doc-files/Samples.Building.2.png  |   Bin 0 -> 5543 bytes
 .../doc/doc-files/Samples.ConfigResource.1.png  |   Bin 0 -> 38071 bytes
 .../doc/doc-files/Samples.ConfigResource.2.png  |   Bin 0 -> 42599 bytes
 .../doc/doc-files/Samples.ConfigResource.3.png  |   Bin 0 -> 41856 bytes
 .../Samples.DockerRegistryResource.1.png        |   Bin 0 -> 16230 bytes
 .../Samples.DockerRegistryResource.2.png        |   Bin 0 -> 23808 bytes
 .../doc-files/Samples.HelloWorldResource.1.png  |   Bin 0 -> 15414 bytes
 .../doc-files/Samples.HelloWorldResource.2.png  |   Bin 0 -> 10797 bytes
 .../doc-files/Samples.HelloWorldResource.3.png  |   Bin 0 -> 66934 bytes
 .../doc/doc-files/Samples.Installing.1.png      |   Bin 0 -> 52312 bytes
 .../doc/doc-files/Samples.Installing.2.png      |   Bin 0 -> 59664 bytes
 .../doc/doc-files/Samples.Installing.3.png      |   Bin 0 -> 25927 bytes
 .../doc-files/Samples.JsonSchemaResource.1.png  |   Bin 0 -> 36315 bytes
 .../doc-files/Samples.JsonSchemaResource.2.png  |   Bin 0 -> 28837 bytes
 .../doc/doc-files/Samples.LogsResource.1.png    |   Bin 0 -> 37594 bytes
 .../doc/doc-files/Samples.LogsResource.2.png    |   Bin 0 -> 42497 bytes
 .../doc/doc-files/Samples.LogsResource.3.png    |   Bin 0 -> 56603 bytes
 .../Samples.MethodExampleResource.1.png         |   Bin 0 -> 27555 bytes
 .../Samples.MethodExampleResource.2.png         |   Bin 0 -> 71023 bytes
 .../doc/doc-files/Samples.PhotosResource.1.png  |   Bin 0 -> 16442 bytes
 .../doc/doc-files/Samples.PhotosResource.2.png  |   Bin 0 -> 71952 bytes
 ...Samples.RequestEchoResource.1.htmlschema.png |   Bin 0 -> 35501 bytes
 .../Samples.RequestEchoResource.1.json.png      |   Bin 0 -> 30092 bytes
 ...Samples.RequestEchoResource.1.jsonschema.png |   Bin 0 -> 31731 bytes
 ...Samples.RequestEchoResource.1.jsonsimple.png |   Bin 0 -> 29302 bytes
 .../doc-files/Samples.RequestEchoResource.1.png |   Bin 0 -> 54743 bytes
 .../Samples.RequestEchoResource.1.uon.png       |   Bin 0 -> 64778 bytes
 ...amples.RequestEchoResource.1.urlencoding.png |   Bin 0 -> 71054 bytes
 .../Samples.RequestEchoResource.1.xml.png       |   Bin 0 -> 43989 bytes
 .../Samples.RequestEchoResource.1.xmlschema.png |   Bin 0 -> 47951 bytes
 .../doc-files/Samples.RequestEchoResource.2.png |   Bin 0 -> 30872 bytes
 .../doc-files/Samples.RequestEchoResource.3.png |   Bin 0 -> 27501 bytes
 .../doc-files/Samples.RequestEchoResource.4.png |   Bin 0 -> 22149 bytes
 .../build/doc/doc-files/Samples.Running.1.png   |   Bin 0 -> 40422 bytes
 .../build/doc/doc-files/Samples.Running.2.png   |   Bin 0 -> 15925 bytes
 .../build/doc/doc-files/Samples.Running.3.png   |   Bin 0 -> 62643 bytes
 .../Samples.SampleRemoteableServlet.1.png       |   Bin 0 -> 23969 bytes
 .../Samples.SampleRemoteableServlet.2.png       |   Bin 0 -> 29986 bytes
 .../Samples.SampleRemoteableServlet.3.png       |   Bin 0 -> 45596 bytes
 .../doc-files/Samples.SqlQueryResource.1.png    |   Bin 0 -> 16113 bytes
 .../doc-files/Samples.SqlQueryResource.2.png    |   Bin 0 -> 40356 bytes
 .../doc/doc-files/Samples.TempDirResource.1.png |   Bin 0 -> 32843 bytes
 .../doc/doc-files/Samples.TempDirResource.2.png |   Bin 0 -> 20359 bytes
 .../Samples.TumblrParserResource.1.png          |   Bin 0 -> 168439 bytes
 .../Samples.UrlEncodedFormResource.1.png        |   Bin 0 -> 24026 bytes
 .../Samples.UrlEncodedFormResource.2.png        |   Bin 0 -> 31318 bytes
 .../build/doc/doc-files/Server.Html.png         |   Bin 0 -> 52497 bytes
 .../build/doc/doc-files/Server.Json.png         |   Bin 0 -> 29692 bytes
 .../build/doc/doc-files/Server.N3.png           |   Bin 0 -> 45391 bytes
 .../build/doc/doc-files/Server.NTuple.png       |   Bin 0 -> 55713 bytes
 .../build/doc/doc-files/Server.Options.png      |   Bin 0 -> 67005 bytes
 .../build/doc/doc-files/Server.RdfXml.png       |   Bin 0 -> 45274 bytes
 .../build/doc/doc-files/Server.SimpleXml.png    |   Bin 0 -> 36746 bytes
 .../build/doc/doc-files/Server.Turtle.png       |   Bin 0 -> 45180 bytes
 .../build/doc/doc-files/Server.Uon.png          |   Bin 0 -> 28160 bytes
 .../build/doc/doc-files/Server.UrlEncoding.png  |   Bin 0 -> 32516 bytes
 .../build/doc/doc-files/Server.Xml.png          |   Bin 0 -> 45446 bytes
 .../build/doc/help-doc.html                     |   222 +
 .../build/doc/index-all.html                    | 12808 +++++++++++++++++
 com.ibm.team.juno.releng/build/doc/index.html   |    66 +
 com.ibm.team.juno.releng/build/doc/javadoc.css  |  1143 ++
 .../build/doc/overview-frame.html               |    62 +
 .../build/doc/overview-summary.html             |  7901 ++++++++++
 .../build/doc/overview-tree.html                |   961 ++
 com.ibm.team.juno.releng/build/doc/package-list |    44 +
 .../build/doc/resources/background.gif          |   Bin 0 -> 2313 bytes
 .../build/doc/resources/tab.gif                 |   Bin 0 -> 291 bytes
 .../build/doc/resources/titlebar.gif            |   Bin 0 -> 10701 bytes
 .../build/doc/resources/titlebar_end.gif        |   Bin 0 -> 849 bytes
 .../build/doc/serialized-form.html              |   890 ++
 .../com/ibm/juno/client/AllowAllRedirects.html  |    99 +
 .../com/ibm/juno/client/DateHeader.html         |   111 +
 .../com/ibm/juno/client/HttpMethod.html         |   132 +
 .../com/ibm/juno/client/NameValuePairs.html     |   116 +
 .../com/ibm/juno/client/ResponsePattern.html    |   206 +
 .../src-html/com/ibm/juno/client/RestCall.html  |  1016 ++
 .../com/ibm/juno/client/RestCallException.html  |   222 +
 .../ibm/juno/client/RestCallInterceptor.html    |   128 +
 .../com/ibm/juno/client/RestCallLogger.html     |   188 +
 .../com/ibm/juno/client/RestClient.html         |  1483 ++
 .../com/ibm/juno/client/RestRequestEntity.html  |   158 +
 .../src-html/com/ibm/juno/client/RetryOn.html   |   107 +
 .../ibm/juno/client/SSLOpts.CertValidate.html   |   257 +
 .../com/ibm/juno/client/SSLOpts.HostVerify.html |   257 +
 .../src-html/com/ibm/juno/client/SSLOpts.html   |   257 +
 .../juno/client/SerializedNameValuePair.html    |   151 +
 .../ibm/juno/client/SimpleX509TrustManager.html |   134 +
 .../client/deprecated/CertificateStore.html     |   199 +
 .../deprecated/ICertificateValidator.Trust.html |   118 +
 .../deprecated/ICertificateValidator.html       |   118 +
 .../client/deprecated/ITrustStoreProvider.html  |   111 +
 .../deprecated/LenientCertificateValidator.html |    98 +
 .../deprecated/SharedTrustStoreProvider.html    |   176 +
 .../deprecated/ValidatingX509TrustManager.html  |   185 +
 .../ibm/juno/client/jazz/JazzRestClient.html    |   464 +
 .../src-html/com/ibm/juno/core/BeanContext.html |  1880 +++
 .../com/ibm/juno/core/BeanContextFactory.html   |   526 +
 .../ibm/juno/core/BeanContextProperties.html    |   260 +
 .../doc/src-html/com/ibm/juno/core/BeanMap.html |   533 +
 .../com/ibm/juno/core/BeanMapEntry.html         |   193 +
 .../src-html/com/ibm/juno/core/BeanMeta.html    |   821 ++
 .../com/ibm/juno/core/BeanMetaFiltered.html     |   142 +
 .../com/ibm/juno/core/BeanPropertyMeta.html     |   875 ++
 .../juno/core/BeanProxyInvocationHandler.html   |   150 +
 .../com/ibm/juno/core/BeanRuntimeException.html |   134 +
 .../src-html/com/ibm/juno/core/ClassMeta.html   |  1334 ++
 .../doc/src-html/com/ibm/juno/core/CoreApi.html |   244 +
 .../src-html/com/ibm/juno/core/Delegate.html    |   101 +
 .../com/ibm/juno/core/FormattedException.html   |   125 +
 .../juno/core/FormattedRuntimeException.html    |   116 +
 .../core/InvalidDataConversionException.html    |   105 +
 .../src-html/com/ibm/juno/core/Lockable.html    |   156 +
 .../com/ibm/juno/core/LockedException.html      |   100 +
 .../src-html/com/ibm/juno/core/MediaRange.html  |   384 +
 .../src-html/com/ibm/juno/core/ObjectList.html  |   641 +
 .../src-html/com/ibm/juno/core/ObjectMap.html   |  1475 ++
 .../com/ibm/juno/core/PropertyNamer.html        |   103 +
 .../ibm/juno/core/PropertyNamerDashedLC.html    |   134 +
 .../com/ibm/juno/core/PropertyNamerDefault.html |   107 +
 .../src-html/com/ibm/juno/core/Streamable.html  |   110 +
 .../src-html/com/ibm/juno/core/Visibility.html  |   267 +
 .../src-html/com/ibm/juno/core/Writable.html    |   110 +
 .../com/ibm/juno/core/annotation/Bean.html      |   288 +
 .../juno/core/annotation/BeanConstructor.html   |   154 +
 .../ibm/juno/core/annotation/BeanIgnore.html    |   106 +
 .../ibm/juno/core/annotation/BeanProperty.html  |   254 +
 .../ibm/juno/core/annotation/BeanSubType.html   |   114 +
 .../com/ibm/juno/core/annotation/Consumes.html  |   141 +
 .../com/ibm/juno/core/annotation/Filter.html    |   154 +
 .../ibm/juno/core/annotation/NameProperty.html  |   103 +
 .../juno/core/annotation/ParentProperty.html    |   103 +
 .../com/ibm/juno/core/annotation/Produces.html  |   154 +
 .../ibm/juno/core/annotation/Remoteable.html    |    95 +
 .../ibm/juno/core/annotation/ThreadSafe.html    |    97 +
 .../com/ibm/juno/core/annotation/URI.html       |   136 +
 .../com/ibm/juno/core/csv/CsvSerializer.html    |   162 +
 .../src-html/com/ibm/juno/core/dto/Link.html    |   205 +
 .../com/ibm/juno/core/dto/ResultSetList.html    |   177 +
 .../com/ibm/juno/core/dto/atom/Category.html    |   209 +
 .../com/ibm/juno/core/dto/atom/Common.html      |   156 +
 .../com/ibm/juno/core/dto/atom/CommonEntry.html |   348 +
 .../com/ibm/juno/core/dto/atom/Content.html     |   216 +
 .../com/ibm/juno/core/dto/atom/Entry.html       |   315 +
 .../com/ibm/juno/core/dto/atom/Feed.html        |   356 +
 .../com/ibm/juno/core/dto/atom/Generator.html   |   211 +
 .../com/ibm/juno/core/dto/atom/Icon.html        |   165 +
 .../src-html/com/ibm/juno/core/dto/atom/Id.html |   164 +
 .../com/ibm/juno/core/dto/atom/Link.html        |   294 +
 .../com/ibm/juno/core/dto/atom/Logo.html        |   165 +
 .../com/ibm/juno/core/dto/atom/Person.html      |   203 +
 .../com/ibm/juno/core/dto/atom/Source.html      |   295 +
 .../core/dto/atom/Text.TextContentHandler.html  |   251 +
 .../com/ibm/juno/core/dto/atom/Text.html        |   251 +
 .../com/ibm/juno/core/dto/cognos/Column.html    |   226 +
 .../ibm/juno/core/dto/cognos/DataSet.Row.html   |   260 +
 .../com/ibm/juno/core/dto/cognos/DataSet.html   |   260 +
 .../ibm/juno/core/dto/jsonschema/JsonType.html  |   175 +
 .../juno/core/dto/jsonschema/JsonTypeArray.html |   122 +
 .../Schema.BooleanOrSchemaArrayFilter.html      |  1464 ++
 .../Schema.BooleanOrSchemaFilter.html           |  1464 ++
 .../Schema.JsonTypeOrJsonTypeArrayFilter.html   |  1464 ++
 .../Schema.SchemaOrSchemaArrayFilter.html       |  1464 ++
 .../ibm/juno/core/dto/jsonschema/Schema.html    |  1464 ++
 .../juno/core/dto/jsonschema/SchemaArray.html   |   122 +
 .../ibm/juno/core/dto/jsonschema/SchemaMap.html |   191 +
 .../core/dto/jsonschema/SchemaProperty.html     |   116 +
 .../jsonschema/SchemaPropertySimpleArray.html   |   113 +
 .../ibm/juno/core/dto/jsonschema/SchemaRef.html |   106 +
 .../com/ibm/juno/core/encoders/Encoder.html     |   125 +
 .../ibm/juno/core/encoders/EncoderGroup.html    |   267 +
 .../com/ibm/juno/core/encoders/GzipEncoder.html |   116 +
 .../ibm/juno/core/encoders/IdentityEncoder.html |   115 +
 .../juno/core/filter/AnnotationBeanFilter.html  |   135 +
 .../com/ibm/juno/core/filter/BeanFilter.html    |   544 +
 .../ibm/juno/core/filter/Filter.FilterType.html |   206 +
 .../com/ibm/juno/core/filter/Filter.NULL.html   |   206 +
 .../com/ibm/juno/core/filter/Filter.html        |   206 +
 .../juno/core/filter/InterfaceBeanFilter.html   |   107 +
 .../ibm/juno/core/filter/PojoFilter.NULL.html   |   333 +
 .../com/ibm/juno/core/filter/PojoFilter.html    |   333 +
 .../ibm/juno/core/filter/SurrogateFilter.html   |   275 +
 .../ibm/juno/core/filters/BeanStringFilter.html |   107 +
 .../core/filters/ByteArrayBase64Filter.html     |   119 +
 .../core/filters/CalendarFilter.ISO8601DT.html  |   361 +
 .../core/filters/CalendarFilter.ISO8601DTZ.html |   361 +
 .../core/filters/CalendarFilter.Medium.html     |   361 +
 .../core/filters/CalendarFilter.RFC2822D.html   |   361 +
 .../core/filters/CalendarFilter.RFC2822DT.html  |   361 +
 .../core/filters/CalendarFilter.RFC2822DTZ.html |   361 +
 .../core/filters/CalendarFilter.Simple.html     |   361 +
 .../core/filters/CalendarFilter.ToString.html   |   361 +
 .../ibm/juno/core/filters/CalendarFilter.html   |   361 +
 .../juno/core/filters/CalendarLongFilter.html   |   124 +
 .../juno/core/filters/CalendarMapFilter.html    |   132 +
 .../com/ibm/juno/core/filters/ClassFilter.html  |   113 +
 .../juno/core/filters/DateFilter.ISO8601DT.html |   417 +
 .../core/filters/DateFilter.ISO8601DTP.html     |   417 +
 .../core/filters/DateFilter.ISO8601DTPNZ.html   |   417 +
 .../core/filters/DateFilter.ISO8601DTZ.html     |   417 +
 .../core/filters/DateFilter.ISO8601DTZP.html    |   417 +
 .../juno/core/filters/DateFilter.Medium.html    |   417 +
 .../juno/core/filters/DateFilter.RFC2822D.html  |   417 +
 .../juno/core/filters/DateFilter.RFC2822DT.html |   417 +
 .../core/filters/DateFilter.RFC2822DTZ.html     |   417 +
 .../juno/core/filters/DateFilter.Simple.html    |   417 +
 .../juno/core/filters/DateFilter.SimpleP.html   |   417 +
 .../juno/core/filters/DateFilter.ToString.html  |   417 +
 .../com/ibm/juno/core/filters/DateFilter.html   |   417 +
 .../ibm/juno/core/filters/DateLongFilter.html   |   120 +
 .../ibm/juno/core/filters/DateMapFilter.html    |   124 +
 .../juno/core/filters/EnumerationFilter.html    |   107 +
 .../ibm/juno/core/filters/IteratorFilter.html   |   107 +
 .../juno/core/filters/ReaderFilter.Html.html    |   180 +
 .../juno/core/filters/ReaderFilter.Json.html    |   180 +
 .../core/filters/ReaderFilter.PlainText.html    |   180 +
 .../ibm/juno/core/filters/ReaderFilter.Xml.html |   180 +
 .../com/ibm/juno/core/filters/ReaderFilter.html |   180 +
 .../filters/XMLGregorianCalendarFilter.html     |   132 +
 .../juno/core/html/HtmlBeanPropertyMeta.html    |   158 +
 .../com/ibm/juno/core/html/HtmlClassMeta.html   |   160 +
 .../ibm/juno/core/html/HtmlDocSerializer.html   |   234 +
 .../core/html/HtmlDocSerializerProperties.html  |   237 +
 .../com/ibm/juno/core/html/HtmlLink.html        |   117 +
 .../com/ibm/juno/core/html/HtmlParser.html      |   815 ++
 .../ibm/juno/core/html/HtmlParserContext.html   |   152 +
 .../juno/core/html/HtmlParserProperties.html    |   124 +
 .../juno/core/html/HtmlSchemaDocSerializer.html |   216 +
 .../ibm/juno/core/html/HtmlSerializer.Sq.html   |   740 +
 .../core/html/HtmlSerializer.SqReadable.html    |   740 +
 .../com/ibm/juno/core/html/HtmlSerializer.html  |   740 +
 .../juno/core/html/HtmlSerializerContext.html   |   188 +
 .../core/html/HtmlSerializerProperties.html     |   185 +
 .../juno/core/html/HtmlSerializerWriter.html    |   401 +
 .../core/html/HtmlStrippedDocSerializer.html    |   127 +
 .../ibm/juno/core/html/SimpleHtmlWriter.html    |   108 +
 .../com/ibm/juno/core/html/annotation/Html.html |   126 +
 .../com/ibm/juno/core/html/dto/HtmlElement.html |    95 +
 .../com/ibm/juno/core/html/dto/Img.html         |   107 +
 .../com/ibm/juno/core/ini/ConfigFile.html       |   861 ++
 .../com/ibm/juno/core/ini/ConfigFileFormat.html |    97 +
 .../com/ibm/juno/core/ini/ConfigFileImpl.html   |   812 ++
 .../ibm/juno/core/ini/ConfigFileListener.html   |   114 +
 .../ibm/juno/core/ini/ConfigFileWrapped.html    |   345 +
 .../com/ibm/juno/core/ini/ConfigMgr.html        |   384 +
 .../com/ibm/juno/core/ini/ConfigUtils.html      |   162 +
 .../src-html/com/ibm/juno/core/ini/Encoder.html |   107 +
 .../com/ibm/juno/core/ini/EntryListener.html    |   116 +
 .../src-html/com/ibm/juno/core/ini/Section.html |   636 +
 .../com/ibm/juno/core/ini/SectionListener.html  |   131 +
 .../com/ibm/juno/core/ini/XorEncoder.html       |   118 +
 .../com/ibm/juno/core/jena/Constants.html       |   163 +
 .../ibm/juno/core/jena/RdfBeanPropertyMeta.html |   150 +
 .../com/ibm/juno/core/jena/RdfClassMeta.html    |   154 +
 .../ibm/juno/core/jena/RdfCollectionFormat.html |   124 +
 .../com/ibm/juno/core/jena/RdfParser.N3.html    |   590 +
 .../ibm/juno/core/jena/RdfParser.NTriple.html   |   590 +
 .../ibm/juno/core/jena/RdfParser.Turtle.html    |   590 +
 .../com/ibm/juno/core/jena/RdfParser.Xml.html   |   590 +
 .../com/ibm/juno/core/jena/RdfParser.html       |   590 +
 .../ibm/juno/core/jena/RdfParserContext.html    |   245 +
 .../ibm/juno/core/jena/RdfParserProperties.html |   140 +
 .../com/ibm/juno/core/jena/RdfProperties.html   |   487 +
 .../ibm/juno/core/jena/RdfSerializer.N3.html    |   537 +
 .../juno/core/jena/RdfSerializer.NTriple.html   |   537 +
 .../juno/core/jena/RdfSerializer.Turtle.html    |   537 +
 .../ibm/juno/core/jena/RdfSerializer.Xml.html   |   537 +
 .../juno/core/jena/RdfSerializer.XmlAbbrev.html |   537 +
 .../com/ibm/juno/core/jena/RdfSerializer.html   |   537 +
 .../juno/core/jena/RdfSerializerContext.html    |   251 +
 .../juno/core/jena/RdfSerializerProperties.html |   152 +
 .../com/ibm/juno/core/jena/RdfUtils.html        |   159 +
 .../com/ibm/juno/core/jena/annotation/Rdf.html  |   130 +
 .../ibm/juno/core/jena/annotation/RdfNs.html    |   109 +
 .../juno/core/jena/annotation/RdfSchema.html    |   166 +
 .../core/jso/JavaSerializedObjectParser.html    |   127 +
 .../jso/JavaSerializedObjectSerializer.html     |   124 +
 .../com/ibm/juno/core/json/JsonClassMeta.html   |   127 +
 .../com/ibm/juno/core/json/JsonParser.html      |   924 ++
 .../ibm/juno/core/json/JsonParserContext.html   |   138 +
 .../juno/core/json/JsonParserProperties.html    |   157 +
 .../juno/core/json/JsonSchemaSerializer.html    |   226 +
 .../juno/core/json/JsonSerializer.Readable.html |   529 +
 .../juno/core/json/JsonSerializer.Simple.html   |   529 +
 .../json/JsonSerializer.SimpleReadable.html     |   529 +
 .../json/JsonSerializer.SimpleReadableSafe.html |   529 +
 .../com/ibm/juno/core/json/JsonSerializer.html  |   529 +
 .../juno/core/json/JsonSerializerContext.html   |   152 +
 .../core/json/JsonSerializerProperties.html     |   163 +
 .../juno/core/json/JsonSerializerWriter.html    |   337 +
 .../com/ibm/juno/core/json/annotation/Json.html |   144 +
 .../ibm/juno/core/parser/InputStreamParser.html |   124 +
 .../ibm/juno/core/parser/ParseException.html    |   160 +
 .../com/ibm/juno/core/parser/Parser.html        |   648 +
 .../com/ibm/juno/core/parser/ParserContext.html |   249 +
 .../com/ibm/juno/core/parser/ParserGroup.html   |   389 +
 .../ibm/juno/core/parser/ParserListener.html    |   112 +
 .../ibm/juno/core/parser/ParserProperties.html  |   141 +
 .../com/ibm/juno/core/parser/ParserReader.html  |   451 +
 .../com/ibm/juno/core/parser/ReaderParser.html  |   466 +
 .../juno/core/plaintext/PlainTextParser.html    |   140 +
 .../core/plaintext/PlainTextSerializer.html     |   138 +
 .../core/serializer/OutputStreamSerializer.html |   123 +
 .../core/serializer/SerializeException.html     |   125 +
 .../ibm/juno/core/serializer/Serializer.html    |   356 +
 .../juno/core/serializer/SerializerContext.html |   655 +
 .../juno/core/serializer/SerializerGroup.html   |   417 +
 .../core/serializer/SerializerProperties.html   |   387 +
 .../juno/core/serializer/SerializerWriter.html  |   385 +
 .../ibm/juno/core/serializer/StringObject.html  |   153 +
 .../juno/core/serializer/WriterSerializer.html  |   240 +
 .../ibm/juno/core/soap/SoapXmlSerializer.html   |   150 +
 .../core/soap/SoapXmlSerializerProperties.html  |    96 +
 .../core/urlencoding/UonParser.Decoding.html    |   937 ++
 .../ibm/juno/core/urlencoding/UonParser.html    |   937 ++
 .../juno/core/urlencoding/UonParserContext.html |   183 +
 .../core/urlencoding/UonParserProperties.html   |   148 +
 .../juno/core/urlencoding/UonParserReader.html  |   267 +
 .../urlencoding/UonSerializer.Encoding.html     |   604 +
 .../urlencoding/UonSerializer.Readable.html     |   604 +
 .../core/urlencoding/UonSerializer.Simple.html  |   604 +
 .../UonSerializer.SimpleEncoding.html           |   604 +
 .../juno/core/urlencoding/UonSerializer.html    |   604 +
 .../core/urlencoding/UonSerializerContext.html  |   182 +
 .../urlencoding/UonSerializerProperties.html    |   207 +
 .../core/urlencoding/UonSerializerWriter.html   |   340 +
 .../core/urlencoding/UrlEncodingClassMeta.html  |   127 +
 .../core/urlencoding/UrlEncodingParser.html     |   625 +
 .../core/urlencoding/UrlEncodingProperties.html |   154 +
 .../UrlEncodingSerializer.Readable.html         |   562 +
 .../UrlEncodingSerializer.Simple.html           |   562 +
 .../UrlEncodingSerializer.SimpleExpanded.html   |   562 +
 .../core/urlencoding/UrlEncodingSerializer.html |   562 +
 .../urlencoding/annotation/UrlEncoding.html     |   109 +
 .../src-html/com/ibm/juno/core/utils/Args.html  |   329 +
 .../com/ibm/juno/core/utils/ArrayUtils.html     |   345 +
 .../com/ibm/juno/core/utils/AsciiSet.html       |   127 +
 .../com/ibm/juno/core/utils/ByteArrayCache.html |   174 +
 .../juno/core/utils/ByteArrayInOutStream.html   |   100 +
 .../ibm/juno/core/utils/CharSequenceReader.html |   168 +
 .../core/utils/ClassUtils.ClassComparator.html  |   283 +
 .../com/ibm/juno/core/utils/ClassUtils.html     |   283 +
 .../ibm/juno/core/utils/CollectionUtils.html    |   125 +
 .../ibm/juno/core/utils/DelegateBeanMap.html    |   183 +
 .../com/ibm/juno/core/utils/DelegateList.html   |   107 +
 .../com/ibm/juno/core/utils/DelegateMap.html    |   122 +
 .../com/ibm/juno/core/utils/FileUtils.html      |   202 +
 .../com/ibm/juno/core/utils/FilteredMap.html    |   164 +
 .../juno/core/utils/IOPipe.LineProcessor.html   |   280 +
 .../com/ibm/juno/core/utils/IOPipe.html         |   280 +
 .../com/ibm/juno/core/utils/IOUtils.html        |   424 +
 .../com/ibm/juno/core/utils/IdentityList.html   |   117 +
 .../com/ibm/juno/core/utils/KeywordSet.html     |   158 +
 .../com/ibm/juno/core/utils/ManifestFile.html   |   169 +
 .../com/ibm/juno/core/utils/MessageBundle.html  |   377 +
 .../com/ibm/juno/core/utils/MultiIterable.html  |   146 +
 .../com/ibm/juno/core/utils/MultiSet.html       |   179 +
 .../ibm/juno/core/utils/PojoIntrospector.html   |   185 +
 .../com/ibm/juno/core/utils/PojoQuery.html      |  1318 ++
 .../com/ibm/juno/core/utils/PojoRest.html       |   915 ++
 .../ibm/juno/core/utils/PojoRestException.html  |   128 +
 .../juno/core/utils/ProcBuilder.Matcher.html    |   454 +
 .../com/ibm/juno/core/utils/ProcBuilder.html    |   454 +
 .../ibm/juno/core/utils/ReflectionUtils.html    |   231 +
 .../ibm/juno/core/utils/SafeResourceBundle.html |   204 +
 .../core/utils/SafeResourceMultiBundle.html     |   154 +
 .../com/ibm/juno/core/utils/SimpleMap.html      |   184 +
 .../juno/core/utils/StringBuilderWriter.html    |   167 +
 .../com/ibm/juno/core/utils/StringMapVar.html   |   113 +
 .../com/ibm/juno/core/utils/StringUtils.html    |   991 ++
 .../com/ibm/juno/core/utils/StringVar.html      |   109 +
 .../ibm/juno/core/utils/StringVarMultipart.html |   104 +
 .../ibm/juno/core/utils/StringVarResolver.html  |   433 +
 .../juno/core/utils/StringVarWithDefault.html   |   103 +
 .../com/ibm/juno/core/utils/StringVars.html     |   106 +
 .../ibm/juno/core/utils/TeeOutputStream.html    |   231 +
 .../com/ibm/juno/core/utils/TeeWriter.html      |   233 +
 .../com/ibm/juno/core/utils/ThrowableUtils.html |   152 +
 .../src-html/com/ibm/juno/core/utils/Utils.html |   106 +
 .../juno/core/utils/ZipFileList.FileEntry.html  |   208 +
 .../core/utils/ZipFileList.ZipFileEntry.html    |   208 +
 .../com/ibm/juno/core/utils/ZipFileList.html    |   208 +
 .../com/ibm/juno/core/utils/log/JunoLogger.html |   365 +
 .../com/ibm/juno/core/xml/Namespace.html        |   153 +
 .../com/ibm/juno/core/xml/NamespaceFactory.html |   198 +
 .../com/ibm/juno/core/xml/XmlBeanMeta.html      |   197 +
 .../ibm/juno/core/xml/XmlBeanPropertyMeta.html  |   231 +
 .../com/ibm/juno/core/xml/XmlClassMeta.html     |   186 +
 .../juno/core/xml/XmlContentHandler.NULL.html   |   207 +
 .../ibm/juno/core/xml/XmlContentHandler.html    |   207 +
 .../juno/core/xml/XmlDocSerializer.Simple.html  |   134 +
 .../com/ibm/juno/core/xml/XmlDocSerializer.html |   134 +
 .../com/ibm/juno/core/xml/XmlParser.html        |   613 +
 .../com/ibm/juno/core/xml/XmlParserContext.html |   239 +
 .../ibm/juno/core/xml/XmlParserProperties.html  |   316 +
 .../juno/core/xml/XmlSchemaDocSerializer.html   |   122 +
 .../ibm/juno/core/xml/XmlSchemaSerializer.html  |   660 +
 .../ibm/juno/core/xml/XmlSerializer.Simple.html |   799 +
 .../juno/core/xml/XmlSerializer.SimpleSq.html   |   799 +
 .../core/xml/XmlSerializer.SimpleXmlJsonSq.html |   799 +
 .../com/ibm/juno/core/xml/XmlSerializer.Sq.html |   799 +
 .../juno/core/xml/XmlSerializer.SqReadable.html |   799 +
 .../juno/core/xml/XmlSerializer.XmlJson.html    |   799 +
 .../juno/core/xml/XmlSerializer.XmlJsonSq.html  |   799 +
 .../com/ibm/juno/core/xml/XmlSerializer.html    |   799 +
 .../ibm/juno/core/xml/XmlSerializerContext.html |   278 +
 .../juno/core/xml/XmlSerializerProperties.html  |   243 +
 .../ibm/juno/core/xml/XmlSerializerWriter.html  |   735 +
 .../com/ibm/juno/core/xml/XmlUtils.html         |   643 +
 .../com/ibm/juno/core/xml/annotation/Xml.html   |   269 +
 .../ibm/juno/core/xml/annotation/XmlFormat.html |   125 +
 .../com/ibm/juno/core/xml/annotation/XmlNs.html |   109 +
 .../ibm/juno/core/xml/annotation/XmlSchema.html |   166 +
 .../com/ibm/juno/microservice/Microservice.html |   593 +
 .../com/ibm/juno/microservice/Resource.html     |   139 +
 .../ibm/juno/microservice/ResourceGroup.html    |   138 +
 .../com/ibm/juno/microservice/ResourceJena.html |   100 +
 .../ibm/juno/microservice/RestMicroservice.html |   626 +
 .../microservice/resources/ConfigResource.html  |   256 +
 .../DirectoryResource.FileResource.html         |   426 +
 .../resources/DirectoryResource.html            |   426 +
 .../resources/LogEntryFormatter.html            |   329 +
 .../microservice/resources/LogParser.Entry.html |   297 +
 .../juno/microservice/resources/LogParser.html  |   297 +
 .../resources/LogsResource.FileResource.html    |   371 +
 .../microservice/resources/LogsResource.html    |   371 +
 .../resources/SampleRootResource.html           |    99 +
 .../resources/ShutdownResource.html             |   121 +
 .../com/ibm/juno/server/ReaderResource.html     |   168 +
 .../src-html/com/ibm/juno/server/Redirect.html  |   205 +
 .../com/ibm/juno/server/ResponseHandler.html    |   159 +
 .../com/ibm/juno/server/RestConverter.html      |   142 +
 .../com/ibm/juno/server/RestException.html      |   205 +
 .../src-html/com/ibm/juno/server/RestGuard.html |   167 +
 .../com/ibm/juno/server/RestMatcher.html        |   133 +
 .../com/ibm/juno/server/RestRequest.html        |  1815 +++
 .../com/ibm/juno/server/RestResponse.html       |   499 +
 .../com/ibm/juno/server/RestServlet.html        |  3111 ++++
 .../com/ibm/juno/server/RestServletDefault.html |   300 +
 .../ibm/juno/server/RestServletException.html   |   116 +
 .../juno/server/RestServletGroupDefault.html    |   111 +
 .../com/ibm/juno/server/RestServletNls.html     |   174 +
 .../ibm/juno/server/RestServletProperties.html  |   216 +
 .../src-html/com/ibm/juno/server/RestUtils.html |   318 +
 .../com/ibm/juno/server/StreamResource.html     |   159 +
 .../com/ibm/juno/server/UrlPathPattern.html     |   229 +
 .../com/ibm/juno/server/annotation/Attr.html    |   142 +
 .../com/ibm/juno/server/annotation/Content.html |   126 +
 .../ibm/juno/server/annotation/HasParam.html    |   163 +
 .../ibm/juno/server/annotation/HasQParam.html   |   129 +
 .../com/ibm/juno/server/annotation/Header.html  |   122 +
 .../com/ibm/juno/server/annotation/Inherit.html |   102 +
 .../ibm/juno/server/annotation/Messages.html    |   120 +
 .../com/ibm/juno/server/annotation/Method.html  |   119 +
 .../com/ibm/juno/server/annotation/Param.html   |   148 +
 .../juno/server/annotation/PathRemainder.html   |   116 +
 .../ibm/juno/server/annotation/Properties.html  |   134 +
 .../ibm/juno/server/annotation/Property.html    |   133 +
 .../com/ibm/juno/server/annotation/QParam.html  |   144 +
 .../ibm/juno/server/annotation/Response.html    |   139 +
 .../ibm/juno/server/annotation/RestMethod.html  |   451 +
 .../juno/server/annotation/RestResource.html    |   505 +
 .../com/ibm/juno/server/annotation/Var.html     |   138 +
 .../ibm/juno/server/annotation/VarCategory.html |   104 +
 .../juno/server/converters/Introspectable.html  |   127 +
 .../ibm/juno/server/converters/Queryable.html   |   169 +
 .../ibm/juno/server/converters/Traversable.html |   135 +
 .../com/ibm/juno/server/jaxrs/BaseProvider.html |   216 +
 .../ibm/juno/server/jaxrs/DefaultProvider.html  |   141 +
 .../com/ibm/juno/server/jaxrs/JunoProvider.html |   157 +
 .../server/jaxrs/rdf/DefaultJenaProvider.html   |   161 +
 .../server/jena/RestServletJenaDefault.html     |   340 +
 .../jena/RestServletJenaGroupDefault.html       |   111 +
 ...BeanDescription.BeanPropertyDescription.html |   141 +
 .../ibm/juno/server/labels/BeanDescription.html |   141 +
 .../labels/ChildResourceDescriptions.html       |   131 +
 .../ibm/juno/server/labels/DefaultLabels.html   |   146 +
 .../labels/MethodDescription.Response.html      |   396 +
 .../juno/server/labels/MethodDescription.html   |   396 +
 .../ibm/juno/server/labels/NameDescription.html |   142 +
 .../juno/server/labels/ParamDescription.html    |   171 +
 .../juno/server/labels/ResourceDescription.html |   176 +
 .../ibm/juno/server/labels/ResourceLink.html    |   136 +
 .../ibm/juno/server/labels/ResourceOptions.html |   350 +
 .../com/ibm/juno/server/labels/Var.html         |   155 +
 .../matchers/MultipartFormDataMatcher.html      |    96 +
 .../server/matchers/UrlEncodedFormMatcher.html  |    96 +
 .../remoteable/RemoteableServiceProperties.html |   107 +
 .../server/remoteable/RemoteableServlet.html    |   222 +
 .../juno/server/response/DefaultHandler.html    |   157 +
 .../server/response/InputStreamHandler.html     |   112 +
 .../ibm/juno/server/response/ReaderHandler.html |   110 +
 .../juno/server/response/RedirectHandler.html   |   118 +
 .../juno/server/response/StreamableHandler.html |   121 +
 .../juno/server/response/WritableHandler.html   |   121 +
 .../response/ZipFileListResponseHandler.html    |   130 +
 com.ibm.team.juno.releng/build/juno-all-5.2.jar |   Bin 0 -> 951955 bytes
 .../build/juno-javadocs.war                     |   Bin 0 -> 9723290 bytes
 .../build/juno-samples-5.2.jar                  |   Bin 0 -> 98214 bytes
 .../build/juno-samples-5.2.war                  |   Bin 0 -> 9394505 bytes
 .../build/juno-samples-fat-5.2.jar              |   Bin 0 -> 11368566 bytes
 .../build/logs/sample.0.log                     |     0
 .../build/logs/sample.0.log.1                   |     1 +
 .../build/logs/sample.0.log.lck                 |     0
 .../build/microservice-project-5.2.zip          |   Bin 0 -> 3989612 bytes
 .../build/microservice-project/.classpath       |    16 +
 .../build/microservice-project/.project         |    17 +
 .../microservice-project/META-INF/MANIFEST.MF   |    18 +
 .../build/microservice-project/build.properties |    15 +
 .../build/microservice-project/build.xml        |    50 +
 .../lib/commons-codec-1.9.jar                   |   Bin 0 -> 263965 bytes
 .../microservice-project/lib/commons-io-1.2.jar |   Bin 0 -> 65621 bytes
 .../lib/commons-logging-1.1.1.jar               |   Bin 0 -> 60686 bytes
 .../microservice-project/lib/httpclient-4.5.jar |   Bin 0 -> 727567 bytes
 .../microservice-project/lib/httpcore-4.4.1.jar |   Bin 0 -> 322234 bytes
 .../microservice-project/lib/httpmime-4.5.jar   |   Bin 0 -> 40692 bytes
 .../lib/javax.servlet-api-3.0.jar               |   Bin 0 -> 85353 bytes
 .../lib/jetty-all-8.1.0.jar                     |   Bin 0 -> 1774672 bytes
 .../microservice-project/lib/juno-all-5.2.jar   |   Bin 0 -> 951955 bytes
 .../lib/org.apache.commons.fileupload_1.3.1.jar |   Bin 0 -> 69002 bytes
 .../microservice-project.launch                 |    11 +
 .../build/microservice-project/microservice.cfg |   190 +
 .../microservice/sample/HelloWorldResource.java |    29 +
 .../juno/microservice/sample/RootResources.java |    35 +
 .../microservice/sample/nls/Messages.properties |    14 +
 .../build/microservice-samples-project-5.2.zip  |   Bin 0 -> 8826214 bytes
 .../microservice-samples-project/.classpath     |    22 +
 .../build/microservice-samples-project/.project |    17 +
 .../META-INF/MANIFEST.MF                        |    21 +
 .../build.properties                            |    15 +
 .../microservice-samples-project/build.xml      |    50 +
 .../lib/commons-codec-1.9.jar                   |   Bin 0 -> 263965 bytes
 .../lib/commons-io-1.2.jar                      |   Bin 0 -> 65621 bytes
 .../lib/commons-logging-1.1.1.jar               |   Bin 0 -> 60686 bytes
 .../microservice-samples-project/lib/derby.jar  |   Bin 0 -> 2838580 bytes
 .../lib/httpclient-4.5.jar                      |   Bin 0 -> 727567 bytes
 .../lib/httpcore-4.4.1.jar                      |   Bin 0 -> 322234 bytes
 .../lib/httpmime-4.5.jar                        |   Bin 0 -> 40692 bytes
 .../lib/javax.servlet-api-3.0.jar               |   Bin 0 -> 85353 bytes
 .../lib/jena-core-2.7.1.jar                     |   Bin 0 -> 1727026 bytes
 .../lib/jena-iri-0.9.2.jar                      |   Bin 0 -> 136437 bytes
 .../lib/jetty-all-8.1.0.jar                     |   Bin 0 -> 1774672 bytes
 .../lib/juno-all-5.2.jar                        |   Bin 0 -> 951955 bytes
 .../lib/log4j-1.2.16.jar                        |   Bin 0 -> 481535 bytes
 .../lib/org.apache.commons.fileupload_1.3.1.jar |   Bin 0 -> 69002 bytes
 .../lib/slf4j-api-1.6.4.jar                     |   Bin 0 -> 25962 bytes
 .../lib/slf4j-log4j12-1.6.4.jar                 |   Bin 0 -> 9748 bytes
 .../microservice-samples-project.launch         |    11 +
 .../microservice-samples-project/samples.cfg    |   130 +
 .../ibm/juno/samples/addressbook/Address.java   |    49 +
 .../juno/samples/addressbook/AddressBook.java   |    98 +
 .../juno/samples/addressbook/CreateAddress.java |    37 +
 .../juno/samples/addressbook/CreatePerson.java  |    40 +
 .../juno/samples/addressbook/IAddressBook.java  |    41 +
 .../ibm/juno/samples/addressbook/Person.java    |    68 +
 .../juno/samples/addressbook/package-info.java  |    31 +
 .../ibm/juno/samples/addressbook/package.html   |    27 +
 .../com/ibm/juno/server/samples/AdminGuard.java |    22 +
 .../juno/server/samples/AtomFeedResource.java   |   103 +
 .../server/samples/CodeFormatterResource.html   |    48 +
 .../server/samples/CodeFormatterResource.java   |    46 +
 .../com/ibm/juno/server/samples/Constants.java  |    25 +
 .../juno/server/samples/DirectoryResource.java  |   231 +
 .../server/samples/DockerRegistryResource.java  |    68 +
 .../juno/server/samples/HelloWorldResource.java |    34 +
 .../juno/server/samples/JsonSchemaResource.java |    70 +
 .../server/samples/MethodExampleResource.java   |    87 +
 .../ibm/juno/server/samples/PhotosResource.java |   140 +
 .../server/samples/RequestEchoResource.java     |    55 +
 .../ibm/juno/server/samples/RootResources.java  |    50 +
 .../server/samples/SampleRemoteableServlet.java |    53 +
 .../ibm/juno/server/samples/SourceResource.java |   110 +
 .../juno/server/samples/SqlQueryResource.html   |    51 +
 .../juno/server/samples/SqlQueryResource.java   |   124 +
 .../juno/server/samples/TempDirResource.java    |    74 +
 .../juno/server/samples/TempDirUploadPage.html  |    27 +
 .../server/samples/TumblrParserResource.java    |    77 +
 .../ibm/juno/server/samples/UrlEncodedForm.html |    55 +
 .../server/samples/UrlEncodedFormResource.java  |    49 +
 .../addressbook/AddressBookResource.java        |   329 +
 .../server/samples/addressbook/ClientTest.java  |    99 +
 .../nls/AddressBookResource.properties          |    71 +
 .../ibm/juno/server/samples/averycutedog.jpg    |   Bin 0 -> 40879 bytes
 .../server/samples/htdocs/code-highlighting.css |   124 +
 .../samples/nls/AtomFeedResource.properties     |    16 +
 .../nls/CodeFormatterResource.properties        |    13 +
 .../samples/nls/HelloWorldResource.properties   |    14 +
 .../samples/nls/JsonSchemaResource.properties   |    15 +
 .../nls/MethodExampleResource.properties        |    32 +
 .../samples/nls/PhotosResource.properties       |    19 +
 .../samples/nls/RequestEchoResource.properties  |    14 +
 .../server/samples/nls/RootResources.properties |    13 +
 .../nls/SampleRemoteableServlet.properties      |    12 +
 .../samples/nls/SourceResource.properties       |    14 +
 .../samples/nls/SqlQueryResource.properties     |    14 +
 .../samples/nls/TempDirResource.properties      |    13 +
 .../samples/nls/TumblrParserResource.properties |    14 +
 .../nls/UrlEncodedFormResource.properties       |    17 +
 com.ibm.team.juno.releng/build/samples.cfg      |   130 +
 .../source/com.ibm.team.juno.client_5.2.0.0.jar |   Bin 0 -> 110656 bytes
 .../com.ibm.team.juno.microservice_5.2.0.0.jar  |   Bin 0 -> 312404 bytes
 .../source/com.ibm.team.juno.server_5.2.0.0.jar |   Bin 0 -> 1036509 bytes
 .../build/source/com.ibm.team.juno_5.2.0.0.jar  |   Bin 0 -> 5328404 bytes
 .../build/source/juno-all-5.2.jar               |   Bin 0 -> 6785027 bytes
 .../build/source/juno-samples-5.2_src.jar       |   Bin 0 -> 132231 bytes
 .../build/test/jacoco/jacoco.exec               |   Bin 0 -> 72411 bytes
 .../build/test/jacoco/jacoco2.exec              |   Bin 0 -> 19071 bytes
 .../build/test/jacoco/jacoco3.exec              |   Bin 0 -> 22381 bytes
 .../test/jacoco/results/.resources/branchfc.gif |   Bin 0 -> 91 bytes
 .../test/jacoco/results/.resources/branchnc.gif |   Bin 0 -> 91 bytes
 .../test/jacoco/results/.resources/branchpc.gif |   Bin 0 -> 91 bytes
 .../test/jacoco/results/.resources/bundle.gif   |   Bin 0 -> 709 bytes
 .../test/jacoco/results/.resources/class.gif    |   Bin 0 -> 586 bytes
 .../test/jacoco/results/.resources/down.gif     |   Bin 0 -> 67 bytes
 .../test/jacoco/results/.resources/greenbar.gif |   Bin 0 -> 91 bytes
 .../test/jacoco/results/.resources/group.gif    |   Bin 0 -> 351 bytes
 .../test/jacoco/results/.resources/method.gif   |   Bin 0 -> 193 bytes
 .../test/jacoco/results/.resources/package.gif  |   Bin 0 -> 227 bytes
 .../test/jacoco/results/.resources/prettify.css |    13 +
 .../test/jacoco/results/.resources/prettify.js  |  1510 ++
 .../test/jacoco/results/.resources/redbar.gif   |   Bin 0 -> 91 bytes
 .../test/jacoco/results/.resources/report.css   |   243 +
 .../test/jacoco/results/.resources/report.gif   |   Bin 0 -> 363 bytes
 .../test/jacoco/results/.resources/session.gif  |   Bin 0 -> 213 bytes
 .../test/jacoco/results/.resources/sort.gif     |   Bin 0 -> 58 bytes
 .../test/jacoco/results/.resources/sort.js      |   147 +
 .../test/jacoco/results/.resources/source.gif   |   Bin 0 -> 354 bytes
 .../build/test/jacoco/results/.resources/up.gif |   Bin 0 -> 67 bytes
 .../build/test/jacoco/results/.sessions.html    |     1 +
 .../build/test/jacoco/results/Client/index.html |     1 +
 .../build/test/jacoco/results/Core/index.html   |     1 +
 .../build/test/jacoco/results/Server/index.html |     1 +
 .../build/test/jacoco/results/index.html        |     1 +
 .../build/test/jacoco/results/report.csv        |     1 +
 .../build/test/jacoco/results/report.xml        |     1 +
 .../TEST-com.ibm.juno.core.test.AllTests.xml    |  3000 ++++
 .../TEST-com.ibm.juno.server.tests.AllTests.xml |   296 +
 .../build/test/juno-core-test-5.2.jar           |   Bin 0 -> 702694 bytes
 .../build/test/juno-server-test-5.2.jar         |   Bin 0 -> 11460809 bytes
 .../build/test/juno-server-test.cfg             |    97 +
 .../build/test/logs/test.0.log                  |     0
 .../build/test/logs/test.0.log.1                |     1 +
 .../build/test/logs/test.0.log.lck              |     0
 com.ibm.team.juno.releng/javadoc.css            |  1143 ++
 .../juno-code-templates.xml                     |    55 +
 .../lib/commons-codec-1.9/commons-codec-1.9.jar |   Bin 0 -> 263965 bytes
 .../org.apache.commons.fileupload_1.3.1.jar     |   Bin 0 -> 69002 bytes
 com.ibm.team.juno.releng/lib/derby/derby.jar    |   Bin 0 -> 2838580 bytes
 ....eclipse.osgi.services_3.2.100.v20100503.jar |   Bin 0 -> 67437 bytes
 ....eclipse.osgi_3.6.50.R36x_v20120315-1500.jar |   Bin 0 -> 1174868 bytes
 .../lib/httpclient/commons-logging-1.1.1.jar    |   Bin 0 -> 60686 bytes
 .../lib/httpclient/httpclient-4.5.jar           |   Bin 0 -> 727567 bytes
 .../httpcomponents-client-4.5-src.zip           |   Bin 0 -> 1632538 bytes
 .../lib/httpclient/httpcore-4.4.1.jar           |   Bin 0 -> 322234 bytes
 .../lib/httpclient/httpmime-4.5.jar             |   Bin 0 -> 40692 bytes
 .../lib/jacoco/jacocoagent.jar                  |   Bin 0 -> 288333 bytes
 .../lib/jacoco/jacocoant.jar                    |   Bin 0 -> 696286 bytes
 .../org.jacoco.agent-0.7.5.201505241946.jar     |   Bin 0 -> 256737 bytes
 .../org.jacoco.ant-0.7.5.201505241946.jar       |   Bin 0 -> 37663 bytes
 .../org.jacoco.core-0.7.5.201505241946.jar      |   Bin 0 -> 133486 bytes
 .../org.jacoco.report-0.7.5.201505241946.jar    |   Bin 0 -> 140212 bytes
 .../lib/java2html/java2html.jar                 |   Bin 0 -> 192282 bytes
 .../lib/javax.servlet_2.5.0.jar                 |   Bin 0 -> 118873 bytes
 .../lib/jaxrs/jsr311-api-1.1.1.jar              |   Bin 0 -> 46367 bytes
 .../lib/jaxrs/wink-common-1.2.1-incubating.jar  |   Bin 0 -> 588805 bytes
 .../lib/jaxrs/wink-server-1.2.1-incubating.jar  |   Bin 0 -> 272483 bytes
 .../lib/jena/jena-core-2.7.1-sources.jar        |   Bin 0 -> 1701584 bytes
 .../lib/jena/jena-core-2.7.1.jar                |   Bin 0 -> 1727026 bytes
 .../lib/jena/jena-iri-0.9.2.jar                 |   Bin 0 -> 136437 bytes
 .../lib/jena/log4j-1.2.16.jar                   |   Bin 0 -> 481535 bytes
 .../lib/jena/slf4j-api-1.6.4.jar                |   Bin 0 -> 25962 bytes
 .../lib/jena/slf4j-log4j12-1.6.4.jar            |   Bin 0 -> 9748 bytes
 .../lib/junit/hamcrest-core-1.3.jar             |   Bin 0 -> 45024 bytes
 .../lib/junit/junit-4.12.jar                    |   Bin 0 -> 314932 bytes
 com.ibm.team.juno.releng/misc/web.xml           |    13 +
 .../old_source/juno-src-5.0.0.09.zip            |   Bin 0 -> 804229 bytes
 .../old_source/juno-src-5.0.0.10.zip            |   Bin 0 -> 810103 bytes
 .../old_source/juno-src-5.0.0.11.zip            |   Bin 0 -> 814731 bytes
 .../old_source/juno-src-5.0.0.12.zip            |   Bin 0 -> 817880 bytes
 .../old_source/juno-src-5.0.0.13.zip            |   Bin 0 -> 820063 bytes
 .../old_source/juno-src-5.0.0.14.zip            |   Bin 0 -> 836407 bytes
 .../old_source/juno-src-5.0.0.15.zip            |   Bin 0 -> 852057 bytes
 .../old_source/juno-src-5.0.0.16.zip            |   Bin 0 -> 853498 bytes
 .../old_source/juno-src-5.0.0.17.zip            |   Bin 0 -> 851934 bytes
 .../old_source/juno-src-5.0.0.18.zip            |   Bin 0 -> 881739 bytes
 .../old_source/juno-src-5.0.0.19.zip            |   Bin 0 -> 909299 bytes
 .../old_source/juno-src-5.0.0.20.zip            |   Bin 0 -> 926858 bytes
 .../old_source/juno-src-5.0.0.21.zip            |   Bin 0 -> 928025 bytes
 .../old_source/juno-src-5.0.0.22.zip            |   Bin 0 -> 933600 bytes
 .../old_source/juno-src-5.0.0.23.zip            |   Bin 0 -> 930812 bytes
 .../old_source/juno-src-5.0.0.24.zip            |   Bin 0 -> 983721 bytes
 .../old_source/juno-src-5.0.0.25.zip            |   Bin 0 -> 992366 bytes
 .../old_source/juno-src-5.0.0.26.zip            |   Bin 0 -> 995456 bytes
 .../old_source/juno-src-5.0.0.27.zip            |   Bin 0 -> 1000561 bytes
 .../old_source/juno-src-5.0.0.28.zip            |   Bin 0 -> 1001312 bytes
 .../old_source/juno-src-5.0.0.29.zip            |   Bin 0 -> 1039557 bytes
 .../old_source/juno-src-5.0.0.30.zip            |   Bin 0 -> 1040672 bytes
 .../old_source/juno-src-5.0.0.31.zip            |   Bin 0 -> 1033628 bytes
 .../old_source/juno-src-5.0.0.32.zip            |   Bin 0 -> 1059551 bytes
 .../old_source/juno-src-5.0.0.33.zip            |   Bin 0 -> 1066794 bytes
 .../old_source/juno-src-5.0.0.34.zip            |   Bin 0 -> 1085317 bytes
 .../old_source/juno-src-5.0.0.35.zip            |   Bin 0 -> 1085904 bytes
 .../old_source/juno-src-5.0.0.36.zip            |   Bin 0 -> 1091696 bytes
 .../old_source/juno-src-5.1.0.0.zip             |   Bin 0 -> 1136233 bytes
 .../old_source/juno-src-5.1.0.1.zip             |   Bin 0 -> 1139789 bytes
 .../old_source/juno-src-5.1.0.10.zip            |   Bin 0 -> 942855 bytes
 .../old_source/juno-src-5.1.0.11.zip            |   Bin 0 -> 2361666 bytes
 .../old_source/juno-src-5.1.0.12.zip            |   Bin 0 -> 2364030 bytes
 .../old_source/juno-src-5.1.0.2.zip             |   Bin 0 -> 1141935 bytes
 .../old_source/juno-src-5.1.0.3.zip             |   Bin 0 -> 1162075 bytes
 .../old_source/juno-src-5.1.0.6.zip             |   Bin 0 -> 1196915 bytes
 .../old_source/juno-src-5.1.0.7.zip             |   Bin 0 -> 1211726 bytes
 .../old_source/juno-src-5.1.0.8.zip             |   Bin 0 -> 1215884 bytes
 .../old_source/juno-src-5.1.0.9.zip             |   Bin 0 -> 920834 bytes
 .../old_source/juno-src-client-5.1.0.10.zip     |   Bin 0 -> 52714 bytes
 .../old_source/juno-src-client-5.1.0.11.zip     |   Bin 0 -> 63070 bytes
 .../old_source/juno-src-client-5.1.0.12.zip     |   Bin 0 -> 64233 bytes
 .../old_source/juno-src-client-5.1.0.9.zip      |   Bin 0 -> 51761 bytes
 .../old_source/juno-src-server-5.1.0.10.zip     |   Bin 0 -> 1200138 bytes
 .../old_source/juno-src-server-5.1.0.11.zip     |   Bin 0 -> 3684902 bytes
 .../old_source/juno-src-server-5.1.0.9.zip      |   Bin 0 -> 1173952 bytes
 com.ibm.team.juno.samples/.classpath            |    10 +
 com.ibm.team.juno.samples/.jazzignore           |    33 +
 com.ibm.team.juno.samples/.project              |    17 +
 .../.settings/org.eclipse.jdt.core.prefs        |   393 +
 .../.settings/org.eclipse.jdt.ui.prefs          |     9 +
 com.ibm.team.juno.samples/META-INF/MANIFEST.MF  |    21 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 .../ibm/juno/samples/addressbook/Address.class  |   Bin 0 -> 1818 bytes
 .../juno/samples/addressbook/AddressBook.class  |   Bin 0 -> 3951 bytes
 .../samples/addressbook/CreateAddress.class     |   Bin 0 -> 1001 bytes
 .../juno/samples/addressbook/CreatePerson.class |   Bin 0 -> 1333 bytes
 .../juno/samples/addressbook/IAddressBook.class |   Bin 0 -> 716 bytes
 .../ibm/juno/samples/addressbook/Person.class   |   Bin 0 -> 3194 bytes
 .../juno/samples/addressbook/package-info.class |   Bin 0 -> 689 bytes
 .../ibm/juno/samples/addressbook/package.html   |    27 +
 .../ibm/juno/server/samples/AdminGuard.class    |   Bin 0 -> 492 bytes
 .../juno/server/samples/AtomFeedResource.class  |   Bin 0 -> 5588 bytes
 .../server/samples/CodeFormatterResource.class  |   Bin 0 -> 1840 bytes
 .../server/samples/CodeFormatterResource.html   |    48 +
 .../com/ibm/juno/server/samples/Constants.class |   Bin 0 -> 695 bytes
 .../DirectoryResource$FileResource.class        |   Bin 0 -> 2293 bytes
 .../juno/server/samples/DirectoryResource.class |   Bin 0 -> 7713 bytes
 .../DockerRegistryResource$DockerImage.class    |   Bin 0 -> 530 bytes
 .../DockerRegistryResource$QueryResults.class   |   Bin 0 -> 770 bytes
 .../server/samples/DockerRegistryResource.class |   Bin 0 -> 3443 bytes
 .../server/samples/HelloWorldResource.class     |   Bin 0 -> 936 bytes
 .../server/samples/JsonSchemaResource.class     |   Bin 0 -> 3048 bytes
 .../server/samples/MethodExampleResource.class  |   Bin 0 -> 4012 bytes
 .../samples/PhotosResource$ImageParser.class    |   Bin 0 -> 1434 bytes
 .../PhotosResource$ImageSerializer.class        |   Bin 0 -> 1629 bytes
 .../server/samples/PhotosResource$Photo.class   |   Bin 0 -> 932 bytes
 .../juno/server/samples/PhotosResource.class    |   Bin 0 -> 4371 bytes
 .../server/samples/RequestEchoResource.class    |   Bin 0 -> 1866 bytes
 .../ibm/juno/server/samples/RootResources.class |   Bin 0 -> 1812 bytes
 .../samples/SampleRemoteableServlet.class       |   Bin 0 -> 1921 bytes
 .../server/samples/SourceResource$Source.class  |   Bin 0 -> 2366 bytes
 .../juno/server/samples/SourceResource.class    |   Bin 0 -> 3870 bytes
 .../samples/SqlQueryResource$PostInput.class    |   Bin 0 -> 550 bytes
 .../juno/server/samples/SqlQueryResource.class  |   Bin 0 -> 5699 bytes
 .../juno/server/samples/SqlQueryResource.html   |    51 +
 ...mpDirResource$MultipartFormDataMatcher.class |   Bin 0 -> 937 bytes
 .../juno/server/samples/TempDirResource.class   |   Bin 0 -> 3429 bytes
 .../juno/server/samples/TempDirUploadPage.html  |    27 +
 .../samples/TumblrParserResource$Entry.class    |   Bin 0 -> 519 bytes
 .../server/samples/TumblrParserResource.class   |   Bin 0 -> 4503 bytes
 .../ibm/juno/server/samples/UrlEncodedForm.html |    55 +
 .../UrlEncodedFormResource$FormInputBean.class  |   Bin 0 -> 733 bytes
 .../server/samples/UrlEncodedFormResource.class |   Bin 0 -> 1592 bytes
 .../addressbook/AddressBookResource$1.class     |   Bin 0 -> 1452 bytes
 .../AddressBookResource$Options.class           |   Bin 0 -> 1519 bytes
 .../addressbook/AddressBookResource.class       |   Bin 0 -> 10078 bytes
 .../server/samples/addressbook/ClientTest.class |   Bin 0 -> 5299 bytes
 .../nls/AddressBookResource.properties          |    71 +
 .../ibm/juno/server/samples/averycutedog.jpg    |   Bin 0 -> 40879 bytes
 .../server/samples/htdocs/code-highlighting.css |   124 +
 .../samples/nls/AtomFeedResource.properties     |    16 +
 .../nls/CodeFormatterResource.properties        |    13 +
 .../samples/nls/HelloWorldResource.properties   |    14 +
 .../samples/nls/JsonSchemaResource.properties   |    15 +
 .../nls/MethodExampleResource.properties        |    32 +
 .../samples/nls/PhotosResource.properties       |    19 +
 .../samples/nls/RequestEchoResource.properties  |    14 +
 .../server/samples/nls/RootResources.properties |    13 +
 .../nls/SampleRemoteableServlet.properties      |    12 +
 .../samples/nls/SourceResource.properties       |    14 +
 .../samples/nls/SqlQueryResource.properties     |    14 +
 .../samples/nls/TempDirResource.properties      |    13 +
 .../samples/nls/TumblrParserResource.properties |    14 +
 .../nls/UrlEncodedFormResource.properties       |    17 +
 com.ibm.team.juno.samples/build.properties      |    14 +
 com.ibm.team.juno.samples/juno-samples.launch   |    10 +
 com.ibm.team.juno.samples/lib/.jazzignore       |    30 +
 com.ibm.team.juno.samples/lib/derby.jar         |   Bin 0 -> 2838580 bytes
 .../lib/jena-core-2.7.1.jar                     |   Bin 0 -> 1727026 bytes
 .../lib/jena-iri-0.9.2.jar                      |   Bin 0 -> 136437 bytes
 com.ibm.team.juno.samples/lib/log4j-1.2.16.jar  |   Bin 0 -> 481535 bytes
 .../lib/slf4j-api-1.6.4.jar                     |   Bin 0 -> 25962 bytes
 .../lib/slf4j-log4j12-1.6.4.jar                 |   Bin 0 -> 9748 bytes
 .../project-root/.classpath                     |    22 +
 com.ibm.team.juno.samples/project-root/.project |    17 +
 .../project-root/build.properties               |    15 +
 .../project-root/build.xml                      |    50 +
 .../microservice-samples-project.launch         |    11 +
 com.ibm.team.juno.samples/samples.cfg           |   130 +
 .../ibm/juno/samples/addressbook/Address.java   |    49 +
 .../juno/samples/addressbook/AddressBook.java   |    98 +
 .../juno/samples/addressbook/CreateAddress.java |    37 +
 .../juno/samples/addressbook/CreatePerson.java  |    40 +
 .../juno/samples/addressbook/IAddressBook.java  |    41 +
 .../ibm/juno/samples/addressbook/Person.java    |    68 +
 .../juno/samples/addressbook/package-info.java  |    31 +
 .../ibm/juno/samples/addressbook/package.html   |    27 +
 .../com/ibm/juno/server/samples/AdminGuard.java |    22 +
 .../juno/server/samples/AtomFeedResource.java   |   103 +
 .../server/samples/CodeFormatterResource.html   |    48 +
 .../server/samples/CodeFormatterResource.java   |    46 +
 .../com/ibm/juno/server/samples/Constants.java  |    25 +
 .../juno/server/samples/DirectoryResource.java  |   231 +
 .../server/samples/DockerRegistryResource.java  |    84 +
 .../juno/server/samples/HelloWorldResource.java |    34 +
 .../juno/server/samples/JsonSchemaResource.java |    70 +
 .../server/samples/MethodExampleResource.java   |    87 +
 .../ibm/juno/server/samples/PhotosResource.java |   140 +
 .../server/samples/RequestEchoResource.java     |    55 +
 .../ibm/juno/server/samples/RootResources.java  |    50 +
 .../server/samples/SampleRemoteableServlet.java |    53 +
 .../ibm/juno/server/samples/SourceResource.java |   110 +
 .../juno/server/samples/SqlQueryResource.html   |    51 +
 .../juno/server/samples/SqlQueryResource.java   |   124 +
 .../juno/server/samples/TempDirResource.java    |    74 +
 .../juno/server/samples/TempDirUploadPage.html  |    27 +
 .../server/samples/TumblrParserResource.java    |    81 +
 .../ibm/juno/server/samples/UrlEncodedForm.html |    55 +
 .../server/samples/UrlEncodedFormResource.java  |    49 +
 .../addressbook/AddressBookResource.java        |   329 +
 .../server/samples/addressbook/ClientTest.java  |   103 +
 .../nls/AddressBookResource.properties          |    71 +
 .../ibm/juno/server/samples/averycutedog.jpg    |   Bin 0 -> 40879 bytes
 .../server/samples/htdocs/code-highlighting.css |   124 +
 .../samples/nls/AtomFeedResource.properties     |    16 +
 .../nls/CodeFormatterResource.properties        |    13 +
 .../samples/nls/HelloWorldResource.properties   |    14 +
 .../samples/nls/JsonSchemaResource.properties   |    15 +
 .../nls/MethodExampleResource.properties        |    32 +
 .../samples/nls/PhotosResource.properties       |    19 +
 .../samples/nls/RequestEchoResource.properties  |    14 +
 .../server/samples/nls/RootResources.properties |    13 +
 .../nls/SampleRemoteableServlet.properties      |    12 +
 .../samples/nls/SourceResource.properties       |    14 +
 .../samples/nls/SqlQueryResource.properties     |    14 +
 .../samples/nls/TempDirResource.properties      |    13 +
 .../samples/nls/TumblrParserResource.properties |    14 +
 .../nls/UrlEncodedFormResource.properties       |    17 +
 com.ibm.team.juno.samples/war/web.xml           |    42 +
 com.ibm.team.juno.server.test/.classpath        |     9 +
 com.ibm.team.juno.server.test/.jazzignore       |    32 +
 com.ibm.team.juno.server.test/.project          |    24 +
 .../.settings/org.eclipse.core.resources.prefs  |     2 +
 .../.settings/org.eclipse.jdt.apt.core.prefs    |     2 +
 .../.settings/org.eclipse.jdt.core.prefs        |   393 +
 .../.settings/org.eclipse.jdt.ui.prefs          |   120 +
 .../org.eclipse.ltk.core.refactoring.prefs      |     3 +
 .../.settings/org.eclipse.pde.core.prefs        |     3 +
 .../.settings/org.eclipse.pde.prefs             |    15 +
 .../META-INF/MANIFEST.MF                        |    10 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 .../bin/com/ibm/juno/server/test/DTOs$A.class   |   Bin 0 -> 613 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$1.class |   Bin 0 -> 629 bytes
 .../com/ibm/juno/server/test/DTOs$B$10.class    |   Bin 0 -> 850 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$2.class |   Bin 0 -> 688 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$3.class |   Bin 0 -> 690 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$4.class |   Bin 0 -> 729 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$5.class |   Bin 0 -> 848 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$6.class |   Bin 0 -> 629 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$7.class |   Bin 0 -> 688 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$8.class |   Bin 0 -> 690 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B$9.class |   Bin 0 -> 729 bytes
 .../bin/com/ibm/juno/server/test/DTOs$B.class   |   Bin 0 -> 5213 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$1.class |   Bin 0 -> 629 bytes
 .../com/ibm/juno/server/test/DTOs$C$10.class    |   Bin 0 -> 850 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$2.class |   Bin 0 -> 688 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$3.class |   Bin 0 -> 690 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$4.class |   Bin 0 -> 729 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$5.class |   Bin 0 -> 848 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$6.class |   Bin 0 -> 629 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$7.class |   Bin 0 -> 688 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$8.class |   Bin 0 -> 690 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C$9.class |   Bin 0 -> 729 bytes
 .../bin/com/ibm/juno/server/test/DTOs$C.class   |   Bin 0 -> 2519 bytes
 .../bin/com/ibm/juno/server/test/DTOs.class     |   Bin 0 -> 457 bytes
 .../bin/com/ibm/juno/server/test/Root.class     |   Bin 0 -> 2839 bytes
 .../test/TestAcceptCharset$TestParser.class     |   Bin 0 -> 1489 bytes
 .../test/TestAcceptCharset$TestSerializer.class |   Bin 0 -> 1624 bytes
 .../juno/server/test/TestAcceptCharset.class    |   Bin 0 -> 1565 bytes
 .../server/test/TestBeanContextProperties.class |   Bin 0 -> 1846 bytes
 .../juno/server/test/TestCallbackStrings.class  |   Bin 0 -> 2513 bytes
 .../test/TestCharsetEncodings$ASerializer.class |   Bin 0 -> 1130 bytes
 .../test/TestCharsetEncodings$CtParser.class    |   Bin 0 -> 1335 bytes
 .../juno/server/test/TestCharsetEncodings.class |   Bin 0 -> 1736 bytes
 .../com/ibm/juno/server/test/TestConfig.class   |   Bin 0 -> 1893 bytes
 .../com/ibm/juno/server/test/TestContent.class  |   Bin 0 -> 2798 bytes
 .../TestDefaultContentTypes$DummyParser.class   |   Bin 0 -> 1397 bytes
 ...estDefaultContentTypes$DummySerializer.class |   Bin 0 -> 1522 bytes
 .../test/TestDefaultContentTypes$P1.class       |   Bin 0 -> 711 bytes
 .../test/TestDefaultContentTypes$P2.class       |   Bin 0 -> 711 bytes
 .../test/TestDefaultContentTypes$P3.class       |   Bin 0 -> 711 bytes
 .../test/TestDefaultContentTypes$S1.class       |   Bin 0 -> 723 bytes
 .../test/TestDefaultContentTypes$S2.class       |   Bin 0 -> 723 bytes
 .../test/TestDefaultContentTypes$S3.class       |   Bin 0 -> 723 bytes
 .../server/test/TestDefaultContentTypes.class   |   Bin 0 -> 3183 bytes
 .../test/TestErrorConditions$NeverMatcher.class |   Bin 0 -> 628 bytes
 .../server/test/TestErrorConditions$Test1.class |   Bin 0 -> 467 bytes
 .../server/test/TestErrorConditions$Test2.class |   Bin 0 -> 450 bytes
 .../test/TestErrorConditions$Test3a.class       |   Bin 0 -> 453 bytes
 .../test/TestErrorConditions$Test3b.class       |   Bin 0 -> 569 bytes
 .../test/TestErrorConditions$Test3b1.class      |   Bin 0 -> 439 bytes
 .../test/TestErrorConditions$Test3c.class       |   Bin 0 -> 712 bytes
 .../juno/server/test/TestErrorConditions.class  |   Bin 0 -> 3771 bytes
 .../ibm/juno/server/test/TestFilters$A.class    |   Bin 0 -> 406 bytes
 .../juno/server/test/TestFilters$FilterA1.class |   Bin 0 -> 2171 bytes
 .../juno/server/test/TestFilters$FilterA2.class |   Bin 0 -> 2171 bytes
 .../juno/server/test/TestFilters$FilterA3.class |   Bin 0 -> 2171 bytes
 .../com/ibm/juno/server/test/TestFilters.class  |   Bin 0 -> 2162 bytes
 .../juno/server/test/TestFiltersParent.class    |   Bin 0 -> 568 bytes
 .../juno/server/test/TestGroups$PParser.class   |   Bin 0 -> 1306 bytes
 .../server/test/TestGroups$SSerializer.class    |   Bin 0 -> 1218 bytes
 .../com/ibm/juno/server/test/TestGroups.class   |   Bin 0 -> 1772 bytes
 .../juno/server/test/TestGzip$MyEncoder.class   |   Bin 0 -> 562 bytes
 .../juno/server/test/TestGzip$TestGzipOff.class |   Bin 0 -> 1195 bytes
 .../juno/server/test/TestGzip$TestGzipOn.class  |   Bin 0 -> 2572 bytes
 .../bin/com/ibm/juno/server/test/TestGzip.class |   Bin 0 -> 535 bytes
 .../test/TestInheritance$DummyParser.class      |   Bin 0 -> 1121 bytes
 .../test/TestInheritance$DummySerializer.class  |   Bin 0 -> 1015 bytes
 .../juno/server/test/TestInheritance$E1.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E2.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E3.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$E4.class   |   Bin 0 -> 567 bytes
 .../juno/server/test/TestInheritance$F1.class   |   Bin 0 -> 1017 bytes
 .../juno/server/test/TestInheritance$F2.class   |   Bin 0 -> 1017 bytes
 .../juno/server/test/TestInheritance$F3.class   |   Bin 0 -> 1017 bytes
 .../juno/server/test/TestInheritance$Foo1.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$Foo2.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$Foo3.class |   Bin 0 -> 510 bytes
 .../juno/server/test/TestInheritance$P1.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P2.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P3.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P4.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$P5.class   |   Bin 0 -> 574 bytes
 .../juno/server/test/TestInheritance$S1.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S2.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S3.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S4.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$S5.class   |   Bin 0 -> 582 bytes
 .../juno/server/test/TestInheritance$Sub.class  |   Bin 0 -> 1116 bytes
 .../test/TestInheritance$TestEncoders.class     |   Bin 0 -> 1291 bytes
 .../test/TestInheritance$TestFilters.class      |   Bin 0 -> 1906 bytes
 .../test/TestInheritance$TestParsers.class      |   Bin 0 -> 1626 bytes
 .../test/TestInheritance$TestProperties.class   |   Bin 0 -> 2493 bytes
 .../test/TestInheritance$TestSerializers.class  |   Bin 0 -> 1657 bytes
 .../ibm/juno/server/test/TestInheritance.class  |   Bin 0 -> 2990 bytes
 .../ibm/juno/server/test/TestLargePojos.class   |   Bin 0 -> 1100 bytes
 .../TestMessages$ResourceBundleFilter.class     |   Bin 0 -> 1566 bytes
 .../test/TestMessages$TestMessages2.class       |   Bin 0 -> 540 bytes
 .../com/ibm/juno/server/test/TestMessages.class |   Bin 0 -> 1166 bytes
 .../juno/server/test/TestMessages.properties    |    10 +
 .../juno/server/test/TestMessages2.properties   |    10 +
 .../ibm/juno/server/test/TestNls$Test1.class    |   Bin 0 -> 1835 bytes
 .../ibm/juno/server/test/TestNls$Test2.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test3.class    |   Bin 0 -> 1534 bytes
 .../ibm/juno/server/test/TestNls$Test4.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test5.class    |   Bin 0 -> 1259 bytes
 .../ibm/juno/server/test/TestNls$Test6.class    |   Bin 0 -> 1715 bytes
 .../bin/com/ibm/juno/server/test/TestNls.class  |   Bin 0 -> 1173 bytes
 .../com/ibm/juno/server/test/TestNls.properties |    74 +
 .../test/TestNlsProperty$TestSerializer.class   |   Bin 0 -> 1288 bytes
 .../ibm/juno/server/test/TestNlsProperty.class  |   Bin 0 -> 1231 bytes
 .../juno/server/test/TestNlsProperty.properties |    10 +
 .../juno/server/test/TestNoParserInput.class    |   Bin 0 -> 1501 bytes
 .../test/TestOnPostCall$TestSerializer.class    |   Bin 0 -> 2227 bytes
 .../ibm/juno/server/test/TestOnPostCall.class   |   Bin 0 -> 2774 bytes
 .../server/test/TestOnPreCall$TestParserA.class |   Bin 0 -> 2076 bytes
 .../ibm/juno/server/test/TestOnPreCall.class    |   Bin 0 -> 2608 bytes
 .../server/test/TestOptionsWithoutNls.class     |   Bin 0 -> 1432 bytes
 .../TestOverlappingMethods$Test1Guard.class     |   Bin 0 -> 860 bytes
 .../TestOverlappingMethods$Test2Guard.class     |   Bin 0 -> 860 bytes
 .../TestOverlappingMethods$Test3aMatcher.class  |   Bin 0 -> 862 bytes
 .../TestOverlappingMethods$Test3bMatcher.class  |   Bin 0 -> 862 bytes
 .../server/test/TestOverlappingMethods.class    |   Bin 0 -> 3582 bytes
 .../com/ibm/juno/server/test/TestParams$A.class |   Bin 0 -> 450 bytes
 .../juno/server/test/TestParams$Test6Bean.class |   Bin 0 -> 460 bytes
 .../com/ibm/juno/server/test/TestParams.class   |   Bin 0 -> 12204 bytes
 .../server/test/TestParsers$TestParserA.class   |   Bin 0 -> 1554 bytes
 .../server/test/TestParsers$TestParserB.class   |   Bin 0 -> 1553 bytes
 .../server/test/TestParsers$TestParserC.class   |   Bin 0 -> 1553 bytes
 .../server/test/TestParsers$TestParserD.class   |   Bin 0 -> 1565 bytes
 .../com/ibm/juno/server/test/TestParsers.class  |   Bin 0 -> 2249 bytes
 .../juno/server/test/TestPath$TestPath2.class   |   Bin 0 -> 864 bytes
 .../juno/server/test/TestPath$TestPath3.class   |   Bin 0 -> 514 bytes
 .../juno/server/test/TestPath$TestPath3a.class  |   Bin 0 -> 800 bytes
 .../bin/com/ibm/juno/server/test/TestPath.class |   Bin 0 -> 993 bytes
 .../com/ibm/juno/server/test/TestPaths$A.class  |   Bin 0 -> 1479 bytes
 .../com/ibm/juno/server/test/TestPaths.class    |   Bin 0 -> 2541 bytes
 .../TestProperties$PropertySerializer1.class    |   Bin 0 -> 1794 bytes
 .../TestProperties$PropertySerializer2.class    |   Bin 0 -> 1551 bytes
 .../ibm/juno/server/test/TestProperties.class   |   Bin 0 -> 2066 bytes
 .../ibm/juno/server/test/TestRestClient.class   |   Bin 0 -> 986 bytes
 .../test/TestSerializers$TestSerializerA.class  |   Bin 0 -> 1233 bytes
 .../test/TestSerializers$TestSerializerB.class  |   Bin 0 -> 1233 bytes
 .../test/TestSerializers$TestSerializerC.class  |   Bin 0 -> 1233 bytes
 .../test/TestSerializers$TestSerializerD.class  |   Bin 0 -> 1264 bytes
 .../ibm/juno/server/test/TestSerializers.class  |   Bin 0 -> 2098 bytes
 .../ibm/juno/server/test/TestStaticFiles.class  |   Bin 0 -> 734 bytes
 .../ibm/juno/server/test/TestUris$Child.class   |   Bin 0 -> 1618 bytes
 .../juno/server/test/TestUris$GrandChild.class  |   Bin 0 -> 1590 bytes
 .../bin/com/ibm/juno/server/test/TestUris.class |   Bin 0 -> 2707 bytes
 .../server/test/TestUrlContent$TestBean.class   |   Bin 0 -> 473 bytes
 .../server/test/TestUrlContent$TestEnum.class   |   Bin 0 -> 1170 bytes
 .../ibm/juno/server/test/TestUrlContent.class   |   Bin 0 -> 2467 bytes
 .../bin/com/ibm/juno/server/test/xdocs/test.txt |     1 +
 .../ibm/juno/server/test/xdocs/xdocs/test.txt   |     1 +
 .../com/ibm/juno/server/tests/AllTests.class    |   Bin 0 -> 2573 bytes
 .../ibm/juno/server/tests/CT_JacocoDummy.class  |   Bin 0 -> 1190 bytes
 .../ibm/juno/server/tests/CT_RestUtils.class    |   Bin 0 -> 4445 bytes
 .../server/tests/CT_TestAcceptCharset.class     |   Bin 0 -> 5049 bytes
 .../tests/CT_TestBeanContextProperties.class    |   Bin 0 -> 1519 bytes
 .../server/tests/CT_TestCallbackStrings.class   |   Bin 0 -> 1890 bytes
 .../server/tests/CT_TestCharsetEncodings.class  |   Bin 0 -> 3749 bytes
 .../ibm/juno/server/tests/CT_TestConfig.class   |   Bin 0 -> 3699 bytes
 .../ibm/juno/server/tests/CT_TestContent.class  |   Bin 0 -> 15633 bytes
 .../tests/CT_TestDefaultContentTypes.class      |   Bin 0 -> 9126 bytes
 .../server/tests/CT_TestErrorConditions.class   |   Bin 0 -> 7733 bytes
 .../ibm/juno/server/tests/CT_TestFilters.class  |   Bin 0 -> 2373 bytes
 .../ibm/juno/server/tests/CT_TestGroups.class   |   Bin 0 -> 3848 bytes
 .../com/ibm/juno/server/tests/CT_TestGzip.class |   Bin 0 -> 8267 bytes
 .../juno/server/tests/CT_TestInheritance.class  |   Bin 0 -> 3598 bytes
 .../juno/server/tests/CT_TestLargePojos.class   |   Bin 0 -> 3128 bytes
 .../ibm/juno/server/tests/CT_TestMessages.class |   Bin 0 -> 1348 bytes
 .../com/ibm/juno/server/tests/CT_TestNls.class  |   Bin 0 -> 7252 bytes
 .../juno/server/tests/CT_TestNlsProperty.class  |   Bin 0 -> 1802 bytes
 .../server/tests/CT_TestNoParserInput.class     |   Bin 0 -> 2609 bytes
 .../juno/server/tests/CT_TestOnPostCall.class   |   Bin 0 -> 3821 bytes
 .../juno/server/tests/CT_TestOnPreCall.class    |   Bin 0 -> 2392 bytes
 .../server/tests/CT_TestOptionsWithoutNls.class |   Bin 0 -> 2195 bytes
 .../tests/CT_TestOverlappingMethods.class       |   Bin 0 -> 4261 bytes
 .../ibm/juno/server/tests/CT_TestParams.class   |   Bin 0 -> 13364 bytes
 .../ibm/juno/server/tests/CT_TestParsers.class  |   Bin 0 -> 4402 bytes
 .../com/ibm/juno/server/tests/CT_TestPath.class |   Bin 0 -> 1841 bytes
 .../ibm/juno/server/tests/CT_TestPaths.class    |   Bin 0 -> 16487 bytes
 .../juno/server/tests/CT_TestProperties.class   |   Bin 0 -> 2259 bytes
 .../juno/server/tests/CT_TestRestClient$1.class |   Bin 0 -> 1676 bytes
 .../juno/server/tests/CT_TestRestClient$2.class |   Bin 0 -> 1551 bytes
 .../juno/server/tests/CT_TestRestClient$3.class |   Bin 0 -> 1551 bytes
 .../juno/server/tests/CT_TestRestClient.class   |   Bin 0 -> 5196 bytes
 .../juno/server/tests/CT_TestSerializers.class  |   Bin 0 -> 4462 bytes
 .../juno/server/tests/CT_TestStaticFiles.class  |   Bin 0 -> 2209 bytes
 .../com/ibm/juno/server/tests/CT_TestUris.class |   Bin 0 -> 22498 bytes
 .../juno/server/tests/CT_TestUrlContent.class   |   Bin 0 -> 2596 bytes
 .../juno/server/tests/CT_UrlPathPattern.class   |   Bin 0 -> 1561 bytes
 .../com/ibm/juno/server/tests/Constants.class   |   Bin 0 -> 1619 bytes
 .../bin/com/ibm/juno/server/tests/DTOs$A.class  |   Bin 0 -> 617 bytes
 .../com/ibm/juno/server/tests/DTOs$B$1.class    |   Bin 0 -> 634 bytes
 .../com/ibm/juno/server/tests/DTOs$B$10.class   |   Bin 0 -> 858 bytes
 .../com/ibm/juno/server/tests/DTOs$B$2.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/server/tests/DTOs$B$3.class    |   Bin 0 -> 695 bytes
 .../com/ibm/juno/server/tests/DTOs$B$4.class    |   Bin 0 -> 737 bytes
 .../com/ibm/juno/server/tests/DTOs$B$5.class    |   Bin 0 -> 856 bytes
 .../com/ibm/juno/server/tests/DTOs$B$6.class    |   Bin 0 -> 634 bytes
 .../com/ibm/juno/server/tests/DTOs$B$7.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/server/tests/DTOs$B$8.class    |   Bin 0 -> 695 bytes
 .../com/ibm/juno/server/tests/DTOs$B$9.class    |   Bin 0 -> 737 bytes
 .../bin/com/ibm/juno/server/tests/DTOs$B.class  |   Bin 0 -> 5241 bytes
 .../com/ibm/juno/server/tests/DTOs$C$1.class    |   Bin 0 -> 634 bytes
 .../com/ibm/juno/server/tests/DTOs$C$10.class   |   Bin 0 -> 858 bytes
 .../com/ibm/juno/server/tests/DTOs$C$2.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/server/tests/DTOs$C$3.class    |   Bin 0 -> 695 bytes
 .../com/ibm/juno/server/tests/DTOs$C$4.class    |   Bin 0 -> 737 bytes
 .../com/ibm/juno/server/tests/DTOs$C$5.class    |   Bin 0 -> 856 bytes
 .../com/ibm/juno/server/tests/DTOs$C$6.class    |   Bin 0 -> 634 bytes
 .../com/ibm/juno/server/tests/DTOs$C$7.class    |   Bin 0 -> 693 bytes
 .../com/ibm/juno/server/tests/DTOs$C$8.class    |   Bin 0 -> 695 bytes
 .../com/ibm/juno/server/tests/DTOs$C$9.class    |   Bin 0 -> 737 bytes
 .../bin/com/ibm/juno/server/tests/DTOs$C.class  |   Bin 0 -> 2541 bytes
 .../bin/com/ibm/juno/server/tests/DTOs.class    |   Bin 0 -> 462 bytes
 .../ibm/juno/server/tests/LargePojo$A1.class    |   Bin 0 -> 551 bytes
 .../juno/server/tests/LargePojo$A1List.class    |   Bin 0 -> 547 bytes
 .../ibm/juno/server/tests/LargePojo$A1Map.class |   Bin 0 -> 568 bytes
 .../com/ibm/juno/server/tests/LargePojo.class   |   Bin 0 -> 1289 bytes
 .../ibm/juno/server/tests/TestRestClient.class  |   Bin 0 -> 3770 bytes
 .../com/ibm/juno/server/tests/TestUtils.class   |   Bin 0 -> 2794 bytes
 .../CT_AddressBookResource$PersonList.class     |   Bin 0 -> 576 bytes
 .../tests/sample/CT_AddressBookResource.class   |   Bin 0 -> 9002 bytes
 .../sample/CT_AddressBookResource_test0.json    |    14 +
 .../server/tests/sample/CT_RootResources.class  |   Bin 0 -> 5694 bytes
 .../CT_SampleRemoteableServicesResource.class   |   Bin 0 -> 3694 bytes
 .../sample/CT_TestMultiPartFormPosts.class      |   Bin 0 -> 2567 bytes
 .../server/tests/sample/SamplesRestClient.class |   Bin 0 -> 3794 bytes
 com.ibm.team.juno.server.test/build.properties  |    16 +
 .../juno-server-test.cfg                        |    97 +
 .../juno-server-test.launch                     |    10 +
 .../server/com/ibm/juno/server/test/DTOs.java   |   132 +
 .../server/com/ibm/juno/server/test/Root.java   |    66 +
 .../ibm/juno/server/test/TestAcceptCharset.java |    72 +
 .../server/test/TestBeanContextProperties.java  |    38 +
 .../juno/server/test/TestCallbackStrings.java   |    49 +
 .../juno/server/test/TestCharsetEncodings.java  |    53 +
 .../com/ibm/juno/server/test/TestConfig.java    |    35 +
 .../com/ibm/juno/server/test/TestContent.java   |    77 +
 .../server/test/TestDefaultContentTypes.java    |   126 +
 .../juno/server/test/TestErrorConditions.java   |   132 +
 .../com/ibm/juno/server/test/TestFilters.java   |   111 +
 .../ibm/juno/server/test/TestFiltersParent.java |    22 +
 .../com/ibm/juno/server/test/TestGroups.java    |    70 +
 .../com/ibm/juno/server/test/TestGzip.java      |   107 +
 .../ibm/juno/server/test/TestInheritance.java   |   313 +
 .../ibm/juno/server/test/TestLargePojos.java    |    38 +
 .../com/ibm/juno/server/test/TestMessages.java  |    58 +
 .../juno/server/test/TestMessages.properties    |    10 +
 .../juno/server/test/TestMessages2.properties   |    10 +
 .../com/ibm/juno/server/test/TestNls.java       |   191 +
 .../com/ibm/juno/server/test/TestNls.properties |    74 +
 .../ibm/juno/server/test/TestNlsProperty.java   |    59 +
 .../juno/server/test/TestNlsProperty.properties |    10 +
 .../ibm/juno/server/test/TestNoParserInput.java |    52 +
 .../ibm/juno/server/test/TestOnPostCall.java    |    92 +
 .../com/ibm/juno/server/test/TestOnPreCall.java |    83 +
 .../juno/server/test/TestOptionsWithoutNls.java |    40 +
 .../server/test/TestOverlappingMethods.java     |   142 +
 .../com/ibm/juno/server/test/TestParams.java    |   257 +
 .../com/ibm/juno/server/test/TestParsers.java   |   110 +
 .../com/ibm/juno/server/test/TestPath.java      |    65 +
 .../com/ibm/juno/server/test/TestPaths.java     |    69 +
 .../ibm/juno/server/test/TestProperties.java    |    88 +
 .../ibm/juno/server/test/TestRestClient.java    |    32 +
 .../ibm/juno/server/test/TestSerializers.java   |   101 +
 .../ibm/juno/server/test/TestStaticFiles.java   |    32 +
 .../com/ibm/juno/server/test/TestUris.java      |   117 +
 .../ibm/juno/server/test/TestUrlContent.java    |    55 +
 .../com/ibm/juno/server/test/xdocs/test.txt     |     1 +
 .../ibm/juno/server/test/xdocs/xdocs/test.txt   |     1 +
 .../com/ibm/juno/server/tests/AllTests.java     |    58 +
 .../ibm/juno/server/tests/CT_JacocoDummy.java   |    35 +
 .../com/ibm/juno/server/tests/CT_RestUtils.java |   184 +
 .../juno/server/tests/CT_TestAcceptCharset.java |   120 +
 .../tests/CT_TestBeanContextProperties.java     |    34 +
 .../server/tests/CT_TestCallbackStrings.java    |    47 +
 .../server/tests/CT_TestCharsetEncodings.java   |    93 +
 .../ibm/juno/server/tests/CT_TestConfig.java    |    56 +
 .../ibm/juno/server/tests/CT_TestContent.java   |   703 +
 .../tests/CT_TestDefaultContentTypes.java       |   494 +
 .../server/tests/CT_TestErrorConditions.java    |   218 +
 .../ibm/juno/server/tests/CT_TestFilters.java   |    65 +
 .../ibm/juno/server/tests/CT_TestGroups.java    |   119 +
 .../com/ibm/juno/server/tests/CT_TestGzip.java  |   341 +
 .../juno/server/tests/CT_TestInheritance.java   |   125 +
 .../juno/server/tests/CT_TestLargePojos.java    |    80 +
 .../ibm/juno/server/tests/CT_TestMessages.java  |    44 +
 .../com/ibm/juno/server/tests/CT_TestNls.java   |   167 +
 .../juno/server/tests/CT_TestNlsProperty.java   |    45 +
 .../juno/server/tests/CT_TestNoParserInput.java |    67 +
 .../juno/server/tests/CT_TestOnPostCall.java    |   118 +
 .../ibm/juno/server/tests/CT_TestOnPreCall.java |    58 +
 .../server/tests/CT_TestOptionsWithoutNls.java  |    48 +
 .../server/tests/CT_TestOverlappingMethods.java |   167 +
 .../ibm/juno/server/tests/CT_TestParams.java    |   648 +
 .../ibm/juno/server/tests/CT_TestParsers.java   |   159 +
 .../com/ibm/juno/server/tests/CT_TestPath.java  |    41 +
 .../com/ibm/juno/server/tests/CT_TestPaths.java |  1365 ++
 .../juno/server/tests/CT_TestProperties.java    |    45 +
 .../juno/server/tests/CT_TestRestClient.java    |   196 +
 .../juno/server/tests/CT_TestSerializers.java   |   149 +
 .../juno/server/tests/CT_TestStaticFiles.java   |    53 +
 .../com/ibm/juno/server/tests/CT_TestUris.java  |   915 ++
 .../juno/server/tests/CT_TestUrlContent.java    |    71 +
 .../juno/server/tests/CT_UrlPathPattern.java    |    37 +
 .../com/ibm/juno/server/tests/Constants.java    |    49 +
 .../tests/com/ibm/juno/server/tests/DTOs.java   |   132 +
 .../com/ibm/juno/server/tests/LargePojo.java    |    41 +
 .../ibm/juno/server/tests/TestRestClient.java   |    66 +
 .../com/ibm/juno/server/tests/TestUtils.java    |    57 +
 .../tests/sample/CT_AddressBookResource.java    |   228 +
 .../sample/CT_AddressBookResource_test0.json    |    14 +
 .../server/tests/sample/CT_RootResources.java   |   142 +
 .../CT_SampleRemoteableServicesResource.java    |    66 +
 .../tests/sample/CT_TestMultiPartFormPosts.java |    43 +
 .../server/tests/sample/SamplesRestClient.java  |    67 +
 com.ibm.team.juno.server/.classpath             |     7 +
 com.ibm.team.juno.server/.project               |    26 +
 .../.settings/com.ibm.etools.references.prefs   |     4 +
 ...ibm.etools.webtools.packagepreferences.prefs |     3 +
 .../.settings/org.eclipse.core.resources.prefs  |     2 +
 .../.settings/org.eclipse.jdt.apt.core.prefs    |     2 +
 .../.settings/org.eclipse.jdt.core.prefs        |   401 +
 .../.settings/org.eclipse.jdt.ui.prefs          |   120 +
 .../org.eclipse.ltk.core.refactoring.prefs      |     3 +
 .../.settings/org.eclipse.pde.core.prefs        |     3 +
 .../.settings/org.eclipse.pde.prefs             |    15 +
 .../.settings/org.eclipse.wst.common.component  |     5 +
 ...rg.eclipse.wst.common.project.facet.core.xml |    15 +
 .../.settings/org.eclipse.wst.html.core.prefs   |    37 +
 .../.settings/org.eclipse.wst.validation.prefs  |     9 +
 com.ibm.team.juno.server/META-INF/MANIFEST.MF   |    27 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 .../com/ibm/juno/server/ReaderResource.class    |   Bin 0 -> 2182 bytes
 .../bin/com/ibm/juno/server/Redirect.class      |   Bin 0 -> 1863 bytes
 .../com/ibm/juno/server/ResponseHandler.class   |   Bin 0 -> 328 bytes
 .../bin/com/ibm/juno/server/RestConverter.class |   Bin 0 -> 491 bytes
 .../bin/com/ibm/juno/server/RestException.class |   Bin 0 -> 2910 bytes
 .../bin/com/ibm/juno/server/RestGuard.class     |   Bin 0 -> 814 bytes
 .../bin/com/ibm/juno/server/RestMatcher.class   |   Bin 0 -> 355 bytes
 .../bin/com/ibm/juno/server/RestRequest$1.class |   Bin 0 -> 1673 bytes
 .../bin/com/ibm/juno/server/RestRequest.class   |   Bin 0 -> 31631 bytes
 .../com/ibm/juno/server/RestResponse$1.class    |   Bin 0 -> 1758 bytes
 .../bin/com/ibm/juno/server/RestResponse.class  |   Bin 0 -> 10142 bytes
 .../bin/com/ibm/juno/server/RestServlet$1.class |   Bin 0 -> 1202 bytes
 .../bin/com/ibm/juno/server/RestServlet$2.class |   Bin 0 -> 887 bytes
 .../bin/com/ibm/juno/server/RestServlet$3.class |   Bin 0 -> 896 bytes
 .../bin/com/ibm/juno/server/RestServlet$4.class |   Bin 0 -> 1289 bytes
 .../bin/com/ibm/juno/server/RestServlet$5.class |   Bin 0 -> 2420 bytes
 .../bin/com/ibm/juno/server/RestServlet$6.class |   Bin 0 -> 1192 bytes
 .../bin/com/ibm/juno/server/RestServlet$7.class |   Bin 0 -> 970 bytes
 .../bin/com/ibm/juno/server/RestServlet$8.class |   Bin 0 -> 845 bytes
 .../bin/com/ibm/juno/server/RestServlet$9.class |   Bin 0 -> 2595 bytes
 .../juno/server/RestServlet$MethodMeta.class    |   Bin 0 -> 19534 bytes
 .../juno/server/RestServlet$MethodParam.class   |   Bin 0 -> 7042 bytes
 .../juno/server/RestServlet$MultiMethod.class   |   Bin 0 -> 4563 bytes
 .../ibm/juno/server/RestServlet$ParamType.class |   Bin 0 -> 2083 bytes
 .../server/RestServlet$ResourceMethod.class     |   Bin 0 -> 958 bytes
 .../bin/com/ibm/juno/server/RestServlet.class   |   Bin 0 -> 57086 bytes
 .../ibm/juno/server/RestServletDefault.class    |   Bin 0 -> 2584 bytes
 .../ibm/juno/server/RestServletException.class  |   Bin 0 -> 1048 bytes
 .../juno/server/RestServletGroupDefault.class   |   Bin 0 -> 1001 bytes
 .../ibm/juno/server/RestServletProperties.class |   Bin 0 -> 1211 bytes
 .../bin/com/ibm/juno/server/RestUtils$1.class   |   Bin 0 -> 1960 bytes
 .../bin/com/ibm/juno/server/RestUtils.class     |   Bin 0 -> 4584 bytes
 .../com/ibm/juno/server/StreamResource.class    |   Bin 0 -> 1910 bytes
 .../com/ibm/juno/server/UrlPathPattern.class    |   Bin 0 -> 3857 bytes
 .../com/ibm/juno/server/annotation/Attr.class   |   Bin 0 -> 537 bytes
 .../ibm/juno/server/annotation/Content.class    |   Bin 0 -> 480 bytes
 .../ibm/juno/server/annotation/HasParam.class   |   Bin 0 -> 513 bytes
 .../ibm/juno/server/annotation/HasQParam.class  |   Bin 0 -> 515 bytes
 .../com/ibm/juno/server/annotation/Header.class |   Bin 0 -> 509 bytes
 .../ibm/juno/server/annotation/Inherit.class    |   Bin 0 -> 1206 bytes
 .../ibm/juno/server/annotation/Messages.class   |   Bin 0 -> 482 bytes
 .../com/ibm/juno/server/annotation/Method.class |   Bin 0 -> 478 bytes
 .../com/ibm/juno/server/annotation/Param.class  |   Bin 0 -> 567 bytes
 .../juno/server/annotation/PathRemainder.class  |   Bin 0 -> 492 bytes
 .../ibm/juno/server/annotation/Properties.class |   Bin 0 -> 486 bytes
 .../ibm/juno/server/annotation/Property.class   |   Bin 0 -> 534 bytes
 .../com/ibm/juno/server/annotation/QParam.class |   Bin 0 -> 569 bytes
 .../ibm/juno/server/annotation/Response.class   |   Bin 0 -> 641 bytes
 .../ibm/juno/server/annotation/RestMethod.class |   Bin 0 -> 1815 bytes
 .../juno/server/annotation/RestResource.class   |   Bin 0 -> 1670 bytes
 .../com/ibm/juno/server/annotation/Var.class    |   Bin 0 -> 592 bytes
 .../juno/server/annotation/VarCategory.class    |   Bin 0 -> 536 bytes
 .../com/ibm/juno/server/annotation/package.html |    34 +
 .../juno/server/converters/Introspectable.class |   Bin 0 -> 1967 bytes
 .../ibm/juno/server/converters/Queryable.class  |   Bin 0 -> 3447 bytes
 .../juno/server/converters/Traversable.class    |   Bin 0 -> 1781 bytes
 .../com/ibm/juno/server/converters/package.html |    34 +
 .../ibm/juno/server/doc-files/AddressBook.png   |   Bin 0 -> 44553 bytes
 .../juno/server/doc-files/AddressBookJson.png   |   Bin 0 -> 30639 bytes
 .../server/doc-files/AddressBookOptions.png     |   Bin 0 -> 224346 bytes
 .../server/doc-files/AddressBook_junostyle.png  |   Bin 0 -> 52768 bytes
 .../server/doc-files/HelloWorldResource1.png    |   Bin 0 -> 14206 bytes
 .../server/doc-files/HelloWorldResource2.png    |   Bin 0 -> 30721 bytes
 .../server/doc-files/HelloWorldResource3.png    |   Bin 0 -> 11040 bytes
 .../server/doc-files/HelloWorldResource4.png    |   Bin 0 -> 16188 bytes
 .../doc-files/HelloWorldResourceOptions.png     |   Bin 0 -> 67692 bytes
 .../doc-files/HelloWorldResourceOptionsJson.png |   Bin 0 -> 27940 bytes
 .../com/ibm/juno/server/doc-files/Options2.png  |   Bin 0 -> 9809 bytes
 .../ibm/juno/server/doc-files/OptionsPage.png   |   Bin 0 -> 56895 bytes
 .../server/doc-files/Samples_RootResources.png  |   Bin 0 -> 62372 bytes
 .../juno/server/doc-files/UrlEncodedForm.png    |   Bin 0 -> 21379 bytes
 .../server/htdocs/MethodExampleResource1.png    |   Bin 0 -> 12276 bytes
 .../bin/com/ibm/juno/server/htdocs/javadoc.css  |   782 +
 .../ibm/juno/server/jaxrs/BaseProvider.class    |   Bin 0 -> 9470 bytes
 .../ibm/juno/server/jaxrs/DefaultProvider.class |   Bin 0 -> 1622 bytes
 .../ibm/juno/server/jaxrs/JunoProvider.class    |   Bin 0 -> 879 bytes
 .../bin/com/ibm/juno/server/jaxrs/package.html  |   354 +
 .../server/jaxrs/rdf/DefaultJenaProvider.class  |   Bin 0 -> 2202 bytes
 .../com/ibm/juno/server/jaxrs/rdf/package.html  |    27 +
 .../server/jena/RestServletJenaDefault.class    |   Bin 0 -> 3042 bytes
 .../jena/RestServletJenaGroupDefault.class      |   Bin 0 -> 1032 bytes
 .../bin/com/ibm/juno/server/jena/package.html   |    40 +
 .../bin/com/ibm/juno/server/juno.ico            |   Bin 0 -> 39438 bytes
 ...eanDescription$BeanPropertyDescription.class |   Bin 0 -> 979 bytes
 .../juno/server/labels/BeanDescription.class    |   Bin 0 -> 2036 bytes
 .../labels/ChildResourceDescriptions.class      |   Bin 0 -> 2158 bytes
 .../ibm/juno/server/labels/DefaultLabels.class  |   Bin 0 -> 3014 bytes
 .../labels/MethodDescription$Response.class     |   Bin 0 -> 1817 bytes
 .../juno/server/labels/MethodDescription.class  |   Bin 0 -> 5274 bytes
 .../juno/server/labels/NameDescription.class    |   Bin 0 -> 1024 bytes
 .../juno/server/labels/ParamDescription.class   |   Bin 0 -> 1308 bytes
 .../server/labels/ResourceDescription.class     |   Bin 0 -> 3456 bytes
 .../ibm/juno/server/labels/ResourceLink.class   |   Bin 0 -> 1923 bytes
 .../juno/server/labels/ResourceOptions.class    |   Bin 0 -> 6276 bytes
 .../bin/com/ibm/juno/server/labels/Var.class    |   Bin 0 -> 1879 bytes
 .../server/labels/nls/DefaultLabels.properties  |    36 +
 .../bin/com/ibm/juno/server/labels/package.html |    34 +
 .../matchers/MultipartFormDataMatcher.class     |   Bin 0 -> 809 bytes
 .../server/matchers/UrlEncodedFormMatcher.class |   Bin 0 -> 810 bytes
 .../com/ibm/juno/server/matchers/package.html   |    27 +
 .../bin/com/ibm/juno/server/package.html        |  3575 +++++
 .../RemoteableServiceProperties.class           |   Bin 0 -> 514 bytes
 .../server/remoteable/RemoteableServlet.class   |   Bin 0 -> 5800 bytes
 .../ibm/juno/server/remoteable/doc-files/1.png  |   Bin 0 -> 15845 bytes
 .../ibm/juno/server/remoteable/doc-files/2.png  |   Bin 0 -> 20379 bytes
 .../ibm/juno/server/remoteable/doc-files/3.png  |   Bin 0 -> 33919 bytes
 .../ibm/juno/server/remoteable/doc-files/4.png  |   Bin 0 -> 21108 bytes
 .../ibm/juno/server/remoteable/doc-files/5.png  |   Bin 0 -> 10553 bytes
 .../ibm/juno/server/remoteable/doc-files/6.png  |   Bin 0 -> 24934 bytes
 .../com/ibm/juno/server/remoteable/package.html |   349 +
 .../juno/server/response/DefaultHandler.class   |   Bin 0 -> 4659 bytes
 .../server/response/InputStreamHandler.class    |   Bin 0 -> 1376 bytes
 .../juno/server/response/ReaderHandler.class    |   Bin 0 -> 1183 bytes
 .../juno/server/response/RedirectHandler.class  |   Bin 0 -> 1989 bytes
 .../server/response/StreamableHandler.class     |   Bin 0 -> 2195 bytes
 .../juno/server/response/WritableHandler.class  |   Bin 0 -> 2157 bytes
 .../response/ZipFileListResponseHandler.class   |   Bin 0 -> 2574 bytes
 .../com/ibm/juno/server/response/package.html   |    34 +
 .../bin/com/ibm/juno/server/styles/devops.css   |   200 +
 .../bin/com/ibm/juno/server/styles/juno.css     |   129 +
 com.ibm.team.juno.server/build.properties       |    19 +
 .../lib/jaxrs/jsr311-api-1.1.1.jar              |   Bin 0 -> 46367 bytes
 .../src/com/ibm/juno/server/ReaderResource.java |    96 +
 .../src/com/ibm/juno/server/Redirect.java       |   133 +
 .../com/ibm/juno/server/ResponseHandler.java    |    87 +
 .../src/com/ibm/juno/server/RestConverter.java  |    70 +
 .../src/com/ibm/juno/server/RestException.java  |   133 +
 .../src/com/ibm/juno/server/RestGuard.java      |    95 +
 .../src/com/ibm/juno/server/RestMatcher.java    |    61 +
 .../src/com/ibm/juno/server/RestRequest.java    |  1743 +++
 .../src/com/ibm/juno/server/RestResponse.java   |   427 +
 .../src/com/ibm/juno/server/RestServlet.java    |  3039 ++++
 .../com/ibm/juno/server/RestServletDefault.java |   228 +
 .../ibm/juno/server/RestServletException.java   |    44 +
 .../juno/server/RestServletGroupDefault.java    |    39 +
 .../ibm/juno/server/RestServletProperties.java  |   144 +
 .../src/com/ibm/juno/server/RestUtils.java      |   246 +
 .../src/com/ibm/juno/server/StreamResource.java |    87 +
 .../src/com/ibm/juno/server/UrlPathPattern.java |   157 +
 .../com/ibm/juno/server/annotation/Attr.java    |    70 +
 .../com/ibm/juno/server/annotation/Content.java |    54 +
 .../ibm/juno/server/annotation/HasParam.java    |    91 +
 .../ibm/juno/server/annotation/HasQParam.java   |    57 +
 .../com/ibm/juno/server/annotation/Header.java  |    50 +
 .../com/ibm/juno/server/annotation/Inherit.java |    30 +
 .../ibm/juno/server/annotation/Messages.java    |    48 +
 .../com/ibm/juno/server/annotation/Method.java  |    47 +
 .../com/ibm/juno/server/annotation/Param.java   |    76 +
 .../juno/server/annotation/PathRemainder.java   |    44 +
 .../ibm/juno/server/annotation/Properties.java  |    62 +
 .../ibm/juno/server/annotation/Property.java    |    61 +
 .../com/ibm/juno/server/annotation/QParam.java  |    72 +
 .../ibm/juno/server/annotation/Response.java    |    67 +
 .../ibm/juno/server/annotation/RestMethod.java  |   379 +
 .../juno/server/annotation/RestResource.java    |   433 +
 .../src/com/ibm/juno/server/annotation/Var.java |    66 +
 .../ibm/juno/server/annotation/VarCategory.java |    32 +
 .../com/ibm/juno/server/annotation/package.html |    34 +
 .../juno/server/converters/Introspectable.java  |    55 +
 .../ibm/juno/server/converters/Queryable.java   |    97 +
 .../ibm/juno/server/converters/Traversable.java |    63 +
 .../com/ibm/juno/server/converters/package.html |    34 +
 .../ibm/juno/server/doc-files/AddressBook.png   |   Bin 0 -> 44553 bytes
 .../juno/server/doc-files/AddressBookJson.png   |   Bin 0 -> 30639 bytes
 .../server/doc-files/AddressBookOptions.png     |   Bin 0 -> 224346 bytes
 .../server/doc-files/AddressBook_junostyle.png  |   Bin 0 -> 52768 bytes
 .../server/doc-files/HelloWorldResource1.png    |   Bin 0 -> 14206 bytes
 .../server/doc-files/HelloWorldResource2.png    |   Bin 0 -> 30721 bytes
 .../server/doc-files/HelloWorldResource3.png    |   Bin 0 -> 11040 bytes
 .../server/doc-files/HelloWorldResource4.png    |   Bin 0 -> 16188 bytes
 .../doc-files/HelloWorldResourceOptions.png     |   Bin 0 -> 67692 bytes
 .../doc-files/HelloWorldResourceOptionsJson.png |   Bin 0 -> 27940 bytes
 .../com/ibm/juno/server/doc-files/Options2.png  |   Bin 0 -> 9809 bytes
 .../ibm/juno/server/doc-files/OptionsPage.png   |   Bin 0 -> 56895 bytes
 .../server/doc-files/Samples_RootResources.png  |   Bin 0 -> 62372 bytes
 .../juno/server/doc-files/UrlEncodedForm.png    |   Bin 0 -> 21379 bytes
 .../server/htdocs/MethodExampleResource1.png    |   Bin 0 -> 12276 bytes
 .../src/com/ibm/juno/server/htdocs/javadoc.css  |   782 +
 .../com/ibm/juno/server/jaxrs/BaseProvider.java |   144 +
 .../ibm/juno/server/jaxrs/DefaultProvider.java  |    69 +
 .../com/ibm/juno/server/jaxrs/JunoProvider.java |    85 +
 .../src/com/ibm/juno/server/jaxrs/package.html  |   354 +
 .../server/jaxrs/rdf/DefaultJenaProvider.java   |    89 +
 .../com/ibm/juno/server/jaxrs/rdf/package.html  |    27 +
 .../server/jena/RestServletJenaDefault.java     |   268 +
 .../jena/RestServletJenaGroupDefault.java       |    39 +
 .../src/com/ibm/juno/server/jena/package.html   |    40 +
 .../src/com/ibm/juno/server/juno.ico            |   Bin 0 -> 39438 bytes
 .../ibm/juno/server/labels/BeanDescription.java |    69 +
 .../labels/ChildResourceDescriptions.java       |    59 +
 .../ibm/juno/server/labels/DefaultLabels.java   |    74 +
 .../juno/server/labels/MethodDescription.java   |   324 +
 .../ibm/juno/server/labels/NameDescription.java |    70 +
 .../juno/server/labels/ParamDescription.java    |    99 +
 .../juno/server/labels/ResourceDescription.java |   104 +
 .../ibm/juno/server/labels/ResourceLink.java    |    64 +
 .../ibm/juno/server/labels/ResourceOptions.java |   278 +
 .../src/com/ibm/juno/server/labels/Var.java     |    83 +
 .../server/labels/nls/DefaultLabels.properties  |    36 +
 .../src/com/ibm/juno/server/labels/package.html |    34 +
 .../matchers/MultipartFormDataMatcher.java      |    24 +
 .../server/matchers/UrlEncodedFormMatcher.java  |    24 +
 .../com/ibm/juno/server/matchers/package.html   |    27 +
 .../src/com/ibm/juno/server/package.html        |  3575 +++++
 .../remoteable/RemoteableServiceProperties.java |    35 +
 .../server/remoteable/RemoteableServlet.java    |   150 +
 .../ibm/juno/server/remoteable/doc-files/1.png  |   Bin 0 -> 15845 bytes
 .../ibm/juno/server/remoteable/doc-files/2.png  |   Bin 0 -> 20379 bytes
 .../ibm/juno/server/remoteable/doc-files/3.png  |   Bin 0 -> 33919 bytes
 .../ibm/juno/server/remoteable/doc-files/4.png  |   Bin 0 -> 21108 bytes
 .../ibm/juno/server/remoteable/doc-files/5.png  |   Bin 0 -> 10553 bytes
 .../ibm/juno/server/remoteable/doc-files/6.png  |   Bin 0 -> 24934 bytes
 .../com/ibm/juno/server/remoteable/package.html |   349 +
 .../juno/server/response/DefaultHandler.java    |    85 +
 .../server/response/InputStreamHandler.java     |    40 +
 .../ibm/juno/server/response/ReaderHandler.java |    38 +
 .../juno/server/response/RedirectHandler.java   |    46 +
 .../juno/server/response/StreamableHandler.java |    49 +
 .../juno/server/response/WritableHandler.java   |    49 +
 .../response/ZipFileListResponseHandler.java    |    58 +
 .../com/ibm/juno/server/response/package.html   |    34 +
 .../src/com/ibm/juno/server/styles/devops.css   |   200 +
 .../src/com/ibm/juno/server/styles/juno.css     |   129 +
 com.ibm.team.juno.test/.classpath               |    12 +
 com.ibm.team.juno.test/.project                 |    24 +
 .../.settings/com.ibm.etools.references.prefs   |     4 +
 .../.settings/org.eclipse.core.resources.prefs  |     2 +
 .../.settings/org.eclipse.jdt.apt.core.prefs    |     2 +
 .../.settings/org.eclipse.jdt.core.prefs        |   393 +
 .../.settings/org.eclipse.jdt.ui.prefs          |   120 +
 .../org.eclipse.ltk.core.refactoring.prefs      |     3 +
 .../.settings/org.eclipse.pde.core.prefs        |     3 +
 .../.settings/org.eclipse.pde.prefs             |    15 +
 com.ibm.team.juno.test/META-INF/MANIFEST.MF     |    23 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 .../bin/com/ibm/juno/core/test/AllTests.class   |   Bin 0 -> 5683 bytes
 .../ibm/juno/core/test/CT_Annotations$A.class   |   Bin 0 -> 492 bytes
 .../juno/core/test/CT_Annotations$Person1.class |   Bin 0 -> 783 bytes
 .../com/ibm/juno/core/test/CT_Annotations.class |   Bin 0 -> 1926 bytes
 .../ibm/juno/core/test/CT_BeanContext$1.class   |   Bin 0 -> 823 bytes
 .../ibm/juno/core/test/CT_BeanContext$A.class   |   Bin 0 -> 332 bytes
 .../core/test/CT_BeanContext$AHandler.class     |   Bin 0 -> 1582 bytes
 .../juno/core/test/CT_BeanContext$Address.class |   Bin 0 -> 2168 bytes
 .../test/CT_BeanContext$AddressablePerson.class |   Bin 0 -> 1336 bytes
 .../ibm/juno/core/test/CT_BeanContext$B.class   |   Bin 0 -> 625 bytes
 .../ibm/juno/core/test/CT_BeanContext$B2.class  |   Bin 0 -> 807 bytes
 .../ibm/juno/core/test/CT_BeanContext$C.class   |   Bin 0 -> 395 bytes
 .../ibm/juno/core/test/CT_BeanContext$C1.class  |   Bin 0 -> 534 bytes
 .../ibm/juno/core/test/CT_BeanContext$D.class   |   Bin 0 -> 1132 bytes
 .../test/CT_BeanContext$DummyBeanFilterA.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyBeanFilterB.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyBeanFilterC.class  |   Bin 0 -> 619 bytes
 .../test/CT_BeanContext$DummyPojoFilterA.class  |   Bin 0 -> 648 bytes
 .../test/CT_BeanContext$DummyPojoFilterB.class  |   Bin 0 -> 648 bytes
 .../test/CT_BeanContext$DummyPojoFilterC.class  |   Bin 0 -> 648 bytes
 .../juno/core/test/CT_BeanContext$Person.class  |   Bin 0 -> 1206 bytes
 .../test/CT_BeanContext$ReadOnlyPerson.class    |   Bin 0 -> 1171 bytes
 .../core/test/CT_BeanContext$TestEnum.class     |   Bin 0 -> 1255 bytes
 .../com/ibm/juno/core/test/CT_BeanContext.class |   Bin 0 -> 18537 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A.class    |   Bin 0 -> 876 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A1.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$A2.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B.class    |   Bin 0 -> 765 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B1.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$B2.class   |   Bin 0 -> 462 bytes
 .../ibm/juno/core/test/CT_BeanFilter$C1.class   |   Bin 0 -> 455 bytes
 .../ibm/juno/core/test/CT_BeanFilter$C2.class   |   Bin 0 -> 491 bytes
 .../ibm/juno/core/test/CT_BeanFilter$D1.class   |   Bin 0 -> 568 bytes
 .../ibm/juno/core/test/CT_BeanFilter$D2.class   |   Bin 0 -> 599 bytes
 .../com/ibm/juno/core/test/CT_BeanFilter.class  |   Bin 0 -> 3424 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$A.class   |   Bin 0 -> 683 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$B.class   |   Bin 0 -> 2947 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$C.class   |   Bin 0 -> 1268 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D.class   |   Bin 0 -> 4549 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D1.class  |   Bin 0 -> 775 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$D2.class  |   Bin 0 -> 452 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$E.class   |   Bin 0 -> 485 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$F.class   |   Bin 0 -> 543 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$G.class   |   Bin 0 -> 428 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$G1.class  |   Bin 0 -> 1983 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$H.class   |   Bin 0 -> 778 bytes
 .../ibm/juno/core/test/CT_BeanMap$HEnum.class   |   Bin 0 -> 1198 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$I.class   |   Bin 0 -> 997 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$J.class   |   Bin 0 -> 1271 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$K.class   |   Bin 0 -> 1250 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L.class   |   Bin 0 -> 490 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L1.class  |   Bin 0 -> 526 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$L2.class  |   Bin 0 -> 599 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M1.class  |   Bin 0 -> 581 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M2.class  |   Bin 0 -> 616 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M3.class  |   Bin 0 -> 534 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M4.class  |   Bin 0 -> 687 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$M5.class  |   Bin 0 -> 592 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N1.class  |   Bin 0 -> 868 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N2.class  |   Bin 0 -> 622 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N3.class  |   Bin 0 -> 540 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N4.class  |   Bin 0 -> 693 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$N5.class  |   Bin 0 -> 622 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$O.class   |   Bin 0 -> 397 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$P1.class  |   Bin 0 -> 581 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$P2.class  |   Bin 0 -> 921 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Q1.class  |   Bin 0 -> 382 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Q2.class  |   Bin 0 -> 1068 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$R1.class  |   Bin 0 -> 399 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$R2.class  |   Bin 0 -> 432 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$S.class   |   Bin 0 -> 488 bytes
 .../ibm/juno/core/test/CT_BeanMap$TEnum.class   |   Bin 0 -> 1198 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$U.class   |   Bin 0 -> 1310 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V.class   |   Bin 0 -> 480 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V2.class  |   Bin 0 -> 514 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$V3.class  |   Bin 0 -> 651 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W.class   |   Bin 0 -> 550 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W2.class  |   Bin 0 -> 584 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$W3.class  |   Bin 0 -> 721 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$X1.class  |   Bin 0 -> 814 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$X2.class  |   Bin 0 -> 1095 bytes
 .../com/ibm/juno/core/test/CT_BeanMap$Y.class   |   Bin 0 -> 530 bytes
 .../bin/com/ibm/juno/core/test/CT_BeanMap.class |   Bin 0 -> 33895 bytes
 .../com/ibm/juno/core/test/CT_ClassMeta$G.class |   Bin 0 -> 583 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HC1.class   |   Bin 0 -> 569 bytes
 .../juno/core/test/CT_ClassMeta$HC1Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HC2.class   |   Bin 0 -> 601 bytes
 .../juno/core/test/CT_ClassMeta$HC2Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HI1.class   |   Bin 0 -> 210 bytes
 .../juno/core/test/CT_ClassMeta$HI1Filter.class |   Bin 0 -> 607 bytes
 .../ibm/juno/core/test/CT_ClassMeta$HI2.class   |   Bin 0 -> 271 bytes
 .../juno/core/test/CT_ClassMeta$HI2Filter.class |   Bin 0 -> 607 bytes
 .../com/ibm/juno/core/test/CT_ClassMeta.class   |   Bin 0 -> 6757 bytes
 .../test/CT_DataConversionTest$NotABean.class   |   Bin 0 -> 758 bytes
 .../test/CT_DataConversionTest$TestEnum.class   |   Bin 0 -> 1311 bytes
 .../juno/core/test/CT_DataConversionTest.class  |   Bin 0 -> 4436 bytes
 .../juno/core/test/CT_IgnoredClasses$A.class    |   Bin 0 -> 585 bytes
 .../ibm/juno/core/test/CT_IgnoredClasses.class  |   Bin 0 -> 2226 bytes
 .../com/ibm/juno/core/test/CT_JacocoDummy.class |   Bin 0 -> 2487 bytes
 .../juno/core/test/CT_ObjectList$Person.class   |   Bin 0 -> 460 bytes
 .../com/ibm/juno/core/test/CT_ObjectList.class  |   Bin 0 -> 3017 bytes
 .../com/ibm/juno/core/test/CT_ObjectMap.class   |   Bin 0 -> 13814 bytes
 .../CT_ParserGenerics$TestCollection1.class     |   Bin 0 -> 625 bytes
 .../CT_ParserGenerics$TestCollection2.class     |   Bin 0 -> 625 bytes
 .../core/test/CT_ParserGenerics$TestMap1.class  |   Bin 0 -> 560 bytes
 .../core/test/CT_ParserGenerics$TestMap2.class  |   Bin 0 -> 546 bytes
 .../ibm/juno/core/test/CT_ParserGenerics.class  |   Bin 0 -> 2588 bytes
 .../ibm/juno/core/test/CT_ParserReader.class    |   Bin 0 -> 4227 bytes
 .../juno/core/test/CT_PojoFilter$AFilter.class  |   Bin 0 -> 1728 bytes
 .../com/ibm/juno/core/test/CT_PojoFilter.class  |   Bin 0 -> 1704 bytes
 .../core/test/CT_PropertyNamerDashedLC.class    |   Bin 0 -> 1118 bytes
 .../ibm/juno/core/test/CT_Visibility$A.class    |   Bin 0 -> 560 bytes
 .../com/ibm/juno/core/test/CT_Visibility.class  |   Bin 0 -> 5159 bytes
 .../com/ibm/juno/core/test/TestUtils$1.class    |   Bin 0 -> 2172 bytes
 .../bin/com/ibm/juno/core/test/TestUtils.class  |   Bin 0 -> 12027 bytes
 .../ibm/juno/core/test/XmlValidatorParser.class |   Bin 0 -> 4356 bytes
 .../bin/com/ibm/juno/core/test/a/A1$A2.class    |   Bin 0 -> 1693 bytes
 .../bin/com/ibm/juno/core/test/a/A1$A3.class    |   Bin 0 -> 1693 bytes
 .../bin/com/ibm/juno/core/test/a/A1$A4.class    |   Bin 0 -> 1693 bytes
 .../bin/com/ibm/juno/core/test/a/A1$A5.class    |   Bin 0 -> 1787 bytes
 .../bin/com/ibm/juno/core/test/a/A1.class       |   Bin 0 -> 2848 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$A.class |   Bin 0 -> 855 bytes
 .../rttests/CT_RoundTripAddClassAttrs$AA.class  |   Bin 0 -> 554 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$B.class |   Bin 0 -> 1187 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$C.class |   Bin 0 -> 1355 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$D.class |   Bin 0 -> 1316 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$E.class |   Bin 0 -> 1658 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs$F.class |   Bin 0 -> 1510 bytes
 .../rttests/CT_RoundTripAddClassAttrs$IA.class  |   Bin 0 -> 346 bytes
 .../a/rttests/CT_RoundTripAddClassAttrs.class   |   Bin 0 -> 10458 bytes
 .../CT_RoundTripBeanInheritance$A1.class        |   Bin 0 -> 1576 bytes
 .../CT_RoundTripBeanInheritance$A2.class        |   Bin 0 -> 1002 bytes
 .../CT_RoundTripBeanInheritance$A3.class        |   Bin 0 -> 1077 bytes
 .../CT_RoundTripBeanInheritance$B1.class        |   Bin 0 -> 1855 bytes
 .../CT_RoundTripBeanInheritance$B2.class        |   Bin 0 -> 1453 bytes
 .../a/rttests/CT_RoundTripBeanInheritance.class |   Bin 0 -> 3082 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$1.class |   Bin 0 -> 990 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$2.class |   Bin 0 -> 1052 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$A.class |   Bin 0 -> 1131 bytes
 .../a/rttests/CT_RoundTripBeanMaps$ABean.class  |   Bin 0 -> 623 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$B.class |   Bin 0 -> 937 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B1.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B2.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$B3.class     |   Bin 0 -> 1069 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA.class     |   Bin 0 -> 859 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA1.class    |   Bin 0 -> 814 bytes
 .../a/rttests/CT_RoundTripBeanMaps$BA2.class    |   Bin 0 -> 542 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$C.class |   Bin 0 -> 483 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C1.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C2.class     |   Bin 0 -> 739 bytes
 .../a/rttests/CT_RoundTripBeanMaps$C3.class     |   Bin 0 -> 1069 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA.class     |   Bin 0 -> 519 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA1.class    |   Bin 0 -> 814 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CA2.class    |   Bin 0 -> 542 bytes
 .../rttests/CT_RoundTripBeanMaps$CAFilter.class |   Bin 0 -> 1089 bytes
 .../a/rttests/CT_RoundTripBeanMaps$CBean.class  |   Bin 0 -> 787 bytes
 .../rttests/CT_RoundTripBeanMaps$CFilter.class  |   Bin 0 -> 1170 bytes
 .../a/rttests/CT_RoundTripBeanMaps$D1.class     |   Bin 0 -> 811 bytes
 .../a/rttests/CT_RoundTripBeanMaps$D2.class     |   Bin 0 -> 709 bytes
 .../rttests/CT_RoundTripBeanMaps$D2Filter.class |   Bin 0 -> 836 bytes
 .../a/rttests/CT_RoundTripBeanMaps$E1.class     |   Bin 0 -> 815 bytes
 .../a/rttests/CT_RoundTripBeanMaps$E2.class     |   Bin 0 -> 709 bytes
 .../rttests/CT_RoundTripBeanMaps$E2Filter.class |   Bin 0 -> 830 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FA1.class    |   Bin 0 -> 589 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FA2.class    |   Bin 0 -> 724 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FB1.class    |   Bin 0 -> 489 bytes
 .../CT_RoundTripBeanMaps$FB1Filter.class        |   Bin 0 -> 794 bytes
 .../a/rttests/CT_RoundTripBeanMaps$FB2.class    |   Bin 0 -> 724 bytes
 .../CT_RoundTripBeanMaps$FB2Filter.class        |   Bin 0 -> 871 bytes
 .../rttests/CT_RoundTripBeanMaps$G$G1$G2.class  |   Bin 0 -> 790 bytes
 .../a/rttests/CT_RoundTripBeanMaps$G$G1.class   |   Bin 0 -> 966 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$G.class |   Bin 0 -> 1109 bytes
 .../rttests/CT_RoundTripBeanMaps$H$H1$H2.class  |   Bin 0 -> 790 bytes
 .../a/rttests/CT_RoundTripBeanMaps$H$H1.class   |   Bin 0 -> 966 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$H.class |   Bin 0 -> 1516 bytes
 .../rttests/CT_RoundTripBeanMaps$I$I1$I2.class  |   Bin 0 -> 786 bytes
 .../a/rttests/CT_RoundTripBeanMaps$I$I1.class   |   Bin 0 -> 962 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$I.class |   Bin 0 -> 1376 bytes
 .../a/rttests/CT_RoundTripBeanMaps$IBean.class  |   Bin 0 -> 337 bytes
 .../a/rttests/CT_RoundTripBeanMaps$J$J2.class   |   Bin 0 -> 1014 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$J.class |   Bin 0 -> 960 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$K.class |   Bin 0 -> 2392 bytes
 .../a/rttests/CT_RoundTripBeanMaps$KEnum.class  |   Bin 0 -> 1342 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$L.class |   Bin 0 -> 743 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$M.class |   Bin 0 -> 1172 bytes
 .../a/rttests/CT_RoundTripBeanMaps$N$N2.class   |   Bin 0 -> 891 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps$N.class |   Bin 0 -> 758 bytes
 .../test/a/rttests/CT_RoundTripBeanMaps.class   |   Bin 0 -> 18545 bytes
 .../core/test/a/rttests/CT_RoundTripDTOs.class  |   Bin 0 -> 1493 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$1.class   |   Bin 0 -> 1058 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$2.class   |   Bin 0 -> 1058 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$3.class   |   Bin 0 -> 1054 bytes
 .../test/a/rttests/CT_RoundTripEnum$A$4.class   |   Bin 0 -> 1054 bytes
 .../test/a/rttests/CT_RoundTripEnum$A.class     |   Bin 0 -> 3176 bytes
 .../test/a/rttests/CT_RoundTripEnum$AEnum.class |   Bin 0 -> 1314 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$1.class   |   Bin 0 -> 1058 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$2.class   |   Bin 0 -> 1058 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$3.class   |   Bin 0 -> 1054 bytes
 .../test/a/rttests/CT_RoundTripEnum$B$4.class   |   Bin 0 -> 1054 bytes
 .../test/a/rttests/CT_RoundTripEnum$B.class     |   Bin 0 -> 3176 bytes
 .../test/a/rttests/CT_RoundTripEnum$BEnum.class |   Bin 0 -> 1787 bytes
 .../core/test/a/rttests/CT_RoundTripEnum.class  |   Bin 0 -> 4292 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$1.class |   Bin 0 -> 957 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$2.class |   Bin 0 -> 1051 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$3.class |   Bin 0 -> 1025 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$4.class |   Bin 0 -> 1025 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$5.class |   Bin 0 -> 987 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A$6.class |   Bin 0 -> 1070 bytes
 .../a/rttests/CT_RoundTripFilterBeans$A.class   |   Bin 0 -> 2298 bytes
 .../a/rttests/CT_RoundTripFilterBeans$B.class   |   Bin 0 -> 657 bytes
 .../CT_RoundTripFilterBeans$BFilter.class       |   Bin 0 -> 1881 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C1.class  |   Bin 0 -> 744 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C2.class  |   Bin 0 -> 1122 bytes
 .../a/rttests/CT_RoundTripFilterBeans$C3.class  |   Bin 0 -> 1487 bytes
 .../rttests/CT_RoundTripFilterBeans$CDTO.class  |   Bin 0 -> 521 bytes
 .../a/rttests/CT_RoundTripFilterBeans$D1.class  |   Bin 0 -> 676 bytes
 .../a/rttests/CT_RoundTripFilterBeans$D2.class  |   Bin 0 -> 1067 bytes
 .../a/rttests/CT_RoundTripFilterBeans.class     |   Bin 0 -> 7764 bytes
 .../a/rttests/CT_RoundTripGenerics$Pair.class   |   Bin 0 -> 1450 bytes
 .../rttests/CT_RoundTripGenerics$RealPair.class |   Bin 0 -> 902 bytes
 .../a/rttests/CT_RoundTripGenerics$Source.class |   Bin 0 -> 658 bytes
 .../a/rttests/CT_RoundTripGenerics$Target.class |   Bin 0 -> 658 bytes
 .../test/a/rttests/CT_RoundTripGenerics.class   |   Bin 0 -> 2317 bytes
 .../a/rttests/CT_RoundTripLargeObjects$A.class  |   Bin 0 -> 1583 bytes
 .../a/rttests/CT_RoundTripLargeObjects$A1.class |   Bin 0 -> 632 bytes
 .../CT_RoundTripLargeObjects$A1List.class       |   Bin 0 -> 672 bytes
 .../CT_RoundTripLargeObjects$A1Map.class        |   Bin 0 -> 693 bytes
 .../a/rttests/CT_RoundTripLargeObjects.class    |   Bin 0 -> 6099 bytes
 .../a/rttests/CT_RoundTripMaps$TestEnum.class   |   Bin 0 -> 1335 bytes
 .../core/test/a/rttests/CT_RoundTripMaps.class  |   Bin 0 -> 7133 bytes
 .../CT_RoundTripObjectsAsStrings$A.class        |   Bin 0 -> 1526 bytes
 .../CT_RoundTripObjectsAsStrings$A1.class       |   Bin 0 -> 1062 bytes
 .../CT_RoundTripObjectsAsStrings$A2.class       |   Bin 0 -> 1059 bytes
 .../CT_RoundTripObjectsAsStrings$A3.class       |   Bin 0 -> 1057 bytes
 .../CT_RoundTripObjectsAsStrings$A4.class       |   Bin 0 -> 1063 bytes
 .../CT_RoundTripObjectsAsStrings$B.class        |   Bin 0 -> 1018 bytes
 .../CT_RoundTripObjectsAsStrings$B1.class       |   Bin 0 -> 1477 bytes
 .../CT_RoundTripObjectsAsStrings$B2.class       |   Bin 0 -> 1979 bytes
 .../CT_RoundTripObjectsAsStrings$C.class        |   Bin 0 -> 1526 bytes
 .../CT_RoundTripObjectsAsStrings$C1.class       |   Bin 0 -> 1527 bytes
 .../CT_RoundTripObjectsAsStrings$C2.class       |   Bin 0 -> 1276 bytes
 .../CT_RoundTripObjectsAsStrings$C3.class       |   Bin 0 -> 1372 bytes
 .../CT_RoundTripObjectsAsStrings$C4.class       |   Bin 0 -> 1057 bytes
 .../rttests/CT_RoundTripObjectsAsStrings.class  |   Bin 0 -> 3560 bytes
 ...T_RoundTripObjectsWithSpecialMethods$A.class |   Bin 0 -> 1317 bytes
 ..._RoundTripObjectsWithSpecialMethods$A2.class |   Bin 0 -> 943 bytes
 ...T_RoundTripObjectsWithSpecialMethods$B.class |   Bin 0 -> 1003 bytes
 ..._RoundTripObjectsWithSpecialMethods$B2.class |   Bin 0 -> 1151 bytes
 .../CT_RoundTripObjectsWithSpecialMethods.class |   Bin 0 -> 2660 bytes
 .../CT_RoundTripPrimitiveObjectBeans.class      |   Bin 0 -> 7639 bytes
 .../rttests/CT_RoundTripPrimitivesBeans$1.class |   Bin 0 -> 1124 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$1.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$2.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$3.class |   Bin 0 -> 1044 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$4.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$5.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$6.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$7.class |   Bin 0 -> 1043 bytes
 ...ndTripPrimitivesBeans$PrimitivesBean$8.class |   Bin 0 -> 1043 bytes
 ...oundTripPrimitivesBeans$PrimitivesBean.class |   Bin 0 -> 4190 bytes
 .../a/rttests/CT_RoundTripPrimitivesBeans.class |   Bin 0 -> 6238 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans$A.class |   Bin 0 -> 1381 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans$B.class |   Bin 0 -> 1101 bytes
 .../a/rttests/CT_RoundTripReadOnlyBeans.class   |   Bin 0 -> 1890 bytes
 .../a/rttests/CT_RoundTripSimpleObjects.class   |   Bin 0 -> 14965 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$1.class  |   Bin 0 -> 1117 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$2.class  |   Bin 0 -> 1187 bytes
 .../a/rttests/CT_RoundTripToObjectMaps$A.class  |   Bin 0 -> 1412 bytes
 .../a/rttests/CT_RoundTripToObjectMaps.class    |   Bin 0 -> 3096 bytes
 .../a/rttests/CT_RoundTripTrimStrings$A.class   |   Bin 0 -> 1319 bytes
 .../a/rttests/CT_RoundTripTrimStrings.class     |   Bin 0 -> 2771 bytes
 .../test/a/rttests/RoundTripTest$Flags.class    |   Bin 0 -> 666 bytes
 .../core/test/a/rttests/RoundTripTest.class     |   Bin 0 -> 13707 bytes
 .../com/ibm/juno/core/test/csv/CT_Csv$A.class   |   Bin 0 -> 511 bytes
 .../bin/com/ibm/juno/core/test/csv/CT_Csv.class |   Bin 0 -> 1279 bytes
 .../ibm/juno/core/test/dto/atom/CT_Atom.class   |   Bin 0 -> 5702 bytes
 .../com/ibm/juno/core/test/dto/atom/test1.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test2.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test3.xml   |    46 +
 .../test/dto/cognos/CT_CognosXml$Item.class     |   Bin 0 -> 841 bytes
 .../core/test/dto/cognos/CT_CognosXml.class     |   Bin 0 -> 3848 bytes
 .../test/dto/jsonschema/CT_JsonSchema.class     |   Bin 0 -> 5377 bytes
 .../juno/core/test/dto/jsonschema/test1.json    |    77 +
 .../juno/core/test/dto/jsonschema/test2.json    |    20 +
 .../core/test/filters/CT_BeanFilter$A1.class    |   Bin 0 -> 266 bytes
 .../core/test/filters/CT_BeanFilter$A2.class    |   Bin 0 -> 334 bytes
 .../core/test/filters/CT_BeanFilter$A3.class    |   Bin 0 -> 734 bytes
 .../core/test/filters/CT_BeanFilter$B1.class    |   Bin 0 -> 457 bytes
 .../core/test/filters/CT_BeanFilter$B2.class    |   Bin 0 -> 517 bytes
 .../core/test/filters/CT_BeanFilter$C1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$C2.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$C3.class    |   Bin 0 -> 845 bytes
 .../core/test/filters/CT_BeanFilter$D1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$D2.class    |   Bin 0 -> 793 bytes
 .../core/test/filters/CT_BeanFilter$D3.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$E1.class    |   Bin 0 -> 659 bytes
 .../core/test/filters/CT_BeanFilter$E2.class    |   Bin 0 -> 793 bytes
 .../core/test/filters/CT_BeanFilter$E3.class    |   Bin 0 -> 810 bytes
 .../core/test/filters/CT_BeanFilter$F1.class    |   Bin 0 -> 754 bytes
 .../core/test/filters/CT_BeanFilter$F2.class    |   Bin 0 -> 698 bytes
 .../core/test/filters/CT_BeanFilter$F3.class    |   Bin 0 -> 845 bytes
 .../core/test/filters/CT_BeanFilter$Test2.class |   Bin 0 -> 719 bytes
 .../juno/core/test/filters/CT_BeanFilter.class  |   Bin 0 -> 4127 bytes
 .../juno/core/test/filters/CT_BeanMap$A.class   |   Bin 0 -> 490 bytes
 .../juno/core/test/filters/CT_BeanMap$B.class   |   Bin 0 -> 906 bytes
 .../juno/core/test/filters/CT_BeanMap$B1.class  |   Bin 0 -> 440 bytes
 .../core/test/filters/CT_BeanMap$B1Filter.class |   Bin 0 -> 1237 bytes
 .../juno/core/test/filters/CT_BeanMap$B2.class  |   Bin 0 -> 481 bytes
 .../core/test/filters/CT_BeanMap$B2Filter.class |   Bin 0 -> 1237 bytes
 .../ibm/juno/core/test/filters/CT_BeanMap.class |   Bin 0 -> 2685 bytes
 .../filters/CT_ByteArrayBase64Filter$1.class    |   Bin 0 -> 819 bytes
 .../filters/CT_ByteArrayBase64Filter$2.class    |   Bin 0 -> 942 bytes
 .../filters/CT_ByteArrayBase64Filter$A$1.class  |   Bin 0 -> 951 bytes
 .../filters/CT_ByteArrayBase64Filter$A$2.class  |   Bin 0 -> 1035 bytes
 .../filters/CT_ByteArrayBase64Filter$A$3.class  |   Bin 0 -> 1132 bytes
 .../filters/CT_ByteArrayBase64Filter$A$4.class  |   Bin 0 -> 1235 bytes
 .../filters/CT_ByteArrayBase64Filter$A.class    |   Bin 0 -> 1688 bytes
 .../filters/CT_ByteArrayBase64Filter$B$1.class  |   Bin 0 -> 951 bytes
 .../filters/CT_ByteArrayBase64Filter$B$2.class  |   Bin 0 -> 1035 bytes
 .../filters/CT_ByteArrayBase64Filter$B.class    |   Bin 0 -> 1184 bytes
 .../test/filters/CT_ByteArrayBase64Filter.class |   Bin 0 -> 4491 bytes
 .../core/test/filters/CT_CalendarFilter$A.class |   Bin 0 -> 1276 bytes
 .../core/test/filters/CT_CalendarFilter.class   |   Bin 0 -> 20584 bytes
 .../core/test/filters/CT_DateFilter$A.class     |   Bin 0 -> 621 bytes
 .../juno/core/test/filters/CT_DateFilter.class  |   Bin 0 -> 5598 bytes
 .../test/filters/CT_EnumerationFilter.class     |   Bin 0 -> 1638 bytes
 .../core/test/filters/CT_IteratorFilter.class   |   Bin 0 -> 1638 bytes
 .../core/test/filters/CT_ReaderFilter.class     |   Bin 0 -> 1904 bytes
 .../ibm/juno/core/test/html/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/html/CT_Common$B$1.class |   Bin 0 -> 867 bytes
 .../ibm/juno/core/test/html/CT_Common$B.class   |   Bin 0 -> 878 bytes
 .../ibm/juno/core/test/html/CT_Common$C$1.class |   Bin 0 -> 798 bytes
 .../ibm/juno/core/test/html/CT_Common$C.class   |   Bin 0 -> 857 bytes
 .../ibm/juno/core/test/html/CT_Common$D.class   |   Bin 0 -> 758 bytes
 .../juno/core/test/html/CT_Common$E1$1.class    |   Bin 0 -> 887 bytes
 .../juno/core/test/html/CT_Common$E1$2.class    |   Bin 0 -> 821 bytes
 .../juno/core/test/html/CT_Common$E1$3.class    |   Bin 0 -> 973 bytes
 .../ibm/juno/core/test/html/CT_Common$E1.class  |   Bin 0 -> 1745 bytes
 .../ibm/juno/core/test/html/CT_Common$E2.class  |   Bin 0 -> 465 bytes
 .../ibm/juno/core/test/html/CT_Common$F.class   |   Bin 0 -> 707 bytes
 .../ibm/juno/core/test/html/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/html/CT_Common$J.class   |   Bin 0 -> 1362 bytes
 .../ibm/juno/core/test/html/CT_Common$R1.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/html/CT_Common$R2.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/html/CT_Common$R3.class  |   Bin 0 -> 579 bytes
 .../com/ibm/juno/core/test/html/CT_Common.class |   Bin 0 -> 14367 bytes
 .../juno/core/test/html/CT_CommonParser$1.class |   Bin 0 -> 1585 bytes
 .../core/test/html/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/html/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/html/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/html/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/html/CT_CommonParser$C.class |   Bin 0 -> 1104 bytes
 .../juno/core/test/html/CT_CommonParser.class   |   Bin 0 -> 7229 bytes
 .../ibm/juno/core/test/html/CT_Html$A1.class    |   Bin 0 -> 446 bytes
 .../ibm/juno/core/test/html/CT_Html$A2.class    |   Bin 0 -> 446 bytes
 .../ibm/juno/core/test/html/CT_Html$A3.class    |   Bin 0 -> 581 bytes
 .../ibm/juno/core/test/html/CT_Html$A4.class    |   Bin 0 -> 588 bytes
 .../juno/core/test/html/CT_Html$A4Filter.class  |   Bin 0 -> 1090 bytes
 .../ibm/juno/core/test/html/CT_Html$A5.class    |   Bin 0 -> 588 bytes
 .../juno/core/test/html/CT_Html$A5Filter.class  |   Bin 0 -> 1138 bytes
 .../ibm/juno/core/test/html/CT_Html$B1.class    |   Bin 0 -> 665 bytes
 .../ibm/juno/core/test/html/CT_Html$B2.class    |   Bin 0 -> 560 bytes
 .../ibm/juno/core/test/html/CT_Html$C1.class    |   Bin 0 -> 554 bytes
 .../ibm/juno/core/test/html/CT_Html$C2.class    |   Bin 0 -> 554 bytes
 .../com/ibm/juno/core/test/html/CT_Html.class   |   Bin 0 -> 5324 bytes
 .../juno/core/test/ini/CT_ConfigFile$1.class    |   Bin 0 -> 2183 bytes
 .../juno/core/test/ini/CT_ConfigFile$10.class   |   Bin 0 -> 1058 bytes
 .../juno/core/test/ini/CT_ConfigFile$11.class   |   Bin 0 -> 1058 bytes
 .../juno/core/test/ini/CT_ConfigFile$12.class   |   Bin 0 -> 1058 bytes
 .../juno/core/test/ini/CT_ConfigFile$13.class   |   Bin 0 -> 1058 bytes
 .../juno/core/test/ini/CT_ConfigFile$2.class    |   Bin 0 -> 793 bytes
 .../juno/core/test/ini/CT_ConfigFile$3.class    |   Bin 0 -> 798 bytes
 .../juno/core/test/ini/CT_ConfigFile$4.class    |   Bin 0 -> 798 bytes
 .../juno/core/test/ini/CT_ConfigFile$5.class    |   Bin 0 -> 1350 bytes
 .../juno/core/test/ini/CT_ConfigFile$6.class    |   Bin 0 -> 1335 bytes
 .../juno/core/test/ini/CT_ConfigFile$7.class    |   Bin 0 -> 1353 bytes
 .../juno/core/test/ini/CT_ConfigFile$8.class    |   Bin 0 -> 1334 bytes
 .../juno/core/test/ini/CT_ConfigFile$9.class    |   Bin 0 -> 1336 bytes
 .../juno/core/test/ini/CT_ConfigFile$A.class    |   Bin 0 -> 605 bytes
 .../juno/core/test/ini/CT_ConfigFile$B.class    |   Bin 0 -> 1512 bytes
 .../ibm/juno/core/test/ini/CT_ConfigFile.class  |   Bin 0 -> 45199 bytes
 .../ibm/juno/core/test/ini/CT_ConfigMgr$1.class |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/ini/CT_ConfigMgr.class   |   Bin 0 -> 9095 bytes
 .../ibm/juno/core/test/jena/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/jena/CT_Common$B$1.class |   Bin 0 -> 867 bytes
 .../ibm/juno/core/test/jena/CT_Common$B.class   |   Bin 0 -> 878 bytes
 .../ibm/juno/core/test/jena/CT_Common$C$1.class |   Bin 0 -> 798 bytes
 .../ibm/juno/core/test/jena/CT_Common$C.class   |   Bin 0 -> 857 bytes
 .../ibm/juno/core/test/jena/CT_Common$D.class   |   Bin 0 -> 758 bytes
 .../juno/core/test/jena/CT_Common$E1$1.class    |   Bin 0 -> 819 bytes
 .../juno/core/test/jena/CT_Common$E1$2.class    |   Bin 0 -> 753 bytes
 .../juno/core/test/jena/CT_Common$E1$3.class    |   Bin 0 -> 847 bytes
 .../ibm/juno/core/test/jena/CT_Common$E1.class  |   Bin 0 -> 1762 bytes
 .../ibm/juno/core/test/jena/CT_Common$E2.class  |   Bin 0 -> 465 bytes
 .../ibm/juno/core/test/jena/CT_Common$F.class   |   Bin 0 -> 837 bytes
 .../ibm/juno/core/test/jena/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/jena/CT_Common$R1.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/jena/CT_Common$R2.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/jena/CT_Common$R3.class  |   Bin 0 -> 579 bytes
 .../com/ibm/juno/core/test/jena/CT_Common.class |   Bin 0 -> 13520 bytes
 .../juno/core/test/jena/CT_CommonParser$1.class |   Bin 0 -> 1585 bytes
 .../core/test/jena/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/jena/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/jena/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/jena/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/jena/CT_CommonParser$C.class |   Bin 0 -> 1104 bytes
 .../juno/core/test/jena/CT_CommonParser.class   |   Bin 0 -> 8943 bytes
 .../juno/core/test/jena/CT_CommonXml$A.class    |   Bin 0 -> 884 bytes
 .../juno/core/test/jena/CT_CommonXml$B.class    |   Bin 0 -> 879 bytes
 .../ibm/juno/core/test/jena/CT_CommonXml.class  |   Bin 0 -> 2958 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$A.class  |   Bin 0 -> 1257 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$B.class  |   Bin 0 -> 2688 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BA.class |   Bin 0 -> 965 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BB.class |   Bin 0 -> 965 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BC.class |   Bin 0 -> 966 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BD.class |   Bin 0 -> 974 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$BE.class |   Bin 0 -> 969 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$C.class  |   Bin 0 -> 2494 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf$D.class  |   Bin 0 -> 1075 bytes
 .../com/ibm/juno/core/test/jena/CT_Rdf.class    |   Bin 0 -> 11170 bytes
 .../juno/core/test/jena/CT_RdfParser$A.class    |   Bin 0 -> 2127 bytes
 .../juno/core/test/jena/CT_RdfParser$A1.class   |   Bin 0 -> 1761 bytes
 .../ibm/juno/core/test/jena/CT_RdfParser.class  |   Bin 0 -> 3625 bytes
 .../juno/core/test/json/BrokenCognosOutput.txt  |     1 +
 .../ibm/juno/core/test/json/CT_Common$A.class   |   Bin 0 -> 594 bytes
 .../ibm/juno/core/test/json/CT_Common$B$1.class |   Bin 0 -> 867 bytes
 .../ibm/juno/core/test/json/CT_Common$B.class   |   Bin 0 -> 878 bytes
 .../ibm/juno/core/test/json/CT_Common$C$1.class |   Bin 0 -> 798 bytes
 .../ibm/juno/core/test/json/CT_Common$C.class   |   Bin 0 -> 857 bytes
 .../ibm/juno/core/test/json/CT_Common$D.class   |   Bin 0 -> 758 bytes
 .../juno/core/test/json/CT_Common$E1$1.class    |   Bin 0 -> 887 bytes
 .../juno/core/test/json/CT_Common$E1$2.class    |   Bin 0 -> 821 bytes
 .../juno/core/test/json/CT_Common$E1$3.class    |   Bin 0 -> 973 bytes
 .../ibm/juno/core/test/json/CT_Common$E1.class  |   Bin 0 -> 1745 bytes
 .../ibm/juno/core/test/json/CT_Common$E2.class  |   Bin 0 -> 465 bytes
 .../ibm/juno/core/test/json/CT_Common$F.class   |   Bin 0 -> 707 bytes
 .../ibm/juno/core/test/json/CT_Common$G.class   |   Bin 0 -> 570 bytes
 .../ibm/juno/core/test/json/CT_Common$J.class   |   Bin 0 -> 1362 bytes
 .../ibm/juno/core/test/json/CT_Common$R1.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/json/CT_Common$R2.class  |   Bin 0 -> 579 bytes
 .../ibm/juno/core/test/json/CT_Common$R3.class  |   Bin 0 -> 579 bytes
 .../com/ibm/juno/core/test/json/CT_Common.class |   Bin 0 -> 10324 bytes
 .../juno/core/test/json/CT_CommonParser$1.class |   Bin 0 -> 1585 bytes
 .../core/test/json/CT_CommonParser$A1.class     |   Bin 0 -> 548 bytes
 .../core/test/json/CT_CommonParser$A2.class     |   Bin 0 -> 581 bytes
 .../core/test/json/CT_CommonParser$A3.class     |   Bin 0 -> 634 bytes
 .../juno/core/test/json/CT_CommonParser$B.class |   Bin 0 -> 442 bytes
 .../juno/core/test/json/CT_CommonParser$C.class |   Bin 0 -> 1104 bytes
 .../juno/core/test/json/CT_CommonParser.class   |   Bin 0 -> 6228 bytes
 .../com/ibm/juno/core/test/json/CT_Json$A.class |   Bin 0 -> 658 bytes
 .../com/ibm/juno/core/test/json/CT_Json$B.class |   Bin 0 -> 1069 bytes
 .../com/ibm/juno/core/test/json/CT_Json$C.class |   Bin 0 -> 451 bytes
 .../com/ibm/juno/core/test/json/CT_Json.class   |   Bin 0 -> 7833 bytes
 .../juno/core/test/json/CT_JsonParser$A.class   |   Bin 0 -> 440 bytes
 .../juno/core/test/json/CT_JsonParser$B.class   |   Bin 0 -> 655 bytes
 .../juno/core/test/json/CT_JsonParser$C.class   |   Bin 0 -> 887 bytes
 .../ibm/juno/core/test/json/CT_JsonParser.class |   Bin 0 -> 7333 bytes
 .../ibm/juno/core/test/json/CT_JsonSchema.class |   Bin 0 -> 1611 bytes
 .../urlencoding/CT_CommonParser_Uon$1.class     |   Bin 0 -> 1644 bytes
 .../urlencoding/CT_CommonParser_Uon$A1.class    |   Bin 0 -> 607 bytes
 .../urlencoding/CT_CommonParser_Uon$A2.class    |   Bin 0 -> 640 bytes
 .../urlencoding/CT_CommonParser_Uon$A3.class    |   Bin 0 -> 671 bytes
 .../urlencoding/CT_CommonParser_Uon$B.class     |   Bin 0 -> 479 bytes
 .../urlencoding/CT_CommonParser_Uon$C.class     |   Bin 0 -> 1174 bytes
 .../test/urlencoding/CT_CommonParser_Uon.class  |   Bin 0 -> 5683 bytes
 .../CT_CommonParser_UrlEncoding$1.class         |   Bin 0 -> 1692 bytes
 .../CT_CommonParser_UrlEncoding$A1.class        |   Bin 0 -> 655 bytes
 .../CT_CommonParser_UrlEncoding$A2.class        |   Bin 0 -> 688 bytes
 .../CT_CommonParser_UrlEncoding$A3.class        |   Bin 0 -> 703 bytes
 .../CT_CommonParser_UrlEncoding$B.class         |   Bin 0 -> 511 bytes
 .../CT_CommonParser_UrlEncoding$C.class         |   Bin 0 -> 1230 bytes
 .../CT_CommonParser_UrlEncoding.class           |   Bin 0 -> 7086 bytes
 .../core/test/urlencoding/CT_Common_Uon$A.class |   Bin 0 -> 642 bytes
 .../test/urlencoding/CT_Common_Uon$B$1.class    |   Bin 0 -> 959 bytes
 .../core/test/urlencoding/CT_Common_Uon$B.class |   Bin 0 -> 959 bytes
 .../test/urlencoding/CT_Common_Uon$C$1.class    |   Bin 0 -> 890 bytes
 .../core/test/urlencoding/CT_Common_Uon$C.class |   Bin 0 -> 938 bytes
 .../core/test/urlencoding/CT_Common_Uon$D.class |   Bin 0 -> 839 bytes
 .../test/urlencoding/CT_Common_Uon$E1$1.class   |   Bin 0 -> 957 bytes
 .../test/urlencoding/CT_Common_Uon$E1$2.class   |   Bin 0 -> 913 bytes
 .../test/urlencoding/CT_Common_Uon$E1$3.class   |   Bin 0 -> 1043 bytes
 .../test/urlencoding/CT_Common_Uon$E1.class     |   Bin 0 -> 1870 bytes
 .../test/urlencoding/CT_Common_Uon$E2.class     |   Bin 0 -> 502 bytes
 .../core/test/urlencoding/CT_Common_Uon$F.class |   Bin 0 -> 755 bytes
 .../core/test/urlencoding/CT_Common_Uon$G.class |   Bin 0 -> 607 bytes
 .../test/urlencoding/CT_Common_Uon$R1.class     |   Bin 0 -> 638 bytes
 .../test/urlencoding/CT_Common_Uon$R2.class     |   Bin 0 -> 638 bytes
 .../test/urlencoding/CT_Common_Uon$R3.class     |   Bin 0 -> 638 bytes
 .../core/test/urlencoding/CT_Common_Uon.class   |   Bin 0 -> 10186 bytes
 .../urlencoding/CT_Common_UrlEncoding$A.class   |   Bin 0 -> 682 bytes
 .../urlencoding/CT_Common_UrlEncoding$B$1.class |   Bin 0 -> 1031 bytes
 .../urlencoding/CT_Common_UrlEncoding$B.class   |   Bin 0 -> 1023 bytes
 .../urlencoding/CT_Common_UrlEncoding$C$1.class |   Bin 0 -> 962 bytes
 .../urlencoding/CT_Common_UrlEncoding$C.class   |   Bin 0 -> 1002 bytes
 .../urlencoding/CT_Common_UrlEncoding$D.class   |   Bin 0 -> 903 bytes
 .../CT_Common_UrlEncoding$E1$1.class            |   Bin 0 -> 1013 bytes
 .../CT_Common_UrlEncoding$E1$2.class            |   Bin 0 -> 985 bytes
 .../CT_Common_UrlEncoding$E1$3.class            |   Bin 0 -> 1099 bytes
 .../urlencoding/CT_Common_UrlEncoding$E1.class  |   Bin 0 -> 1966 bytes
 .../urlencoding/CT_Common_UrlEncoding$E2.class  |   Bin 0 -> 534 bytes
 .../urlencoding/CT_Common_UrlEncoding$F.class   |   Bin 0 -> 795 bytes
 .../urlencoding/CT_Common_UrlEncoding$G.class   |   Bin 0 -> 639 bytes
 .../urlencoding/CT_Common_UrlEncoding$R1.class  |   Bin 0 -> 686 bytes
 .../urlencoding/CT_Common_UrlEncoding$R2.class  |   Bin 0 -> 686 bytes
 .../urlencoding/CT_Common_UrlEncoding$R3.class  |   Bin 0 -> 686 bytes
 .../urlencoding/CT_Common_UrlEncoding.class     |   Bin 0 -> 10551 bytes
 .../core/test/urlencoding/CT_UonParser$A.class  |   Bin 0 -> 474 bytes
 .../core/test/urlencoding/CT_UonParser.class    |   Bin 0 -> 10264 bytes
 .../CT_UonParserReader$SlowStringReader.class   |   Bin 0 -> 1014 bytes
 .../test/urlencoding/CT_UonParserReader.class   |   Bin 0 -> 4216 bytes
 .../test/urlencoding/CT_UonSerializer.class     |   Bin 0 -> 10538 bytes
 .../urlencoding/CT_UrlEncodingParser$A.class    |   Bin 0 -> 506 bytes
 .../urlencoding/CT_UrlEncodingParser$B.class    |   Bin 0 -> 516 bytes
 .../urlencoding/CT_UrlEncodingParser$C.class    |   Bin 0 -> 552 bytes
 .../urlencoding/CT_UrlEncodingParser$C1.class   |   Bin 0 -> 493 bytes
 .../urlencoding/CT_UrlEncodingParser$D.class    |   Bin 0 -> 761 bytes
 .../urlencoding/CT_UrlEncodingParser$D1.class   |   Bin 0 -> 507 bytes
 .../urlencoding/CT_UrlEncodingParser$D2.class   |   Bin 0 -> 507 bytes
 .../urlencoding/CT_UrlEncodingParser$E.class    |   Bin 0 -> 526 bytes
 .../test/urlencoding/CT_UrlEncodingParser.class |   Bin 0 -> 19993 bytes
 .../urlencoding/CT_UrlEncodingSerializer.class  |   Bin 0 -> 10141 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$A.class |   Bin 0 -> 653 bytes
 .../juno/core/test/urlencoding/DTOs$B$1.class   |   Bin 0 -> 679 bytes
 .../juno/core/test/urlencoding/DTOs$B$10.class  |   Bin 0 -> 930 bytes
 .../juno/core/test/urlencoding/DTOs$B$2.class   |   Bin 0 -> 738 bytes
 .../juno/core/test/urlencoding/DTOs$B$3.class   |   Bin 0 -> 740 bytes
 .../juno/core/test/urlencoding/DTOs$B$4.class   |   Bin 0 -> 809 bytes
 .../juno/core/test/urlencoding/DTOs$B$5.class   |   Bin 0 -> 928 bytes
 .../juno/core/test/urlencoding/DTOs$B$6.class   |   Bin 0 -> 679 bytes
 .../juno/core/test/urlencoding/DTOs$B$7.class   |   Bin 0 -> 738 bytes
 .../juno/core/test/urlencoding/DTOs$B$8.class   |   Bin 0 -> 740 bytes
 .../juno/core/test/urlencoding/DTOs$B$9.class   |   Bin 0 -> 809 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$B.class |   Bin 0 -> 5493 bytes
 .../juno/core/test/urlencoding/DTOs$C$1.class   |   Bin 0 -> 679 bytes
 .../juno/core/test/urlencoding/DTOs$C$10.class  |   Bin 0 -> 930 bytes
 .../juno/core/test/urlencoding/DTOs$C$2.class   |   Bin 0 -> 738 bytes
 .../juno/core/test/urlencoding/DTOs$C$3.class   |   Bin 0 -> 740 bytes
 .../juno/core/test/urlencoding/DTOs$C$4.class   |   Bin 0 -> 809 bytes
 .../juno/core/test/urlencoding/DTOs$C$5.class   |   Bin 0 -> 928 bytes
 .../juno/core/test/urlencoding/DTOs$C$6.class   |   Bin 0 -> 679 bytes
 .../juno/core/test/urlencoding/DTOs$C$7.class   |   Bin 0 -> 738 bytes
 .../juno/core/test/urlencoding/DTOs$C$8.class   |   Bin 0 -> 740 bytes
 .../juno/core/test/urlencoding/DTOs$C$9.class   |   Bin 0 -> 809 bytes
 .../ibm/juno/core/test/urlencoding/DTOs$C.class |   Bin 0 -> 2739 bytes
 .../ibm/juno/core/test/urlencoding/DTOs.class   |   Bin 0 -> 507 bytes
 .../com/ibm/juno/core/test/utils/CT_Args.class  |   Bin 0 -> 1714 bytes
 .../juno/core/test/utils/CT_ArrayUtils.class    |   Bin 0 -> 3779 bytes
 .../core/test/utils/CT_ByteArrayCache.class     |   Bin 0 -> 1358 bytes
 .../test/utils/CT_ByteArrayInOutStream.class    |   Bin 0 -> 1335 bytes
 .../ibm/juno/core/test/utils/CT_CharSet.class   |   Bin 0 -> 810 bytes
 .../juno/core/test/utils/CT_ClassUtils$A.class  |   Bin 0 -> 221 bytes
 .../juno/core/test/utils/CT_ClassUtils$A1.class |   Bin 0 -> 476 bytes
 .../juno/core/test/utils/CT_ClassUtils$A2.class |   Bin 0 -> 454 bytes
 .../juno/core/test/utils/CT_ClassUtils.class    |   Bin 0 -> 3207 bytes
 .../core/test/utils/CT_CollectionUtils.class    |   Bin 0 -> 979 bytes
 .../juno/core/test/utils/CT_FilteredMap.class   |   Bin 0 -> 1757 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$1.class  |   Bin 0 -> 942 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$2.class  |   Bin 0 -> 942 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$3.class  |   Bin 0 -> 942 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$4.class  |   Bin 0 -> 1034 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe$5.class  |   Bin 0 -> 942 bytes
 .../test/utils/CT_IOPipe$TestInputStream.class  |   Bin 0 -> 743 bytes
 .../test/utils/CT_IOPipe$TestOutputStream.class |   Bin 0 -> 911 bytes
 .../core/test/utils/CT_IOPipe$TestReader.class  |   Bin 0 -> 593 bytes
 .../core/test/utils/CT_IOPipe$TestWriter.class  |   Bin 0 -> 533 bytes
 .../ibm/juno/core/test/utils/CT_IOPipe.class    |   Bin 0 -> 4869 bytes
 .../test/utils/CT_IOUtils$TestInputStream.class |   Bin 0 -> 747 bytes
 .../utils/CT_IOUtils$TestOutputStream.class     |   Bin 0 -> 915 bytes
 .../core/test/utils/CT_IOUtils$TestReader.class |   Bin 0 -> 597 bytes
 .../core/test/utils/CT_IOUtils$TestWriter.class |   Bin 0 -> 537 bytes
 .../ibm/juno/core/test/utils/CT_IOUtils.class   |   Bin 0 -> 1472 bytes
 .../juno/core/test/utils/CT_IdentityList.class  |   Bin 0 -> 1038 bytes
 .../juno/core/test/utils/CT_KeywordStore.class  |   Bin 0 -> 1358 bytes
 .../juno/core/test/utils/CT_MultiIterable.class |   Bin 0 -> 2098 bytes
 .../ibm/juno/core/test/utils/CT_MultiSet.class  |   Bin 0 -> 3472 bytes
 .../juno/core/test/utils/CT_ParserReader.class  |   Bin 0 -> 1355 bytes
 .../core/test/utils/CT_PojoIntrospector.class   |   Bin 0 -> 1614 bytes
 .../juno/core/test/utils/CT_PojoQuery$1.class   |   Bin 0 -> 966 bytes
 .../juno/core/test/utils/CT_PojoQuery$2.class   |   Bin 0 -> 916 bytes
 .../juno/core/test/utils/CT_PojoQuery$3.class   |   Bin 0 -> 969 bytes
 .../juno/core/test/utils/CT_PojoQuery$4.class   |   Bin 0 -> 966 bytes
 .../juno/core/test/utils/CT_PojoQuery$5.class   |   Bin 0 -> 961 bytes
 .../juno/core/test/utils/CT_PojoQuery$A.class   |   Bin 0 -> 731 bytes
 .../juno/core/test/utils/CT_PojoQuery$B.class   |   Bin 0 -> 1082 bytes
 .../juno/core/test/utils/CT_PojoQuery$C.class   |   Bin 0 -> 697 bytes
 .../juno/core/test/utils/CT_PojoQuery$D1.class  |   Bin 0 -> 864 bytes
 .../juno/core/test/utils/CT_PojoQuery$D2.class  |   Bin 0 -> 734 bytes
 .../juno/core/test/utils/CT_PojoQuery$E.class   |   Bin 0 -> 827 bytes
 .../core/test/utils/CT_PojoQuery$F1$1.class     |   Bin 0 -> 1311 bytes
 .../juno/core/test/utils/CT_PojoQuery$F1.class  |   Bin 0 -> 1537 bytes
 .../juno/core/test/utils/CT_PojoQuery$F2.class  |   Bin 0 -> 767 bytes
 .../juno/core/test/utils/CT_PojoQuery$G.class   |   Bin 0 -> 827 bytes
 .../core/test/utils/CT_PojoQuery$H1$1.class     |   Bin 0 -> 1311 bytes
 .../juno/core/test/utils/CT_PojoQuery$H1.class  |   Bin 0 -> 1537 bytes
 .../juno/core/test/utils/CT_PojoQuery$H2.class  |   Bin 0 -> 767 bytes
 .../juno/core/test/utils/CT_PojoQuery$I.class   |   Bin 0 -> 996 bytes
 .../ibm/juno/core/test/utils/CT_PojoQuery.class |   Bin 0 -> 12855 bytes
 .../juno/core/test/utils/CT_PojoRest$A.class    |   Bin 0 -> 1684 bytes
 .../core/test/utils/CT_PojoRest$Address.class   |   Bin 0 -> 1270 bytes
 .../test/utils/CT_PojoRest$AddressBook.class    |   Bin 0 -> 1118 bytes
 .../core/test/utils/CT_PojoRest$Person.class    |   Bin 0 -> 1188 bytes
 .../ibm/juno/core/test/utils/CT_PojoRest.class  |   Bin 0 -> 20556 bytes
 .../ibm/juno/core/test/utils/CT_SimpleMap.class |   Bin 0 -> 2065 bytes
 .../test/utils/CT_StringBuilderWriter.class     |   Bin 0 -> 1805 bytes
 .../test/utils/CT_StringUtils$BadNumber.class   |   Bin 0 -> 437 bytes
 .../juno/core/test/utils/CT_StringUtils.class   |   Bin 0 -> 14393 bytes
 .../test/utils/CT_StringVarResolver$1.class     |   Bin 0 -> 984 bytes
 .../test/utils/CT_StringVarResolver$2.class     |   Bin 0 -> 985 bytes
 .../test/utils/CT_StringVarResolver$3.class     |   Bin 0 -> 992 bytes
 .../test/utils/CT_StringVarResolver$4.class     |   Bin 0 -> 1000 bytes
 .../test/utils/CT_StringVarResolver$5.class     |   Bin 0 -> 907 bytes
 .../test/utils/CT_StringVarResolver$6.class     |   Bin 0 -> 796 bytes
 .../test/utils/CT_StringVarResolver$7.class     |   Bin 0 -> 796 bytes
 .../core/test/utils/CT_StringVarResolver.class  |   Bin 0 -> 5788 bytes
 .../ibm/juno/core/test/xml/CT_Common$A.class    |   Bin 0 -> 590 bytes
 .../ibm/juno/core/test/xml/CT_Common$B$1.class  |   Bin 0 -> 859 bytes
 .../ibm/juno/core/test/xml/CT_Common$B.class    |   Bin 0 -> 871 bytes
 .../ibm/juno/core/test/xml/CT_Common$C$1.class  |   Bin 0 -> 790 bytes
 .../ibm/juno/core/test/xml/CT_Common$C.class    |   Bin 0 -> 850 bytes
 .../ibm/juno/core/test/xml/CT_Common$D.class    |   Bin 0 -> 751 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$1.class |   Bin 0 -> 881 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$2.class |   Bin 0 -> 813 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1$3.class |   Bin 0 -> 967 bytes
 .../ibm/juno/core/test/xml/CT_Common$E1.class   |   Bin 0 -> 1751 bytes
 .../ibm/juno/core/test/xml/CT_Common$E2.class   |   Bin 0 -> 696 bytes
 .../ibm/juno/core/test/xml/CT_Common$G.class    |   Bin 0 -> 567 bytes
 .../ibm/juno/core/test/xml/CT_Common$R1.class   |   Bin 0 -> 574 bytes
 .../ibm/juno/core/test/xml/CT_Common$R2.class   |   Bin 0 -> 574 bytes
 .../ibm/juno/core/test/xml/CT_Common$R3.class   |   Bin 0 -> 574 bytes
 .../juno/core/test/xml/CT_Common$Test7b.class   |   Bin 0 -> 723 bytes
 .../com/ibm/juno/core/test/xml/CT_Common.class  |   Bin 0 -> 10193 bytes
 .../juno/core/test/xml/CT_CommonParser$1.class  |   Bin 0 -> 1580 bytes
 .../juno/core/test/xml/CT_CommonParser$A1.class |   Bin 0 -> 543 bytes
 .../juno/core/test/xml/CT_CommonParser$A2.class |   Bin 0 -> 576 bytes
 .../juno/core/test/xml/CT_CommonParser$A3.class |   Bin 0 -> 631 bytes
 .../juno/core/test/xml/CT_CommonParser$B.class  |   Bin 0 -> 439 bytes
 .../juno/core/test/xml/CT_CommonParser$C.class  |   Bin 0 -> 1098 bytes
 .../juno/core/test/xml/CT_CommonParser.class    |   Bin 0 -> 6486 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml$A.class |   Bin 0 -> 1014 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml$B.class |   Bin 0 -> 1053 bytes
 .../ibm/juno/core/test/xml/CT_CommonXml.class   |   Bin 0 -> 2378 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$A.class   |   Bin 0 -> 514 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$B1.class  |   Bin 0 -> 409 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$B2.class  |   Bin 0 -> 411 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C1.class  |   Bin 0 -> 297 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C2.class  |   Bin 0 -> 435 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$C3.class  |   Bin 0 -> 451 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$D.class   |   Bin 0 -> 546 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$E.class   |   Bin 0 -> 514 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$F.class   |   Bin 0 -> 543 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$G.class   |   Bin 0 -> 614 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$H.class   |   Bin 0 -> 576 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$I.class   |   Bin 0 -> 623 bytes
 .../ibm/juno/core/test/xml/CT_Xml$J1$1.class    |   Bin 0 -> 786 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$J1.class  |   Bin 0 -> 863 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$J2.class  |   Bin 0 -> 549 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$K.class   |   Bin 0 -> 493 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$L.class   |   Bin 0 -> 630 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$M.class   |   Bin 0 -> 788 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$N.class   |   Bin 0 -> 985 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$O.class   |   Bin 0 -> 1020 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$P.class   |   Bin 0 -> 1017 bytes
 .../ibm/juno/core/test/xml/CT_Xml$Person1.class |   Bin 0 -> 890 bytes
 .../com/ibm/juno/core/test/xml/CT_Xml$Q.class   |   Bin 0 -> 1022 bytes
 .../bin/com/ibm/juno/core/test/xml/CT_Xml.class |   Bin 0 -> 25353 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$1.class  |   Bin 0 -> 726 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$10.class |   Bin 0 -> 740 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$2.class  |   Bin 0 -> 726 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$3.class  |   Bin 0 -> 740 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$4.class  |   Bin 0 -> 740 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$5.class  |   Bin 0 -> 722 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$6.class  |   Bin 0 -> 722 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$7.class  |   Bin 0 -> 712 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$8.class  |   Bin 0 -> 712 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$9.class  |   Bin 0 -> 738 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$A.class  |   Bin 0 -> 969 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$B.class  |   Bin 0 -> 818 bytes
 .../core/test/xml/CT_XmlCollapsed$C$1.class     |   Bin 0 -> 763 bytes
 .../core/test/xml/CT_XmlCollapsed$C$2.class     |   Bin 0 -> 763 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$C.class  |   Bin 0 -> 1155 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$D.class  |   Bin 0 -> 2266 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$E.class  |   Bin 0 -> 1699 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$F1.class |   Bin 0 -> 826 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FA.class |   Bin 0 -> 1149 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FB.class |   Bin 0 -> 989 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$FC.class |   Bin 0 -> 982 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$G.class  |   Bin 0 -> 1168 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$H.class  |   Bin 0 -> 952 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$H1.class |   Bin 0 -> 587 bytes
 .../juno/core/test/xml/CT_XmlCollapsed$I.class  |   Bin 0 -> 975 bytes
 .../juno/core/test/xml/CT_XmlCollapsed.class    |   Bin 0 -> 7941 bytes
 .../juno/core/test/xml/CT_XmlContent$A.class    |   Bin 0 -> 838 bytes
 .../juno/core/test/xml/CT_XmlContent$B.class    |   Bin 0 -> 925 bytes
 .../xml/CT_XmlContent$BContentHandler.class     |   Bin 0 -> 1966 bytes
 .../juno/core/test/xml/CT_XmlContent$C1.class   |   Bin 0 -> 626 bytes
 .../ibm/juno/core/test/xml/CT_XmlContent.class  |   Bin 0 -> 5736 bytes
 .../ibm/juno/core/test/xml/CT_XmlParser.class   |   Bin 0 -> 2970 bytes
 .../core/test/xml/testComparisonWithJson.json   |    17 +
 .../core/test/xml/testComparisonWithJson.xml    |    17 +
 .../ibm/juno/core/test/xml/testNamespaces.xml   |    17 +
 .../com/ibm/juno/core/test/xml/xml1a/T1.class   |   Bin 0 -> 1152 bytes
 .../com/ibm/juno/core/test/xml/xml1a/T2.class   |   Bin 0 -> 1169 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T3.class   |   Bin 0 -> 1111 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T4.class   |   Bin 0 -> 1140 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T5.class   |   Bin 0 -> 1169 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T6.class   |   Bin 0 -> 1152 bytes
 .../com/ibm/juno/core/test/xml/xml1b/T7.class   |   Bin 0 -> 1270 bytes
 .../juno/core/test/xml/xml1b/package-info.class |   Bin 0 -> 273 bytes
 .../com/ibm/juno/core/test/xml/xml1c/T8.class   |   Bin 0 -> 789 bytes
 .../com/ibm/juno/core/test/xml/xml1c/T9.class   |   Bin 0 -> 499 bytes
 .../juno/core/test/xml/xml1c/package-info.class |   Bin 0 -> 478 bytes
 .../PrimitiveAtomicObjectsBean$1.class          |   Bin 0 -> 909 bytes
 .../PrimitiveAtomicObjectsBean$2.class          |   Bin 0 -> 903 bytes
 .../testbeans/PrimitiveAtomicObjectsBean.class  |   Bin 0 -> 2058 bytes
 .../juno/testbeans/PrimitiveObjectsBean$1.class |   Bin 0 -> 836 bytes
 .../testbeans/PrimitiveObjectsBean$10.class     |   Bin 0 -> 852 bytes
 .../testbeans/PrimitiveObjectsBean$11.class     |   Bin 0 -> 852 bytes
 .../juno/testbeans/PrimitiveObjectsBean$2.class |   Bin 0 -> 834 bytes
 .../juno/testbeans/PrimitiveObjectsBean$3.class |   Bin 0 -> 850 bytes
 .../juno/testbeans/PrimitiveObjectsBean$4.class |   Bin 0 -> 837 bytes
 .../juno/testbeans/PrimitiveObjectsBean$5.class |   Bin 0 -> 843 bytes
 .../juno/testbeans/PrimitiveObjectsBean$6.class |   Bin 0 -> 834 bytes
 .../juno/testbeans/PrimitiveObjectsBean$7.class |   Bin 0 -> 837 bytes
 .../juno/testbeans/PrimitiveObjectsBean$8.class |   Bin 0 -> 840 bytes
 .../juno/testbeans/PrimitiveObjectsBean$9.class |   Bin 0 -> 842 bytes
 .../juno/testbeans/PrimitiveObjectsBean.class   |   Bin 0 -> 6575 bytes
 .../ibm/juno/testbeans/TestURI$TestURIb.class   |   Bin 0 -> 571 bytes
 .../bin/com/ibm/juno/testbeans/TestURI.class    |   Bin 0 -> 1280 bytes
 com.ibm.team.juno.test/build.properties         |    16 +
 .../src/com/ibm/juno/core/test/AllTests.java    |   128 +
 .../com/ibm/juno/core/test/CT_Annotations.java  |    80 +
 .../com/ibm/juno/core/test/CT_BeanContext.java  |   846 ++
 .../com/ibm/juno/core/test/CT_BeanFilter.java   |   141 +
 .../src/com/ibm/juno/core/test/CT_BeanMap.java  |  1887 +++
 .../com/ibm/juno/core/test/CT_ClassMeta.java    |   279 +
 .../juno/core/test/CT_DataConversionTest.java   |   143 +
 .../ibm/juno/core/test/CT_IgnoredClasses.java   |    69 +
 .../com/ibm/juno/core/test/CT_JacocoDummy.java  |    47 +
 .../com/ibm/juno/core/test/CT_ObjectList.java   |    96 +
 .../com/ibm/juno/core/test/CT_ObjectMap.java    |   311 +
 .../ibm/juno/core/test/CT_ParserGenerics.java   |    68 +
 .../com/ibm/juno/core/test/CT_ParserReader.java |   178 +
 .../com/ibm/juno/core/test/CT_PojoFilter.java   |    54 +
 .../core/test/CT_PropertyNamerDashedLC.java     |    37 +
 .../com/ibm/juno/core/test/CT_Visibility.java   |   166 +
 .../src/com/ibm/juno/core/test/TestUtils.java   |   330 +
 .../ibm/juno/core/test/XmlValidatorParser.java  |    81 +
 .../src/com/ibm/juno/core/test/a/A1.java        |   182 +
 .../a/rttests/CT_RoundTripAddClassAttrs.java    |   339 +
 .../a/rttests/CT_RoundTripBeanInheritance.java  |   216 +
 .../test/a/rttests/CT_RoundTripBeanMaps.java    |  1010 ++
 .../core/test/a/rttests/CT_RoundTripDTOs.java   |    48 +
 .../core/test/a/rttests/CT_RoundTripEnum.java   |   243 +
 .../test/a/rttests/CT_RoundTripFilterBeans.java |   379 +
 .../test/a/rttests/CT_RoundTripGenerics.java    |    92 +
 .../a/rttests/CT_RoundTripLargeObjects.java     |   183 +
 .../core/test/a/rttests/CT_RoundTripMaps.java   |   211 +
 .../a/rttests/CT_RoundTripObjectsAsStrings.java |   268 +
 .../CT_RoundTripObjectsWithSpecialMethods.java  |   112 +
 .../CT_RoundTripPrimitiveObjectBeans.java       |   194 +
 .../a/rttests/CT_RoundTripPrimitivesBeans.java  |   364 +
 .../a/rttests/CT_RoundTripReadOnlyBeans.java    |    97 +
 .../a/rttests/CT_RoundTripSimpleObjects.java    |   747 +
 .../a/rttests/CT_RoundTripToObjectMaps.java     |    75 +
 .../test/a/rttests/CT_RoundTripTrimStrings.java |    95 +
 .../juno/core/test/a/rttests/RoundTripTest.java |   288 +
 .../src/com/ibm/juno/core/test/csv/CT_Csv.java  |    48 +
 .../ibm/juno/core/test/dto/atom/CT_Atom.java    |    99 +
 .../com/ibm/juno/core/test/dto/atom/test1.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test2.xml   |    46 +
 .../com/ibm/juno/core/test/dto/atom/test3.xml   |    46 +
 .../juno/core/test/dto/cognos/CT_CognosXml.java |   104 +
 .../core/test/dto/jsonschema/CT_JsonSchema.java |   101 +
 .../juno/core/test/dto/jsonschema/test1.json    |    77 +
 .../juno/core/test/dto/jsonschema/test2.json    |    20 +
 .../juno/core/test/filters/CT_BeanFilter.java   |   201 +
 .../ibm/juno/core/test/filters/CT_BeanMap.java  |    94 +
 .../test/filters/CT_ByteArrayBase64Filter.java  |   170 +
 .../core/test/filters/CT_CalendarFilter.java    |   693 +
 .../juno/core/test/filters/CT_DateFilter.java   |   155 +
 .../core/test/filters/CT_EnumerationFilter.java |    33 +
 .../core/test/filters/CT_IteratorFilter.java    |    35 +
 .../juno/core/test/filters/CT_ReaderFilter.java |    45 +
 .../com/ibm/juno/core/test/html/CT_Common.java  |   488 +
 .../juno/core/test/html/CT_CommonParser.java    |   160 +
 .../com/ibm/juno/core/test/html/CT_Html.java    |   246 +
 .../ibm/juno/core/test/ini/CT_ConfigFile.java   |  2132 +++
 .../ibm/juno/core/test/ini/CT_ConfigMgr.java    |   200 +
 .../com/ibm/juno/core/test/jena/CT_Common.java  |   483 +
 .../juno/core/test/jena/CT_CommonParser.java    |   206 +
 .../ibm/juno/core/test/jena/CT_CommonXml.java   |    93 +
 .../src/com/ibm/juno/core/test/jena/CT_Rdf.java |   596 +
 .../ibm/juno/core/test/jena/CT_RdfParser.java   |   148 +
 .../juno/core/test/json/BrokenCognosOutput.txt  |     1 +
 .../com/ibm/juno/core/test/json/CT_Common.java  |   484 +
 .../juno/core/test/json/CT_CommonParser.java    |   178 +
 .../com/ibm/juno/core/test/json/CT_Json.java    |   306 +
 .../ibm/juno/core/test/json/CT_JsonParser.java  |   330 +
 .../ibm/juno/core/test/json/CT_JsonSchema.java  |    42 +
 .../test/urlencoding/CT_CommonParser_Uon.java   |   166 +
 .../CT_CommonParser_UrlEncoding.java            |   183 +
 .../core/test/urlencoding/CT_Common_Uon.java    |   429 +
 .../test/urlencoding/CT_Common_UrlEncoding.java |   431 +
 .../core/test/urlencoding/CT_UonParser.java     |   540 +
 .../test/urlencoding/CT_UonParserReader.java    |   215 +
 .../core/test/urlencoding/CT_UonSerializer.java |   458 +
 .../test/urlencoding/CT_UrlEncodingParser.java  |   998 ++
 .../urlencoding/CT_UrlEncodingSerializer.java   |   495 +
 .../ibm/juno/core/test/urlencoding/DTOs.java    |   132 +
 .../com/ibm/juno/core/test/utils/CT_Args.java   |    68 +
 .../ibm/juno/core/test/utils/CT_ArrayUtils.java |   155 +
 .../juno/core/test/utils/CT_ByteArrayCache.java |    57 +
 .../test/utils/CT_ByteArrayInOutStream.java     |    31 +
 .../ibm/juno/core/test/utils/CT_CharSet.java    |    31 +
 .../ibm/juno/core/test/utils/CT_ClassUtils.java |   106 +
 .../core/test/utils/CT_CollectionUtils.java     |    31 +
 .../juno/core/test/utils/CT_FilteredMap.java    |    41 +
 .../com/ibm/juno/core/test/utils/CT_IOPipe.java |   279 +
 .../ibm/juno/core/test/utils/CT_IOUtils.java    |   100 +
 .../juno/core/test/utils/CT_IdentityList.java   |    35 +
 .../juno/core/test/utils/CT_KeywordStore.java   |    42 +
 .../juno/core/test/utils/CT_MultiIterable.java  |    67 +
 .../ibm/juno/core/test/utils/CT_MultiSet.java   |   140 +
 .../juno/core/test/utils/CT_ParserReader.java   |    47 +
 .../core/test/utils/CT_PojoIntrospector.java    |    51 +
 .../ibm/juno/core/test/utils/CT_PojoQuery.java  |   678 +
 .../ibm/juno/core/test/utils/CT_PojoRest.java   |   850 ++
 .../ibm/juno/core/test/utils/CT_SimpleMap.java  |    45 +
 .../core/test/utils/CT_StringBuilderWriter.java |    56 +
 .../juno/core/test/utils/CT_StringUtils.java    |   646 +
 .../core/test/utils/CT_StringVarResolver.java   |   301 +
 .../com/ibm/juno/core/test/xml/CT_Common.java   |   438 +
 .../ibm/juno/core/test/xml/CT_CommonParser.java |   176 +
 .../ibm/juno/core/test/xml/CT_CommonXml.java    |    79 +
 .../src/com/ibm/juno/core/test/xml/CT_Xml.java  |  1048 ++
 .../ibm/juno/core/test/xml/CT_XmlCollapsed.java |   453 +
 .../ibm/juno/core/test/xml/CT_XmlContent.java   |   287 +
 .../ibm/juno/core/test/xml/CT_XmlParser.java    |    93 +
 .../core/test/xml/testComparisonWithJson.json   |    17 +
 .../core/test/xml/testComparisonWithJson.xml    |    17 +
 .../ibm/juno/core/test/xml/testNamespaces.xml   |    17 +
 .../com/ibm/juno/core/test/xml/xml1a/T1.java    |    31 +
 .../com/ibm/juno/core/test/xml/xml1a/T2.java    |    31 +
 .../com/ibm/juno/core/test/xml/xml1b/T3.java    |    30 +
 .../com/ibm/juno/core/test/xml/xml1b/T4.java    |    31 +
 .../com/ibm/juno/core/test/xml/xml1b/T5.java    |    31 +
 .../com/ibm/juno/core/test/xml/xml1b/T6.java    |    31 +
 .../com/ibm/juno/core/test/xml/xml1b/T7.java    |    31 +
 .../juno/core/test/xml/xml1b/package-info.java  |    13 +
 .../com/ibm/juno/core/test/xml/xml1c/T8.java    |    28 +
 .../com/ibm/juno/core/test/xml/xml1c/T9.java    |    19 +
 .../juno/core/test/xml/xml1c/package-info.java  |    22 +
 .../testbeans/PrimitiveAtomicObjectsBean.java   |    74 +
 .../juno/testbeans/PrimitiveObjectsBean.java    |   194 +
 .../src/com/ibm/juno/testbeans/TestURI.java     |    54 +
 com.ibm.team.juno/.DS_Store                     |   Bin 0 -> 6148 bytes
 com.ibm.team.juno/.classpath                    |     8 +
 com.ibm.team.juno/.gitignore                    |     1 +
 com.ibm.team.juno/.project                      |    26 +
 .../.settings/com.ibm.etools.references.prefs   |     4 +
 ...ibm.etools.webtools.packagepreferences.prefs |     3 +
 .../.settings/org.eclipse.core.resources.prefs  |     2 +
 .../.settings/org.eclipse.jdt.apt.core.prefs    |     2 +
 .../.settings/org.eclipse.jdt.core.prefs        |   401 +
 .../.settings/org.eclipse.jdt.ui.prefs          |   120 +
 .../org.eclipse.ltk.core.refactoring.prefs      |     3 +
 .../.settings/org.eclipse.pde.core.prefs        |     3 +
 .../.settings/org.eclipse.pde.prefs             |    15 +
 .../.settings/org.eclipse.wst.common.component  |     5 +
 ...rg.eclipse.wst.common.project.facet.core.xml |    15 +
 .../.settings/org.eclipse.wst.html.core.prefs   |    37 +
 .../.settings/org.eclipse.wst.validation.prefs  |     9 +
 com.ibm.team.juno/META-INF/MANIFEST.MF          |    39 +
 .../OSGI-INF/l10n/plugin.properties             |    14 +
 com.ibm.team.juno/build.properties              |    18 +
 com.ibm.team.juno/lib/jena/jena-core-2.7.1.jar  |   Bin 0 -> 1727026 bytes
 com.ibm.team.juno/src/com/.DS_Store             |   Bin 0 -> 6148 bytes
 com.ibm.team.juno/src/com/ibm/.DS_Store         |   Bin 0 -> 6148 bytes
 com.ibm.team.juno/src/com/ibm/juno/.DS_Store    |   Bin 0 -> 6148 bytes
 .../src/com/ibm/juno/core/.DS_Store             |   Bin 0 -> 10244 bytes
 .../src/com/ibm/juno/core/BeanContext.java      |  1808 +++
 .../com/ibm/juno/core/BeanContextFactory.java   |   454 +
 .../ibm/juno/core/BeanContextProperties.java    |   188 +
 .../src/com/ibm/juno/core/BeanMap.java          |   461 +
 .../src/com/ibm/juno/core/BeanMapEntry.java     |   121 +
 .../src/com/ibm/juno/core/BeanMeta.java         |   749 +
 .../src/com/ibm/juno/core/BeanMetaFiltered.java |    70 +
 .../src/com/ibm/juno/core/BeanPropertyMeta.java |   803 ++
 .../juno/core/BeanProxyInvocationHandler.java   |    78 +
 .../com/ibm/juno/core/BeanRuntimeException.java |    62 +
 .../src/com/ibm/juno/core/ClassMeta.java        |  1262 ++
 .../src/com/ibm/juno/core/CoreApi.java          |   172 +
 .../src/com/ibm/juno/core/Delegate.java         |    29 +
 .../com/ibm/juno/core/FormattedException.java   |    53 +
 .../juno/core/FormattedRuntimeException.java    |    44 +
 .../core/InvalidDataConversionException.java    |    33 +
 .../src/com/ibm/juno/core/Lockable.java         |    84 +
 .../src/com/ibm/juno/core/LockedException.java  |    28 +
 .../src/com/ibm/juno/core/MediaRange.java       |   312 +
 .../src/com/ibm/juno/core/ObjectList.java       |   569 +
 .../src/com/ibm/juno/core/ObjectMap.java        |  1403 ++
 .../src/com/ibm/juno/core/PropertyNamer.java    |    31 +
 .../ibm/juno/core/PropertyNamerDashedLC.java    |    62 +
 .../com/ibm/juno/core/PropertyNamerDefault.java |    35 +
 .../src/com/ibm/juno/core/Streamable.java       |    38 +
 .../src/com/ibm/juno/core/Visibility.java       |   195 +
 .../src/com/ibm/juno/core/Writable.java         |    38 +
 .../src/com/ibm/juno/core/annotation/Bean.java  |   216 +
 .../juno/core/annotation/BeanConstructor.java   |    82 +
 .../ibm/juno/core/annotation/BeanIgnore.java    |    34 +
 .../ibm/juno/core/annotation/BeanProperty.java  |   182 +
 .../ibm/juno/core/annotation/BeanSubType.java   |    42 +
 .../com/ibm/juno/core/annotation/Consumes.java  |    69 +
 .../com/ibm/juno/core/annotation/Filter.java    |    82 +
 .../ibm/juno/core/annotation/NameProperty.java  |    31 +
 .../juno/core/annotation/ParentProperty.java    |    31 +
 .../com/ibm/juno/core/annotation/Produces.java  |    82 +
 .../ibm/juno/core/annotation/Remoteable.java    |    23 +
 .../ibm/juno/core/annotation/ThreadSafe.java    |    25 +
 .../src/com/ibm/juno/core/annotation/URI.java   |    64 +
 .../com/ibm/juno/core/annotation/package.html   |    34 +
 .../com/ibm/juno/core/csv/CsvSerializer.java    |    90 +
 .../src/com/ibm/juno/core/csv/package.html      |    55 +
 .../ibm/juno/core/doc-files/AddressBook.html    |   106 +
 .../src/com/ibm/juno/core/dto/Link.java         |   133 +
 .../com/ibm/juno/core/dto/ResultSetList.java    |   105 +
 .../com/ibm/juno/core/dto/atom/Category.java    |   137 +
 .../src/com/ibm/juno/core/dto/atom/Common.java  |    84 +
 .../com/ibm/juno/core/dto/atom/CommonEntry.java |   276 +
 .../src/com/ibm/juno/core/dto/atom/Content.java |   144 +
 .../src/com/ibm/juno/core/dto/atom/Entry.java   |   243 +
 .../src/com/ibm/juno/core/dto/atom/Feed.java    |   284 +
 .../com/ibm/juno/core/dto/atom/Generator.java   |   139 +
 .../src/com/ibm/juno/core/dto/atom/Icon.java    |    93 +
 .../src/com/ibm/juno/core/dto/atom/Id.java      |    92 +
 .../src/com/ibm/juno/core/dto/atom/Link.java    |   222 +
 .../src/com/ibm/juno/core/dto/atom/Logo.java    |    93 +
 .../src/com/ibm/juno/core/dto/atom/Person.java  |   131 +
 .../src/com/ibm/juno/core/dto/atom/Source.java  |   223 +
 .../src/com/ibm/juno/core/dto/atom/Text.java    |   179 +
 .../core/dto/atom/doc-files/Example_HTML.png    |   Bin 0 -> 31484 bytes
 .../ibm/juno/core/dto/atom/package-info.java    |    19 +
 .../src/com/ibm/juno/core/dto/atom/package.html |   578 +
 .../com/ibm/juno/core/dto/cognos/Column.java    |   154 +
 .../com/ibm/juno/core/dto/cognos/DataSet.java   |   188 +
 .../ibm/juno/core/dto/cognos/doc-files/HTML.png |   Bin 0 -> 8476 bytes
 .../ibm/juno/core/dto/cognos/doc-files/JSON.png |   Bin 0 -> 6963 bytes
 .../juno/core/dto/cognos/doc-files/RDFXML.png   |   Bin 0 -> 19981 bytes
 .../ibm/juno/core/dto/cognos/package-info.java  |    13 +
 .../com/ibm/juno/core/dto/cognos/package.html   |   170 +
 .../ibm/juno/core/dto/jsonschema/JsonType.java  |   103 +
 .../juno/core/dto/jsonschema/JsonTypeArray.java |    50 +
 .../ibm/juno/core/dto/jsonschema/Sample.java    |    63 +
 .../ibm/juno/core/dto/jsonschema/Schema.java    |  1392 ++
 .../juno/core/dto/jsonschema/SchemaArray.java   |    50 +
 .../ibm/juno/core/dto/jsonschema/SchemaMap.java |   119 +
 .../core/dto/jsonschema/SchemaProperty.java     |    44 +
 .../jsonschema/SchemaPropertySimpleArray.java   |    41 +
 .../ibm/juno/core/dto/jsonschema/SchemaRef.java |    34 +
 .../dto/jsonschema/doc-files/Example_Html.png   |   Bin 0 -> 31260 bytes
 .../dto/jsonschema/doc-files/Example_Json.png   |   Bin 0 -> 22006 bytes
 .../jsonschema/doc-files/Example_Options.png    |   Bin 0 -> 41887 bytes
 .../dto/jsonschema/doc-files/Example_Turtle.png |   Bin 0 -> 28988 bytes
 .../jsonschema/doc-files/Example_UrlEncoded.png |   Bin 0 -> 21715 bytes
 .../dto/jsonschema/doc-files/Example_Xml.png    |   Bin 0 -> 28095 bytes
 .../doc-files/Example_XmlRdfAbbrev.png          |   Bin 0 -> 36296 bytes
 .../ibm/juno/core/dto/jsonschema/package.html   |   511 +
 .../src/com/ibm/juno/core/dto/package.html      |    34 +
 .../src/com/ibm/juno/core/encoders/Encoder.java |    53 +
 .../ibm/juno/core/encoders/EncoderGroup.java    |   195 +
 .../com/ibm/juno/core/encoders/GzipEncoder.java |    44 +
 .../ibm/juno/core/encoders/IdentityEncoder.java |    43 +
 .../src/com/ibm/juno/core/encoders/package.html |    53 +
 .../src/com/ibm/juno/core/filter/.DS_Store      |   Bin 0 -> 6148 bytes
 .../juno/core/filter/AnnotationBeanFilter.java  |    63 +
 .../com/ibm/juno/core/filter/BeanFilter.java    |   472 +
 .../src/com/ibm/juno/core/filter/Filter.java    |   134 +
 .../juno/core/filter/InterfaceBeanFilter.java   |    35 +
 .../com/ibm/juno/core/filter/PojoFilter.java    |   261 +
 .../ibm/juno/core/filter/SurrogateFilter.java   |   203 +
 .../ibm/juno/core/filter/doc-files/classes.dnx  |    99 +
 .../ibm/juno/core/filter/doc-files/classes.png  |   Bin 0 -> 15527 bytes
 .../src/com/ibm/juno/core/filter/package.html   |   764 +
 .../ibm/juno/core/filters/BeanStringFilter.java |    35 +
 .../core/filters/ByteArrayBase64Filter.java     |    47 +
 .../ibm/juno/core/filters/CalendarFilter.java   |   289 +
 .../juno/core/filters/CalendarLongFilter.java   |    52 +
 .../juno/core/filters/CalendarMapFilter.java    |    60 +
 .../com/ibm/juno/core/filters/ClassFilter.java  |    41 +
 .../com/ibm/juno/core/filters/DateFilter.java   |   345 +
 .../ibm/juno/core/filters/DateLongFilter.java   |    48 +
 .../ibm/juno/core/filters/DateMapFilter.java    |    52 +
 .../juno/core/filters/EnumerationFilter.java    |    35 +
 .../ibm/juno/core/filters/IteratorFilter.java   |    35 +
 .../com/ibm/juno/core/filters/ReaderFilter.java |   108 +
 .../filters/XMLGregorianCalendarFilter.java     |    60 +
 .../src/com/ibm/juno/core/filters/package.html  |    59 +
 .../juno/core/html/HtmlBeanPropertyMeta.java    |    86 +
 .../com/ibm/juno/core/html/HtmlClassMeta.java   |    88 +
 .../ibm/juno/core/html/HtmlDocSerializer.java   |   162 +
 .../core/html/HtmlDocSerializerProperties.java  |   165 +
 .../src/com/ibm/juno/core/html/HtmlLink.java    |    45 +
 .../src/com/ibm/juno/core/html/HtmlParser.java  |   743 +
 .../ibm/juno/core/html/HtmlParserContext.java   |    80 +
 .../juno/core/html/HtmlParserProperties.java    |    52 +
 .../juno/core/html/HtmlSchemaDocSerializer.java |   144 +
 .../com/ibm/juno/core/html/HtmlSerializer.java  |   668 +
 .../juno/core/html/HtmlSerializerContext.java   |   116 +
 .../core/html/HtmlSerializerProperties.java     |   113 +
 .../juno/core/html/HtmlSerializerWriter.java    |   329 +
 .../core/html/HtmlStrippedDocSerializer.java    |    55 +
 .../ibm/juno/core/html/SimpleHtmlWriter.java    |    36 +
 .../com/ibm/juno/core/html/annotation/Html.java |    54 +
 .../ibm/juno/core/html/annotation/package.html  |    34 +
 .../core/html/doc-files/HTML_DESCRIPTION.png    |   Bin 0 -> 3644 bytes
 .../ibm/juno/core/html/doc-files/HTML_LINKS.png |   Bin 0 -> 593 bytes
 .../ibm/juno/core/html/doc-files/HTML_TITLE.png |   Bin 0 -> 2435 bytes
 .../com/ibm/juno/core/html/dto/HtmlElement.java |    23 +
 .../src/com/ibm/juno/core/html/dto/Img.java     |    35 +
 .../src/com/ibm/juno/core/html/dto/package.html |    34 +
 .../src/com/ibm/juno/core/html/package.html     |    72 +
 .../src/com/ibm/juno/core/ini/ConfigFile.java   |   789 +
 .../com/ibm/juno/core/ini/ConfigFileFormat.java |    25 +
 .../com/ibm/juno/core/ini/ConfigFileImpl.java   |   740 +
 .../ibm/juno/core/ini/ConfigFileListener.java   |    42 +
 .../ibm/juno/core/ini/ConfigFileWrapped.java    |   273 +
 .../ibm/juno/core/ini/ConfigFileWritable.java   |    40 +
 .../src/com/ibm/juno/core/ini/ConfigMgr.java    |   312 +
 .../src/com/ibm/juno/core/ini/ConfigUtils.java  |    90 +
 .../src/com/ibm/juno/core/ini/Encoder.java      |    35 +
 .../com/ibm/juno/core/ini/EntryListener.java    |    44 +
 .../src/com/ibm/juno/core/ini/Section.java      |   564 +
 .../com/ibm/juno/core/ini/SectionListener.java  |    59 +
 .../src/com/ibm/juno/core/ini/XorEncoder.java   |    46 +
 .../com/ibm/juno/core/ini/doc-files/config1.png |   Bin 0 -> 39851 bytes
 .../com/ibm/juno/core/ini/doc-files/config2.png |   Bin 0 -> 48881 bytes
 .../com/ibm/juno/core/ini/doc-files/config3.png |   Bin 0 -> 59095 bytes
 .../src/com/ibm/juno/core/ini/package.html      |   643 +
 .../src/com/ibm/juno/core/jena/Constants.java   |    91 +
 .../ibm/juno/core/jena/RdfBeanPropertyMeta.java |    78 +
 .../com/ibm/juno/core/jena/RdfClassMeta.java    |    82 +
 .../ibm/juno/core/jena/RdfCollectionFormat.java |    52 +
 .../src/com/ibm/juno/core/jena/RdfParser.java   |   518 +
 .../ibm/juno/core/jena/RdfParserContext.java    |   173 +
 .../ibm/juno/core/jena/RdfParserProperties.java |    68 +
 .../com/ibm/juno/core/jena/RdfProperties.java   |   415 +
 .../com/ibm/juno/core/jena/RdfSerializer.java   |   465 +
 .../juno/core/jena/RdfSerializerContext.java    |   179 +
 .../juno/core/jena/RdfSerializerProperties.java |    80 +
 .../src/com/ibm/juno/core/jena/RdfUtils.java    |    87 +
 .../com/ibm/juno/core/jena/annotation/Rdf.java  |    58 +
 .../ibm/juno/core/jena/annotation/RdfNs.java    |    37 +
 .../juno/core/jena/annotation/RdfSchema.java    |    94 +
 .../ibm/juno/core/jena/annotation/package.html  |    34 +
 .../juno/core/jena/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/jena/doc-files/Example_N3.png |   Bin 0 -> 37430 bytes
 .../core/jena/doc-files/Example_NTriple.png     |   Bin 0 -> 48413 bytes
 .../juno/core/jena/doc-files/Example_RDFXML.png |   Bin 0 -> 30486 bytes
 .../jena/doc-files/Example_RDFXMLABBREV.png     |   Bin 0 -> 30356 bytes
 .../juno/core/jena/doc-files/Example_Turtle.png |   Bin 0 -> 35328 bytes
 .../src/com/ibm/juno/core/jena/package.html     |  1687 +++
 .../core/jso/JavaSerializedObjectParser.java    |    55 +
 .../jso/JavaSerializedObjectSerializer.java     |    52 +
 .../src/com/ibm/juno/core/jso/package.html      |    34 +
 .../com/ibm/juno/core/json/JsonClassMeta.java   |    55 +
 .../src/com/ibm/juno/core/json/JsonParser.java  |   852 ++
 .../ibm/juno/core/json/JsonParserContext.java   |    66 +
 .../juno/core/json/JsonParserProperties.java    |    85 +
 .../juno/core/json/JsonSchemaSerializer.java    |   154 +
 .../com/ibm/juno/core/json/JsonSerializer.java  |   457 +
 .../juno/core/json/JsonSerializerContext.java   |    80 +
 .../core/json/JsonSerializerProperties.java     |    91 +
 .../juno/core/json/JsonSerializerWriter.java    |   265 +
 .../com/ibm/juno/core/json/annotation/Json.java |    72 +
 .../ibm/juno/core/json/annotation/package.html  |    34 +
 .../juno/core/json/doc-files/Example_HTML.png   |   Bin 0 -> 35528 bytes
 .../juno/core/json/doc-files/Example_JSON.png   |   Bin 0 -> 26954 bytes
 .../core/json/doc-files/Example_JSONSchema.png  |   Bin 0 -> 34114 bytes
 .../core/json/doc-files/Example_JSONSimple.png  |   Bin 0 -> 30920 bytes
 .../src/com/ibm/juno/core/json/package.html     |  1460 ++
 .../src/com/ibm/juno/core/package.html          |   210 +
 .../ibm/juno/core/parser/InputStreamParser.java |    52 +
 .../ibm/juno/core/parser/ParseException.java    |    88 +
 .../src/com/ibm/juno/core/parser/Parser.java    |   576 +
 .../com/ibm/juno/core/parser/ParserContext.java |   177 +
 .../com/ibm/juno/core/parser/ParserGroup.java   |   317 +
 .../ibm/juno/core/parser/ParserListener.java    |    40 +
 .../ibm/juno/core/parser/ParserProperties.java  |    69 +
 .../com/ibm/juno/core/parser/ParserReader.java  |   379 +
 .../com/ibm/juno/core/parser/ReaderParser.java  |   394 +
 .../src/com/ibm/juno/core/parser/package.html   |   126 +
 .../juno/core/plaintext/PlainTextParser.java    |    68 +
 .../core/plaintext/PlainTextSerializer.java     |    66 +
 .../com/ibm/juno/core/plaintext/package.html    |    34 +
 .../core/serializer/OutputStreamSerializer.java |    51 +
 .../core/serializer/SerializeException.java     |    53 +
 .../ibm/juno/core/serializer/Serializer.java    |   284 +
 .../juno/core/serializer/SerializerContext.java |   583 +
 .../juno/core/serializer/SerializerGroup.java   |   345 +
 .../core/serializer/SerializerProperties.java   |   315 +
 .../juno/core/serializer/SerializerWriter.java  |   313 +
 .../ibm/juno/core/serializer/StringObject.java  |    81 +
 .../juno/core/serializer/WriterSerializer.java  |   168 +
 .../com/ibm/juno/core/serializer/package.html   |   128 +
 .../ibm/juno/core/soap/SoapXmlSerializer.java   |    78 +
 .../core/soap/SoapXmlSerializerProperties.java  |    24 +
 .../src/com/ibm/juno/core/soap/package.html     |    34 +
 .../ibm/juno/core/urlencoding/UonParser.java    |   865 ++
 .../juno/core/urlencoding/UonParserContext.java |   111 +
 .../core/urlencoding/UonParserProperties.java   |    76 +
 .../juno/core/urlencoding/UonParserReader.java  |   195 +
 .../juno/core/urlencoding/UonSerializer.java    |   532 +
 .../core/urlencoding/UonSerializerContext.java  |   110 +
 .../urlencoding/UonSerializerProperties.java    |   135 +
 .../core/urlencoding/UonSerializerWriter.java   |   268 +
 .../core/urlencoding/UrlEncodingClassMeta.java  |    55 +
 .../core/urlencoding/UrlEncodingParser.java     |   553 +
 .../core/urlencoding/UrlEncodingProperties.java |    82 +
 .../core/urlencoding/UrlEncodingSerializer.java |   490 +
 .../urlencoding/annotation/UrlEncoding.java     |    37 +
 .../core/urlencoding/annotation/package.html    |    34 +
 .../core/urlencoding/doc-files/Example_HTML.png |   Bin 0 -> 32778 bytes
 .../doc-files/Example_UrlEncoding.png           |   Bin 0 -> 20958 bytes
 .../juno/core/urlencoding/doc-files/rfc_uon.txt |   352 +
 .../com/ibm/juno/core/urlencoding/package.html  |  1410 ++
 .../src/com/ibm/juno/core/utils/Args.java       |   257 +
 .../src/com/ibm/juno/core/utils/ArrayUtils.java |   273 +
 .../src/com/ibm/juno/core/utils/AsciiSet.java   |    55 +
 .../com/ibm/juno/core/utils/ByteArrayCache.java |   102 +
 .../juno/core/utils/ByteArrayInOutStream.java   |    28 +
 .../ibm/juno/core/utils/CharSequenceReader.java |    96 +
 .../src/com/ibm/juno/core/utils/ClassUtils.java |   211 +
 .../ibm/juno/core/utils/CollectionUtils.java    |    53 +
 .../ibm/juno/core/utils/DelegateBeanMap.java    |   111 +
 .../com/ibm/juno/core/utils/DelegateList.java   |    35 +
 .../com/ibm/juno/core/utils/DelegateMap.java    |    50 +
 .../src/com/ibm/juno/core/utils/FileUtils.java  |   130 +
 .../com/ibm/juno/core/utils/FilteredMap.java    |    92 +
 .../src/com/ibm/juno/core/utils/IOPipe.java     |   208 +
 .../src/com/ibm/juno/core/utils/IOUtils.java    |   352 +
 .../com/ibm/juno/core/utils/IdentityList.java   |    45 +
 .../src/com/ibm/juno/core/utils/KeywordSet.java |    86 +
 .../com/ibm/juno/core/utils/ManifestFile.java   |    97 +
 .../com/ibm/juno/core/utils/MessageBundle.java  |   305 +
 .../com/ibm/juno/core/utils/MultiIterable.java  |    74 +
 .../src/com/ibm/juno/core/utils/MultiSet.java   |   107 +
 .../ibm/juno/core/utils/PojoIntrospector.java   |   113 +
 .../src/com/ibm/juno/core/utils/PojoQuery.java  |  1246 ++
 .../src/com/ibm/juno/core/utils/PojoRest.java   |   843 ++
 .../ibm/juno/core/utils/PojoRestException.java  |    56 +
 .../com/ibm/juno/core/utils/ProcBuilder.java    |   382 +
 .../ibm/juno/core/utils/ReflectionUtils.java    |   159 +
 .../src/com/ibm/juno/core/utils/SimpleMap.java  |   112 +
 .../juno/core/utils/StringBuilderWriter.java    |    95 +
 .../com/ibm/juno/core/utils/StringMapVar.java   |    41 +
 .../com/ibm/juno/core/utils/StringUtils.java    |   919 ++
 .../src/com/ibm/juno/core/utils/StringVar.java  |    37 +
 .../ibm/juno/core/utils/StringVarMultipart.java |    32 +
 .../ibm/juno/core/utils/StringVarResolver.java  |   361 +
 .../juno/core/utils/StringVarWithDefault.java   |    31 +
 .../src/com/ibm/juno/core/utils/StringVars.java |    34 +
 .../ibm/juno/core/utils/TeeOutputStream.java    |   159 +
 .../src/com/ibm/juno/core/utils/TeeWriter.java  |   161 +
 .../com/ibm/juno/core/utils/ThrowableUtils.java |    80 +
 .../src/com/ibm/juno/core/utils/Utils.java      |    34 +
 .../com/ibm/juno/core/utils/ZipFileList.java    |   136 +
 .../com/ibm/juno/core/utils/log/JunoLogger.java |   293 +
 .../src/com/ibm/juno/core/utils/package.html    |    53 +
 .../src/com/ibm/juno/core/xml/Namespace.java    |    81 +
 .../com/ibm/juno/core/xml/NamespaceFactory.java |   126 +
 .../src/com/ibm/juno/core/xml/XmlBeanMeta.java  |   125 +
 .../ibm/juno/core/xml/XmlBeanPropertyMeta.java  |   159 +
 .../src/com/ibm/juno/core/xml/XmlClassMeta.java |   114 +
 .../ibm/juno/core/xml/XmlContentHandler.java    |   135 +
 .../com/ibm/juno/core/xml/XmlDocSerializer.java |    62 +
 .../src/com/ibm/juno/core/xml/XmlParser.java    |   541 +
 .../com/ibm/juno/core/xml/XmlParserContext.java |   167 +
 .../ibm/juno/core/xml/XmlParserProperties.java  |   244 +
 .../juno/core/xml/XmlSchemaDocSerializer.java   |    50 +
 .../ibm/juno/core/xml/XmlSchemaSerializer.java  |   588 +
 .../com/ibm/juno/core/xml/XmlSerializer.java    |   727 +
 .../ibm/juno/core/xml/XmlSerializerContext.java |   206 +
 .../juno/core/xml/XmlSerializerProperties.java  |   171 +
 .../ibm/juno/core/xml/XmlSerializerWriter.java  |   663 +
 .../src/com/ibm/juno/core/xml/XmlUtils.java     |   571 +
 .../com/ibm/juno/core/xml/annotation/Xml.java   |   197 +
 .../ibm/juno/core/xml/annotation/XmlFormat.java |    53 +
 .../com/ibm/juno/core/xml/annotation/XmlNs.java |    37 +
 .../ibm/juno/core/xml/annotation/XmlSchema.java |    94 +
 .../ibm/juno/core/xml/annotation/package.html   |    34 +
 .../juno/core/xml/doc-files/Example_HTML.png    |   Bin 0 -> 35528 bytes
 .../ibm/juno/core/xml/doc-files/Example_XML.png |   Bin 0 -> 32865 bytes
 .../core/xml/doc-files/Example_XMLSchema.png    |   Bin 0 -> 45685 bytes
 .../core/xml/doc-files/Example_XMLSimple.png    |   Bin 0 -> 34372 bytes
 .../src/com/ibm/juno/core/xml/package.html      |  2321 +++
 .../src/doc-files/Microservices.1.png           |   Bin 0 -> 22345 bytes
 .../doc-files/Samples.AddressBookResource.1.png |   Bin 0 -> 44553 bytes
 .../doc-files/Samples.AddressBookResource.2.png |   Bin 0 -> 224346 bytes
 .../Samples.AddressBookResource.Demo.1.png      |   Bin 0 -> 17539 bytes
 .../Samples.AddressBookResource.Demo.10.png     |   Bin 0 -> 37153 bytes
 .../Samples.AddressBookResource.Demo.2.png      |   Bin 0 -> 47285 bytes
 .../Samples.AddressBookResource.Demo.3.png      |   Bin 0 -> 40911 bytes
 .../Samples.AddressBookResource.Demo.4.png      |   Bin 0 -> 40461 bytes
 .../Samples.AddressBookResource.Demo.5.png      |   Bin 0 -> 49884 bytes
 .../Samples.AddressBookResource.Demo.6.png      |   Bin 0 -> 52332 bytes
 .../Samples.AddressBookResource.Demo.7.png      |   Bin 0 -> 39401 bytes
 .../Samples.AddressBookResource.Demo.8.png      |   Bin 0 -> 34154 bytes
 .../Samples.AddressBookResource.Demo.9.png      |   Bin 0 -> 51831 bytes
 ...les.AddressBookResource.Introspectable.1.png |   Bin 0 -> 21714 bytes
 .../Samples.AddressBookResource.Queryable.1.png |   Bin 0 -> 43970 bytes
 .../Samples.AddressBookResource.Queryable.2.png |   Bin 0 -> 35177 bytes
 .../Samples.AddressBookResource.Queryable.3.png |   Bin 0 -> 35137 bytes
 ...amples.AddressBookResource.Traversable.1.png |   Bin 0 -> 28868 bytes
 ...amples.AddressBookResource.Traversable.2.png |   Bin 0 -> 20464 bytes
 .../doc-files/Samples.AtomFeedResource.1.png    |   Bin 0 -> 45184 bytes
 .../doc-files/Samples.AtomFeedResource.2.png    |   Bin 0 -> 78940 bytes
 .../doc-files/Samples.AtomFeedResource.3.png    |   Bin 0 -> 28698 bytes
 .../src/doc-files/Samples.Building.1.png        |   Bin 0 -> 14082 bytes
 .../src/doc-files/Samples.Building.2.png        |   Bin 0 -> 5543 bytes
 .../src/doc-files/Samples.ConfigResource.1.png  |   Bin 0 -> 38071 bytes
 .../src/doc-files/Samples.ConfigResource.2.png  |   Bin 0 -> 42599 bytes
 .../src/doc-files/Samples.ConfigResource.3.png  |   Bin 0 -> 41856 bytes
 .../Samples.DockerRegistryResource.1.png        |   Bin 0 -> 16230 bytes
 .../Samples.DockerRegistryResource.2.png        |   Bin 0 -> 23808 bytes
 .../doc-files/Samples.HelloWorldResource.1.png  |   Bin 0 -> 15414 bytes
 .../doc-files/Samples.HelloWorldResource.2.png  |   Bin 0 -> 10797 bytes
 .../doc-files/Samples.HelloWorldResource.3.png  |   Bin 0 -> 66934 bytes
 .../src/doc-files/Samples.Installing.1.png      |   Bin 0 -> 52312 bytes
 .../src/doc-files/Samples.Installing.2.png      |   Bin 0 -> 59664 bytes
 .../src/doc-files/Samples.Installing.3.png      |   Bin 0 -> 25927 bytes
 .../doc-files/Samples.JsonSchemaResource.1.png  |   Bin 0 -> 36315 bytes
 .../doc-files/Samples.JsonSchemaResource.2.png  |   Bin 0 -> 28837 bytes
 .../src/doc-files/Samples.LogsResource.1.png    |   Bin 0 -> 37594 bytes
 .../src/doc-files/Samples.LogsResource.2.png    |   Bin 0 -> 42497 bytes
 .../src/doc-files/Samples.LogsResource.3.png    |   Bin 0 -> 56603 bytes
 .../Samples.MethodExampleResource.1.png         |   Bin 0 -> 27555 bytes
 .../Samples.MethodExampleResource.2.png         |   Bin 0 -> 71023 bytes
 .../src/doc-files/Samples.PhotosResource.1.png  |   Bin 0 -> 16442 bytes
 .../src/doc-files/Samples.PhotosResource.2.png  |   Bin 0 -> 71952 bytes
 ...Samples.RequestEchoResource.1.htmlschema.png |   Bin 0 -> 35501 bytes
 .../Samples.RequestEchoResource.1.json.png      |   Bin 0 -> 30092 bytes
 ...Samples.RequestEchoResource.1.jsonschema.png |   Bin 0 -> 31731 bytes
 ...Samples.RequestEchoResource.1.jsonsimple.png |   Bin 0 -> 29302 bytes
 .../doc-files/Samples.RequestEchoResource.1.png |   Bin 0 -> 54743 bytes
 .../Samples.RequestEchoResource.1.uon.png       |   Bin 0 -> 64778 bytes
 ...amples.RequestEchoResource.1.urlencoding.png |   Bin 0 -> 71054 bytes
 .../Samples.RequestEchoResource.1.xml.png       |   Bin 0 -> 43989 bytes
 .../Samples.RequestEchoResource.1.xmlschema.png |   Bin 0 -> 47951 bytes
 .../doc-files/Samples.RequestEchoResource.2.png |   Bin 0 -> 30872 bytes
 .../doc-files/Samples.RequestEchoResource.3.png |   Bin 0 -> 27501 bytes
 .../doc-files/Samples.RequestEchoResource.4.png |   Bin 0 -> 22149 bytes
 .../src/doc-files/Samples.Running.1.png         |   Bin 0 -> 40422 bytes
 .../src/doc-files/Samples.Running.2.png         |   Bin 0 -> 15925 bytes
 .../src/doc-files/Samples.Running.3.png         |   Bin 0 -> 62643 bytes
 .../Samples.SampleRemoteableServlet.1.png       |   Bin 0 -> 23969 bytes
 .../Samples.SampleRemoteableServlet.2.png       |   Bin 0 -> 29986 bytes
 .../Samples.SampleRemoteableServlet.3.png       |   Bin 0 -> 45596 bytes
 .../doc-files/Samples.SqlQueryResource.1.png    |   Bin 0 -> 16113 bytes
 .../doc-files/Samples.SqlQueryResource.2.png    |   Bin 0 -> 40356 bytes
 .../src/doc-files/Samples.TempDirResource.1.png |   Bin 0 -> 32843 bytes
 .../src/doc-files/Samples.TempDirResource.2.png |   Bin 0 -> 20359 bytes
 .../Samples.TumblrParserResource.1.png          |   Bin 0 -> 168439 bytes
 .../Samples.UrlEncodedFormResource.1.png        |   Bin 0 -> 24026 bytes
 .../Samples.UrlEncodedFormResource.2.png        |   Bin 0 -> 31318 bytes
 com.ibm.team.juno/src/doc-files/Server.Html.png |   Bin 0 -> 52497 bytes
 com.ibm.team.juno/src/doc-files/Server.Json.png |   Bin 0 -> 29692 bytes
 com.ibm.team.juno/src/doc-files/Server.N3.png   |   Bin 0 -> 45391 bytes
 .../src/doc-files/Server.NTuple.png             |   Bin 0 -> 55713 bytes
 .../src/doc-files/Server.Options.png            |   Bin 0 -> 67005 bytes
 .../src/doc-files/Server.RdfXml.png             |   Bin 0 -> 45274 bytes
 .../src/doc-files/Server.SimpleXml.png          |   Bin 0 -> 36746 bytes
 .../src/doc-files/Server.Turtle.png             |   Bin 0 -> 45180 bytes
 com.ibm.team.juno/src/doc-files/Server.Uon.png  |   Bin 0 -> 28160 bytes
 .../src/doc-files/Server.UrlEncoding.png        |   Bin 0 -> 32516 bytes
 com.ibm.team.juno/src/doc-files/Server.Xml.png  |   Bin 0 -> 45446 bytes
 com.ibm.team.juno/src/javadoc.css               |  1039 ++
 com.ibm.team.juno/src/overview.html             |  7507 ++++++++++
 com.ibm.team.juno/src/todo.txt                  |     7 +
 6119 files changed, 739559 insertions(+)
----------------------------------------------------------------------



[06/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$MapMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$MapMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$MapMatcher.class
new file mode 100755
index 0000000..e1303c6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$MapMatcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberMatcher.class
new file mode 100755
index 0000000..d67f612
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberMatcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberPattern.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberPattern.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberPattern.class
new file mode 100755
index 0000000..25153ec
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberPattern.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberRange.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberRange.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberRange.class
new file mode 100755
index 0000000..127742c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$NumberRange.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$ObjectMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$ObjectMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$ObjectMatcher.class
new file mode 100755
index 0000000..f826750
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$ObjectMatcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$SearchPattern.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$SearchPattern.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$SearchPattern.class
new file mode 100755
index 0000000..eead3cd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$SearchPattern.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$StringMatcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$StringMatcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$StringMatcher.class
new file mode 100755
index 0000000..65b68c5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$StringMatcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampPattern.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampPattern.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampPattern.class
new file mode 100755
index 0000000..98258f3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampPattern.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampRange.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampRange.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampRange.class
new file mode 100755
index 0000000..4256f45
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery$TimestampRange.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.class
new file mode 100755
index 0000000..e27b8bf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.java
new file mode 100755
index 0000000..4010e64
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoQuery.java
@@ -0,0 +1,1246 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static java.util.Calendar.*;
+
+import java.text.*;
+import java.util.*;
+import java.util.regex.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Designed to provide query/view/sort/paging filtering on tabular in-memory POJO models.
+ * <p>
+ * 	It can also perform just view filtering on beans/maps.
+ * <p>
+ * 	Examples of tabular POJO models:
+ * 	<ul>
+ * 		<li><tt>Collection{@code <Map>}</tt>
+ * 		<li><tt>Collection{@code <Bean>}</tt>
+ * 		<li><tt>Map[]</tt>
+ * 		<li><tt>Bean[]</tt>
+ * 	</ul>
+ * <p>
+ * 	Tabular POJO models can be thought of as tables of data.  For example, a list of the following beans...
+ * <p class='bcode'>
+ * 	<jk>public</jk> MyBean {
+ * 		<jk>public int</jk> fi;
+ * 		<jk>public</jk> String fs;
+ * 		<jk>public</jk> Date fd;
+ * 	}
+ * <p>
+ * 	... can be thought of a table containing the following columns...
+ * <p>
+ * 	<table class='styled code'>
+ * 		<tr><th>fi</th><th>fs</th><th>fd</th></tr>
+ * 		<tr><td>123</td><td>'foobar'</td><td>yyyy/MM/dd HH:mm:ss</td></tr>
+ * 		<tr><td colspan=3>...</td></tr>
+ * 	</table>
+ * <p>
+ * 	From this table, you can perform the following functions:
+ * 	<ul>
+ * 		<li>Query - Return only rows where a search pattern matches.
+ * 		<li>View - Return only the specified subset of columns in the specified order.
+ * 		<li>Sort - Sort the table by one or more columns.
+ * 		<li>Page - Only return a subset of rows.
+ * 	</ul>
+ *
+ * <h5 class='topic'>Query</h5>
+ * <p>
+ * 	The query capabilites allow you to filter based on query patterns against
+ * 	strings, dates, and numbers.  Queries take the form of a Map with column names
+ * 	as keys, and search patterns as values.  <br>
+ * 	Search patterns can be either {@code Strings} or {@code Maps}.<br>
+ * 	Multiple search patterns are ANDed (i.e. all patterns must match for the row to be returned).
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <ul>
+ * 	<li><tt>{fi:'123'}</tt> - Return only rows where the <tt>fi</tt> column is 123.
+ * 	<li><tt>{fs:'foobar'}</tt> - Return only rows where the <tt>fs</tt> column is 'foobar'.
+ * 	<li><tt>{fd:'2001'}</tt> - Return only rows where the <tt>fd</tt> column have dates in the year 2001.
+ * 	<li><tt>{fs:'foobar'}</tt> - Return only rows where the <tt>fs</tt> column is 'foobar'.
+ * 		and the <tt>fs</tt> column starts with <tt>"foo"</tt>.
+ * </ul>
+ * <p>
+ * 	Search patterns can also be applied to lower level fields.  For example, the search term
+ * 	<tt>{f1:{f2:{f3{'foobar'}}}</tt> means only return top level rows where the <tt>f1.getF2().getF3()</tt>
+ * 	property is <tt>'foobar'</tt>.
+ *
+ * <h5 class='topic'>String Patterns</h5>
+ * <p>
+ * 	Any objects can be queried against using string patterns.  If the objects being
+ * 	searched are not strings, then the patterns are matched against whatever is
+ * 	return by the {@code Object#toString()} method.
+ *
+ * <h6 class='topic'>Example string query patterns</h6>
+ * <ul>
+ * 	<li><tt>foo</tt> - The string 'foo'
+ * 	<li><tt>foo bar</tt> - The string 'foo' or the string 'bar'
+ * 	<li><tt>'foo bar'</tt> - The phrase 'foo bar'
+ * 	<li><tt>"foo bar"</tt> - The phrase 'foo bar'
+ * 	<li><tt>foo*</tt> - <tt>*</tt> matches zero-or-more characters.
+ * 	<li><tt>foo?</tt> - <tt>?</tt> matches exactly one character
+ * </ul>
+ *
+ * <h6 class='topic'>Notes</h6>
+ * <ul>
+ * 	<li>Whitespace is ignored around search patterns.
+ * 	<li>Prepend <tt>+</tt> to tokens that must match.  (e.g. <tt>+foo* +*bar</tt>)
+ * 	<li>Prepend <tt>-</tt> to tokens that must not match.  (e.g. <tt>+foo* -*bar</tt>)
+ * </ul>
+ *
+ * <h5 class='topic'>Numeric Patterns</h5>
+ * <p>
+ * 	Any object of type {@link Number} (or numeric primitives) can be searched using numeric patterns.
+ *
+ * <h6 class='topic'>Example numeric query patterns</h6>
+ * <ul>
+ * 	<li><tt>123</tt> - The single number 123
+ * 	<li><tt>1 2 3</tt>	- 1, 2, or 3
+ * 	<li><tt>1-100</tt> - Between 1 and 100
+ * 	<li><tt>1 - 100</tt> - Between 1 and 100
+ * 	<li><tt>1 - 100 200-300</tt> - Between 1 and 100 or between 200 and 300
+ * 	<li><tt>&gt; 100</tt> - Greater than 100
+ * 	<li><tt>&gt;= 100</tt> - Greater than or equal to 100
+ * 	<li><tt>!123</tt> - Not 123
+ * </ul>
+ *
+ * <h6 class='topic'>Notes</h6>
+ * <ul>
+ * 	<li>Whitespace is ignored in search patterns.
+ * 	<li>Negative numbers are supported.
+ * </ul>
+ *
+ * <h5 class='topic'>Date Patterns</h5>
+ * <p>
+ * 	Any object of type {@link Date} or {@link Calendar} can be searched using date patterns.
+ * <p>
+ * 	The default valid input timestamp formats (which can be overridden via the {@link #setValidTimestampFormats(String...)} method are...
+ *
+ * <ul>
+ * 	<li><tt>yyyy.MM.dd.HH.mm.ss</tt>
+ * 	<li><tt>yyyy.MM.dd.HH.mm</tt>
+ * 	<li><tt>yyyy.MM.dd.HH</tt>
+ * 	<li><tt>yyyy.MM.dd</tt>
+ * 	<li><tt>yyyy.MM</tt>
+ * 	<li><tt>yyyy</tt>
+ * </ul>
+ *
+ * <h6 class='topic'>Example date query patterns</h6>
+ * <ul>
+ * 	<li><tt>2001</tt> - A specific year.
+ * 	<li><tt>2001.01.01.10.50</tt> - A specific time.
+ * 	<li><tt>&gt;2001</tt>	- After a specific year.
+ * 	<li><tt>&gt;=2001</tt> - During or after a specific year.
+ * 	<li><tt>2001 - 2003.06.30</tt>	- A date range.
+ * 	<li><tt>2001 2003 2005</tt>	- Multiple date patterns are ORed.
+ * </ul>
+ *
+ * <h6 class='topic'>Notes</h6>
+ * <ul>
+ * 	<li>Whitespace is ignored in search patterns.
+ * </ul>
+ *
+ * <h5 class='topic'>View</h5>
+ * <p>
+ * 	The view capability allows you to return only the specified subset of columns in the
+ * 	specified order.<br>
+ * 	The view parameter is a list of either <tt>Strings</tt> or <tt>Maps</tt>.
+ *
+ * <h6 class='topic'>Example view parameters</h6>
+ * <ul>
+ * 	<li><tt>['f1']</tt> - Return only column 'f1'.
+ * 	<li><tt>['f2','f1']</tt> - Return only columns 'f2' and 'f1'.
+ * 	<li><tt>['f1',{f2:'f3'}]</tt> - Return only columns 'f1' and 'f2', but for 'f2' objects,
+ * 		only show the 'f3' property.
+ * </ul>
+ *
+ * <h5 class='topic'>Sort</h5>
+ * <p>
+ * 	The sort capability allows you to sort values by the specified rows.<br>
+ * 	The sort parameter is a list of either <tt>Strings</tt> or <tt>Maps</tt>.<br>
+ * 	<tt>Strings</tt> represent column names to sort ascending.  If you want
+ * 	to sort descending, you need to specify a <tt>Map</tt> of the form <tt>{colname:'d'}</tt>
+ *
+ * <h6 class='topic'>Example sort parameters</h6>
+ * <ul>
+ * 	<li><tt>['f1']</tt> - Sort rows by column 'f1' ascending.
+ * 	<li><tt>[{f1:'a'}]</tt> - Sort rows by column 'f1' ascending.
+ * 	<li><tt>[{f1:'d'}]</tt> - Sort rows by column 'f1' descending.
+ * 	<li><tt>[{f1:'a'},{f2:'d'}]</tt> - Sort rows by column 'f1' ascending, then 'f2' descending.
+ * </ul>
+ *
+ * <h5 class='topic'>Paging</h5>
+ * <p>
+ * 	Use the <tt>pos</tt> and <tt>limit</tt> parameters to specify a subset of rows to
+ * 	return.
+ *
+ * <h5 class='topic'>Other Notes</h5>
+ * <ul>
+ * 	<li>Calling <tt>filterMap()</tt> or <tt>filterCollection()</tt> always returns a new data
+ * 		structure, so the methods can be called multiple times against the same input.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({"unchecked","rawtypes"})
+public final class PojoQuery {
+
+	private Object input;
+	private ClassMeta type;
+	private BeanContext beanContext;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param input The POJO we're going to be filtering.
+	 * @param beanContext The bean context to use to create bean maps for beans.
+	 */
+	public PojoQuery(Object input, BeanContext beanContext) {
+		this.input = input;
+		this.type = beanContext.getClassMetaForObject(input);
+		this.beanContext = beanContext;
+	}
+
+	/**
+	 * Filters the input object as a map.
+	 *
+	 * @param view The list and order of properties to return from the map.  Values must be of type {@code String} or {@code Map}.
+	 * @return The filtered map
+	 */
+	public Map filterMap(List view) {
+
+		if (input == null)
+			return null;
+
+		if (! (type.isBean() || type.isMap()))
+			throw new RuntimeException("Cannot call filterMap() on class type " + type);
+
+		Map m = (Map)replaceWithMutables(input);
+		doView(m, view);
+
+		return m;
+	}
+
+	/**
+	 * Filters the input object as a collection of maps.
+	 *
+	 * @param query The query attributes.  Keys must be column names and values must be of type {@code String} or {@code Map}.
+	 * @param view The view attributes.  Values must be of type {@code String} or {@code Map}.
+	 * @param sort The sort attributes.  Values must be of type {@code String} or {@code Map}.
+	 * @param pos The index into the list to start returning results from.  Default is {@code 0}.
+	 * @param limit The number of rows to return.  Default is all rows.
+	 * @param ignoreCase If <jk>true</jk>, then querying is case insensitive.  Default is <jk>false</jk>.
+	 * @return The filtered collection.
+	 */
+	public List filterCollection(Map query, List view, List sort, int pos, int limit, boolean ignoreCase) {
+
+		if (input == null)
+			return null;
+
+		if (! (type.isArray() || type.isCollection()))
+			throw new RuntimeException("Cannot call filterCollection() on class type " + type);
+
+		if (view == null)
+			view = Collections.EMPTY_LIST;
+
+		if (sort == null)
+			sort = Collections.EMPTY_LIST;
+
+		// Create a new ObjectList
+		ObjectList l = (ObjectList)replaceWithMutables(input);
+
+		// Do the search
+		CollectionFilter filter = new CollectionFilter(query, ignoreCase);
+		filter.doQuery(l);
+
+		// If sort or view isn't empty, then we need to make sure that all entries in the
+		// list are maps.
+		if ((! sort.isEmpty()) || (! view.isEmpty())) {
+
+			if (! sort.isEmpty())
+				doSort(l, sort);
+
+			if (! view.isEmpty())
+				doView(l, view);
+		}
+
+		// Do the paging.
+		if (pos != 0 || limit != 0) {
+			int end = (limit == 0 || limit+pos >= l.size()) ? l.size() : limit + pos;
+			ObjectList l2 = new DelegateList(((DelegateList)l).getClassMeta());
+			l2.addAll(l.subList(pos, end));
+			l = l2;
+		}
+
+		return l;
+	}
+
+	/*
+	 * If there are any non-Maps in the specified list, replaces them with BeanMaps.
+	 */
+	private Object replaceWithMutables(Object o) {
+		if (o == null)
+			return null;
+		ClassMeta cm = beanContext.getClassMetaForObject(o);
+		if (cm.isCollection()) {
+			ObjectList l = new DelegateList(beanContext.getClassMetaForObject(o));
+			for (Object o2 : (Collection)o)
+				l.add(replaceWithMutables(o2));
+			return l;
+		}
+		if (cm.isMap() && o instanceof BeanMap) {
+			BeanMap bm = (BeanMap)o;
+			DelegateBeanMap dbm = new DelegateBeanMap(bm.getBean(), beanContext);
+			for (BeanMapEntry e : (Set<BeanMapEntry>)bm.entrySet()) {
+				ClassMeta ct1 = e.getMeta().getClassMeta();
+				if (ct1.isArray() || ct1.isBean() || ct1.isCollection() || ct1.isMap() || ct1.isObject())
+					dbm.put(e.getKey(), replaceWithMutables(e.getValue()));
+				else
+					dbm.addKey(e.getKey());
+			}
+			return dbm;
+		}
+		if (cm.isBean()) {
+			BeanMap bm = beanContext.forBean(o);
+			DelegateBeanMap dbm = new DelegateBeanMap(bm.getBean(), beanContext);
+			for (BeanMapEntry e : (Set<BeanMapEntry>)bm.entrySet()) {
+				ClassMeta ct1 = e.getMeta().getClassMeta();
+				if (ct1.isArray() || ct1.isBean() || ct1.isCollection() || ct1.isMap() || ct1.isObject()) {
+					Object val = null;
+					try {
+						val = e.getValue();
+					} catch (BeanRuntimeException ex) {
+						// Ignore.
+					}
+					dbm.put(e.getKey(), replaceWithMutables(val));
+				}
+				else
+					dbm.addKey(e.getKey());
+			}
+			return dbm;
+		}
+		if (cm.isMap()) {
+			Map m = (Map)o;
+			DelegateMap dm = new DelegateMap(beanContext.getClassMetaForObject(m));
+			for (Map.Entry e : (Set<Map.Entry>)m.entrySet())
+				dm.put(e.getKey().toString(), replaceWithMutables(e.getValue()));
+			return dm;
+		}
+		if (cm.isArray()) {
+			return replaceWithMutables(Arrays.asList((Object[])o));
+		}
+		return o;
+	}
+
+	/*
+	 * Sorts the specified list by the sort list.
+	 */
+	private void doSort(List list, List sortList) {
+
+		Map sort = new LinkedHashMap();
+		for (Object s : sortList) {
+			if (s instanceof String)
+				sort.put(s, "a");
+			else if (s instanceof Map) {
+				Map sm = (Map)s;
+				for (Map.Entry e : (Set<Map.Entry>)sm.entrySet())
+					sort.put(e.getKey(), e.getValue().toString().toLowerCase(Locale.ENGLISH));
+			}
+		}
+
+		// Do the sort.
+		List<String> columns = new ArrayList<String>(sort.keySet());
+		Collections.reverse(columns);
+		for (final String c : columns) {
+			final boolean isDesc = StringUtils.startsWith(sort.get(c).toString(), 'd');
+			Comparator comp = new Comparator<Map>() {
+				@Override /* Comparator */
+				public int compare(Map m1, Map m2) {
+					Comparable v1 = (Comparable)m1.get(c), v2 = (Comparable)m2.get(c);
+					if (v1 == null && v2 == null)
+						return 0;
+					if (v1 == null)
+						return (isDesc ? -1 : 1);
+					if (v2 == null)
+						return (isDesc ? 1 : -1);
+					return (isDesc ? v2.compareTo(v1) : v1.compareTo(v2));
+				}
+			};
+			Collections.sort(list, comp);
+		}
+	}
+
+	/*
+	 * Filters all but the specified view columns on all entries in the specified list.
+	 */
+	private void doView(List list, List view) {
+
+		for (ListIterator i = list.listIterator(); i.hasNext();) {
+			Object o = i.next();
+			Map m = (Map)o;
+			doView(m, view);
+		}
+	}
+
+	/*
+	 * Creates a new Map with only the entries specified in the view list.
+	 */
+	private void doView(Map m, List view) {
+		List<String> filterKeys = new LinkedList<String>();
+		for (Object v : view) {
+			if (v instanceof String) {
+				filterKeys.add(v.toString());
+			} else if (v instanceof ObjectMap) {
+				ObjectMap vm = (ObjectMap)v;
+				for (Map.Entry<String,Object> e : vm.entrySet()) {
+					String vmKey = e.getKey();
+					Object vmVal = e.getValue();
+					Object mv = m.get(vmKey);
+					filterKeys.add(vmKey);
+					if (vmVal instanceof List) {
+						List l = (List)vmVal;
+						if (mv instanceof List)
+							doView((List)mv, l);
+						else if (mv instanceof Map)
+							doView((Map)mv, l);
+					}
+				}
+			}
+		}
+		if (m instanceof DelegateMap)
+			((DelegateMap)m).filterKeys(filterKeys);
+		else
+			((DelegateBeanMap)m).filterKeys(filterKeys);
+	}
+
+
+	/*
+	 * Returns the appropriate IMatcher for the specified class type.
+	 */
+	private IMatcher getObjectMatcherForType(String queryString, boolean ignoreCase, ClassMeta cm) {
+		if (cm.isDate())
+			return new DateMatcher(queryString);
+		if (cm.isNumber())
+			return new NumberMatcher(queryString);
+		if (cm.isObject())
+			return new ObjectMatcher(queryString, ignoreCase);
+		return new StringMatcher(queryString, ignoreCase);
+	}
+
+	//====================================================================================================
+	// CollectionFilter
+	//====================================================================================================
+	private class CollectionFilter {
+		IMatcher entryMatcher;
+
+		public CollectionFilter(Map query, boolean ignoreCase) {
+			if (query != null && ! query.isEmpty())
+				entryMatcher = new MapMatcher(query, ignoreCase);
+		}
+
+		public void doQuery(List in) {
+			if (in == null || entryMatcher == null)
+				return;
+			for (Iterator i = in.iterator(); i.hasNext();) {
+				Object o = i.next();
+				if (! entryMatcher.matches(o))
+					i.remove();
+			}
+		}
+	}
+
+	//====================================================================================================
+	// IMatcher
+	//====================================================================================================
+	private interface IMatcher<E> {
+		public boolean matches(E o);
+	}
+
+	//====================================================================================================
+	// MapMatcher
+	//====================================================================================================
+	/*
+	 * Matches on a Map only if all specified entry matchers match.
+	 */
+	private class MapMatcher implements IMatcher<Map> {
+
+		Map<String,IMatcher> entryMatchers = new HashMap<String,IMatcher>();
+
+		public MapMatcher(Map query, boolean ignoreCase) {
+			for (Map.Entry e : (Set<Map.Entry>)query.entrySet()) {
+				String key = e.getKey().toString();
+				Object value = e.getValue();
+				IMatcher matcher = null;
+				if (value instanceof String)
+					matcher = getObjectMatcherForType((String)value, ignoreCase, beanContext.object());
+				else if (value instanceof ObjectMap)
+					matcher = new MapMatcher((ObjectMap)value, ignoreCase);
+				else
+					throw new RuntimeException("Invalid value type: " + value);
+				entryMatchers.put(key, matcher);
+			}
+		}
+
+		@Override /* IMatcher */
+		public boolean matches(Map m) {
+			if (m == null)
+				return false;
+			for (Map.Entry<String,IMatcher> e : entryMatchers.entrySet()) {
+				String key = e.getKey();
+				Object val = m.get(key);
+				if (! e.getValue().matches(val))
+					return false;
+			}
+			return true;
+		}
+	}
+
+	//====================================================================================================
+	// ObjectMatcher
+	//====================================================================================================
+	/*
+	 * Matcher that uses the correct matcher based on object type.
+	 * Used for objects when we can't determine the object type beforehand.
+	 */
+	private class ObjectMatcher implements IMatcher<Object> {
+
+		String searchPattern;
+		boolean ignoreCase;
+		DateMatcher dateMatcher;
+		NumberMatcher numberMatcher;
+		StringMatcher stringMatcher;
+
+		ObjectMatcher(String searchPattern, boolean ignoreCase) {
+			this.searchPattern = searchPattern;
+			this.ignoreCase = ignoreCase;
+		}
+
+		@Override /* IMatcher */
+		public boolean matches(Object o) {
+			if (o instanceof Number)
+				return getNumberMatcher().matches(o);
+			if (o instanceof Date || o instanceof Calendar)
+				return getDateMatcher().matches(o);
+			return getStringMatcher().matches(o);
+		}
+
+		private IMatcher getNumberMatcher() {
+			if (numberMatcher == null)
+				numberMatcher = new NumberMatcher(searchPattern);
+			return numberMatcher;
+		}
+
+		private IMatcher getStringMatcher() {
+			if (stringMatcher == null)
+				stringMatcher = new StringMatcher(searchPattern, ignoreCase);
+			return stringMatcher;
+		}
+
+		private IMatcher getDateMatcher() {
+			if (dateMatcher == null)
+				dateMatcher = new DateMatcher(searchPattern);
+			return dateMatcher;
+		}
+	}
+
+	//====================================================================================================
+	// NumberMatcher
+	//====================================================================================================
+	private static class NumberMatcher implements IMatcher<Number> {
+
+		private NumberPattern[] numberPatterns;
+
+		/**
+		 * Construct a number matcher for the given search pattern.
+		 * @param searchPattern A date search paattern.  See class usage for a description.
+		 */
+		public NumberMatcher(String searchPattern) {
+			numberPatterns = new NumberPattern[1];
+			numberPatterns[0] = new NumberPattern(searchPattern);
+
+		}
+
+		/**
+		 * Returns 'true' if this integer matches the pattern(s).
+		 */
+		@Override /* IMatcher */
+		public boolean matches(Number in) {
+			for (int i = 0; i < numberPatterns.length; i++) {
+				if (! numberPatterns[i].matches(in))
+					return false;
+			}
+			return true;
+		}
+
+	}
+
+	/**
+	 * A construct representing a single search pattern.
+	 */
+	private static class NumberPattern {
+		NumberRange[] numberRanges;
+
+		public NumberPattern(String searchPattern) {
+
+			List<NumberRange> l = new LinkedList<NumberRange>();
+
+			for (String s : breakUpTokens(searchPattern)) {
+				boolean isNot = (s.charAt(0) == '!');
+				String token = s.substring(1);
+				Pattern p = Pattern.compile("(([<>]=?)?)(-?\\d+)(-?(-?\\d+)?)");
+
+				// Possible patterns:
+				// 123, >123, <123, >=123, <=123, >-123, >=-123, 123-456, -123--456
+				// Regular expression used:  (([<>]=?)?)(-?\d+)(-??(-?\d+))
+				Matcher m = p.matcher(token);
+
+				// If a non-numeric value was passed in for a numeric value, just set the value to '0'.
+				// (I think this might resolve a workaround in custom queries).
+				if (! m.matches())
+					throw new RuntimeException("Numeric value didn't match pattern:  ["+token+"]");
+					//m = numericPattern.matcher("0");
+
+				String arg1 = m.group(1);
+				String start = m.group(3);
+				String end = m.group(5);
+
+				l.add(new NumberRange(arg1, start, end, isNot));
+			}
+
+			numberRanges = l.toArray(new NumberRange[l.size()]);
+		}
+
+		private List<String> breakUpTokens(String s) {
+			// Get rid of whitespace in "123 - 456"
+			s = s.replaceAll("(-?\\d+)\\s*-\\s*(-?\\d+)", "$1-$2");
+			// Get rid of whitespace in ">= 123"
+			s = s.replaceAll("([<>]=?)\\s+(-?\\d+)", "$1$2");
+			// Get rid of whitespace in "! 123"
+			s = s.replaceAll("(!)\\s+(-?\\d+)", "$1$2");
+
+			// Replace all commas with whitespace
+			// Allows for alternate notation of: 123,456...
+			s = s.replaceAll(",", " ");
+
+			String[] s2 = s.split("\\s+");
+
+			// Make all tokens 'ORed'.  There is no way to AND numeric tokens.
+			for (int i = 0; i < s2.length; i++)
+				if (! StringUtils.startsWith(s2[i], '!'))
+					s2[i] = "^"+s2[i];
+
+			List<String> l = new LinkedList<String>();
+			l.addAll(Arrays.asList(s2));
+			return l;
+		}
+
+		public boolean matches(Number number) {
+			if (numberRanges.length == 0) return true;
+			for (int i = 0; i < numberRanges.length; i++)
+				if (numberRanges[i].matches(number))
+					return true;
+			return false;
+		}
+	}
+
+	/**
+	 * A construct representing a single search range in a single search pattern.
+	 * All possible forms of search patterns are boiled down to these number ranges.
+	 */
+	private static class NumberRange {
+		int start;
+		int end;
+		boolean isNot;
+
+		public NumberRange(String arg, String start, String end, boolean isNot) {
+
+			this.isNot = isNot;
+
+			// 123, >123, <123, >=123, <=123, >-123, >=-123, 123-456, -123--456
+			if (arg.equals("") && end == null) { // 123
+				this.start = Integer.parseInt(start);
+				this.end = this.start;
+			} else if (arg.equals(">")) {
+				this.start = Integer.parseInt(start)+1;
+				this.end = Integer.MAX_VALUE;
+			} else if (arg.equals(">=")) {
+				this.start = Integer.parseInt(start);
+				this.end = Integer.MAX_VALUE;
+			} else if (arg.equals("<")) {
+				this.start = Integer.MIN_VALUE;
+				this.end = Integer.parseInt(start)-1;
+			} else if (arg.equals("<=")) {
+				this.start = Integer.MIN_VALUE;
+				this.end = Integer.parseInt(start);
+			} else {
+				this.start = Integer.parseInt(start);
+				this.end = Integer.parseInt(end);
+			}
+		}
+
+		public boolean matches(Number n) {
+			long i = n.longValue();
+			boolean b = (i>=start && i<=end);
+			if (isNot) b = !b;
+			return b;
+		}
+	}
+
+	//====================================================================================================
+	// DateMatcher
+	//====================================================================================================
+	/** The list of all valid timestamp formats */
+	private SimpleDateFormat[] validTimestampFormats = new SimpleDateFormat[0];
+	{
+		setValidTimestampFormats("yyyy.MM.dd.HH.mm.ss","yyyy.MM.dd.HH.mm","yyyy.MM.dd.HH","yyyy.MM.dd","yyyy.MM","yyyy");
+	}
+
+	/**
+	 * Use this method to override the allowed search patterns when used in locales where time formats are
+	 * different.
+	 * @param s A comma-delimited list of valid time formats.
+	 */
+	public void setValidTimestampFormats(String...s) {
+		validTimestampFormats = new SimpleDateFormat[s.length];
+		for (int i = 0; i < s.length; i++)
+			validTimestampFormats[i] = new SimpleDateFormat(s[i]);
+	}
+
+	private class DateMatcher implements IMatcher<Object> {
+
+		private TimestampPattern[] patterns;
+
+		/**
+		 * Construct a timestamp matcher for the given search pattern.
+		 * @param searchPattern The search pattern.
+		 */
+		DateMatcher(String searchPattern) {
+			patterns = new TimestampPattern[1];
+			patterns[0] = new TimestampPattern(searchPattern);
+
+		}
+
+		/**
+		 * Returns <jk>true</jk> if the specified date matches the pattern passed in through
+		 * 	the contstructor.<br>
+		 * The Object can be of type {@link Date} or {@link Calendar}.<br>
+		 * Always returns <jk>false</jk> on <jk>null</jk> input.
+		 */
+		@Override /* IMatcher */
+		public boolean matches(Object in) {
+			if (in == null) return false;
+
+			Calendar c = null;
+			if (in instanceof Calendar)
+				c = (Calendar)in;
+			else if (in instanceof Date) {
+				c = Calendar.getInstance();
+				c.setTime((Date)in);
+			} else {
+				return false;
+			}
+			for (int i = 0; i < patterns.length; i++) {
+				if (! patterns[i].matches(c))
+					return false;
+			}
+			return true;
+		}
+	}
+
+	/**
+	 * A construct representing a single search pattern.
+	 */
+	private class TimestampPattern {
+		TimestampRange[] ranges;
+		List<TimestampRange> l = new LinkedList<TimestampRange>();
+
+		public TimestampPattern(String s) {
+
+			// Handle special case where timestamp is enclosed in quotes.
+			// This can occur on hyperlinks created by group-by queries.
+			// e.g. '2007/01/29 04:17:43 PM'
+			if (s.charAt(0) == '\'' && s.charAt(s.length()-1) == '\'')
+				s = s.substring(1, s.length()-1);
+
+			// Pattern for finding <,>,<=,>=
+			Pattern p1 = Pattern.compile("^\\s*([<>](?:=)?)\\s*(\\S+.*)$");
+			// Pattern for finding range dash (e.g. xxx - yyy)
+			Pattern p2 = Pattern.compile("^(\\s*-\\s*)(\\S+.*)$");
+
+			// States are...
+			// 1 - Looking for <,>,<=,>=
+			// 2 - Looking for single date.
+			// 3 - Looking for start date.
+			// 4 - Looking for -
+			// 5 - Looking for end date.
+			int state = 1;
+
+			String op = null;
+			CalendarP startDate = null;
+
+			ParsePosition pp = new ParsePosition(0);
+			Matcher m = null;
+			String seg = s;
+
+			while (! seg.equals("") || state != 1) {
+				if (state == 1) {
+					m = p1.matcher(seg);
+					if (m.matches()) {
+						op = m.group(1);
+						seg = m.group(2);
+						state = 2;
+					} else {
+						state = 3;
+					}
+				} else if (state == 2) {
+					l.add(new TimestampRange(op, parseDate(seg, pp)));
+					//tokens.add("^"+op + parseTimestamp(seg, pp));
+					seg = seg.substring(pp.getIndex()).trim();
+					pp.setIndex(0);
+					state = 1;
+				} else if (state == 3) {
+					startDate = parseDate(seg, pp);
+					seg = seg.substring(pp.getIndex()).trim();
+					pp.setIndex(0);
+					state = 4;
+				} else if (state == 4) {
+					// Look for '-'
+					m = p2.matcher(seg);
+					if (m.matches()) {
+						state = 5;
+						seg = m.group(2);
+					} else {
+						// This is a single date (e.g. 2002/01/01)
+						l.add(new TimestampRange(startDate));
+						state = 1;
+					}
+				} else if (state == 5) {
+					l.add(new TimestampRange(startDate, parseDate(seg, pp)));
+					seg = seg.substring(pp.getIndex()).trim();
+					pp.setIndex(0);
+					state = 1;
+				}
+			}
+
+			ranges = l.toArray(new TimestampRange[l.size()]);
+		}
+
+		public boolean matches(Calendar c) {
+			if (ranges.length == 0) return true;
+			for (int i = 0; i < ranges.length; i++)
+				if (ranges[i].matches(c))
+					return true;
+			return false;
+		}
+	}
+
+	/**
+	 * A construct representing a single search range in a single search pattern.
+	 * All possible forms of search patterns are boiled down to these timestamp ranges.
+	 */
+	private static class TimestampRange {
+		Calendar start;
+		Calendar end;
+
+		public TimestampRange(CalendarP start, CalendarP end) {
+			this.start = start.copy().roll(MILLISECOND, -1).getCalendar();
+			this.end = end.roll(1).getCalendar();
+		}
+
+		public TimestampRange(CalendarP singleDate) {
+			this.start = singleDate.copy().roll(MILLISECOND, -1).getCalendar();
+			this.end = singleDate.roll(1).getCalendar();
+		}
+
+		public TimestampRange(String op, CalendarP singleDate) {
+			if (op.equals(">")) {
+				this.start = singleDate.roll(1).roll(MILLISECOND, -1).getCalendar();
+				this.end = new CalendarP(new Date(Long.MAX_VALUE), 0).getCalendar();
+			} else if (op.equals("<")) {
+				this.start = new CalendarP(new Date(0), 0).getCalendar();
+				this.end = singleDate.getCalendar();
+			} else if (op.equals(">=")) {
+				this.start = singleDate.roll(MILLISECOND, -1).getCalendar();
+				this.end = new CalendarP(new Date(Long.MAX_VALUE), 0).getCalendar();
+			} else if (op.equals("<=")) {
+				this.start = new CalendarP(new Date(0), 0).getCalendar();
+				this.end = singleDate.roll(1).getCalendar();
+			}
+		}
+
+		public boolean matches(Calendar c) {
+			boolean b = (c.after(start) && c.before(end));
+			return b;
+		}
+	}
+
+	private static int getPrecisionField(String pattern) {
+		if (pattern.indexOf('s') != -1)
+			return SECOND;
+		if (pattern.indexOf('m') != -1)
+			return MINUTE;
+		if (pattern.indexOf('H') != -1)
+			return HOUR_OF_DAY;
+		if (pattern.indexOf('d') != -1)
+			return DAY_OF_MONTH;
+		if (pattern.indexOf('M') != -1)
+			return MONTH;
+		if (pattern.indexOf('y') != -1)
+			return YEAR;
+		return Calendar.MILLISECOND;
+	}
+
+
+	/**
+	 * Parses a timestamp string off the beginning of the string segment 'seg'.
+	 * Goes through each possible valid timestamp format until it finds a match.
+	 * The position where the parsing left off is stored in pp.
+	 * @param seg The string segment being parsed.
+	 * @param pp Where parsing last left off.
+	 * @return An object represening a timestamp.
+	 */
+	protected CalendarP parseDate(String seg, ParsePosition pp) {
+
+		CalendarP cal = null;
+
+		for (int i = 0; i < validTimestampFormats.length && cal == null; i++) {
+			pp.setIndex(0);
+			SimpleDateFormat f = validTimestampFormats[i];
+			Date d = f.parse(seg, pp);
+			int idx = pp.getIndex();
+			if (idx != 0) {
+				// it only counts if the next character is '-', 'space', or end-of-string.
+				char c = (seg.length() == idx ? 0 : seg.charAt(idx));
+				if (c == 0 || c == '-' || Character.isWhitespace(c))
+					cal = new CalendarP(d, getPrecisionField(f.toPattern()));
+			}
+		}
+
+		if (cal == null) throw new RuntimeException("Invalid date encountered:  ["+seg+"]");
+
+		return cal;
+	}
+
+	/**
+	 * Combines a Calendar with a precision identifier.
+	 */
+	private static class CalendarP {
+		public Calendar c;
+		public int precision;
+
+		public CalendarP(Date date, int precision) {
+			c = Calendar.getInstance();
+			c.setTime(date);
+			this.precision = precision;
+		}
+
+		public CalendarP copy() {
+			return new CalendarP(c.getTime(), precision);
+		}
+
+		public CalendarP roll(int field, int amount) {
+			c.add(field, amount);
+			return this;
+		}
+
+		public CalendarP roll(int amount) {
+			return roll(precision, amount);
+		}
+
+		public Calendar getCalendar() {
+			return c;
+		}
+	}
+
+	//====================================================================================================
+	// StringMatcher
+	//====================================================================================================
+	private static class StringMatcher implements IMatcher<Object> {
+
+		private SearchPattern[] searchPatterns;
+
+		/**
+		 * Construct a string matcher for the given search pattern.
+		 * @param searchPattern The search pattern.  See class usage for details.
+		 * @param ignoreCase If <jk>true</jk>, use case-insensitive matching.
+		 */
+		public StringMatcher(String searchPattern, boolean ignoreCase) {
+			this.searchPatterns = new SearchPattern[1];
+			this.searchPatterns[0] = new SearchPattern(searchPattern, ignoreCase);
+		}
+
+		/**
+		 * Returns 'true' if this string matches the pattern(s).
+		 * Always returns false on null input.
+		 */
+		@Override /* IMatcher */
+		public boolean matches(Object in) {
+			if (in == null) return false;
+			for (int i = 0; i < searchPatterns.length; i++) {
+				if (! searchPatterns[i].matches(in.toString()))
+					return false;
+			}
+			return true;
+		}
+
+	}
+	/**
+	 * A construct representing a single search pattern.
+	 */
+	private static class SearchPattern {
+		Pattern[] orPatterns, andPatterns, notPatterns;
+
+		public SearchPattern(String searchPattern, boolean ignoreCase) {
+
+			List<Pattern> ors = new LinkedList<Pattern>();
+			List<Pattern> ands = new LinkedList<Pattern>();
+			List<Pattern> nots = new LinkedList<Pattern>();
+
+			for (String arg : breakUpTokens(searchPattern)) {
+				char prefix = arg.charAt(0);
+				String token = arg.substring(1);
+
+				token = token.replaceAll("([\\?\\*\\+\\\\\\[\\]\\{\\}\\(\\)\\^\\$\\.])", "\\\\$1");
+				token = token.replace("\u9997", ".*");
+				token = token.replace("\u9996", ".?");
+
+				if (! token.startsWith(".*"))
+					token = "^" + token;
+				if (! token.endsWith(".*"))
+					token = token + "$";
+
+				int flags = Pattern.DOTALL;
+				if (ignoreCase)
+					flags |= Pattern.CASE_INSENSITIVE;
+
+				Pattern p = Pattern.compile(token, flags);
+
+				if (prefix == '^')
+					ors.add(p);
+				else if (prefix == '+')
+					ands.add(p);
+				else if (prefix == '-')
+					nots.add(p);
+			}
+			orPatterns = ors.toArray(new Pattern[ors.size()]);
+			andPatterns = ands.toArray(new Pattern[ands.size()]);
+			notPatterns = nots.toArray(new Pattern[nots.size()]);
+		}
+
+		/**
+		 * Break up search pattern into separate tokens.
+		 */
+		private List<String> breakUpTokens(String s) {
+
+			// If the string is null or all whitespace, return an empty vector.
+			if (s == null || s.trim().length() == 0)
+				return Collections.emptyList();
+
+			// Pad with spaces.
+			s = " " + s + " ";
+
+			// Replace instances of [+] and [-] inside single and double quotes with
+			// \u2001 and \u2002 for later replacement.
+			int escapeCount = 0;
+			boolean inSingleQuote = false;
+			boolean inDoubleQuote = false;
+			char[] ca = s.toCharArray();
+			for (int i = 0; i < ca.length; i++) {
+				if (ca[i] == '\\') escapeCount++;
+				else if (escapeCount % 2 == 0) {
+					if (ca[i] == '\'') inSingleQuote = ! inSingleQuote;
+					else if (ca[i] == '"') inDoubleQuote = ! inDoubleQuote;
+					else if (ca[i] == '+' && (inSingleQuote || inDoubleQuote)) ca[i] = '\u9999';
+					else if (ca[i] == '-' && (inSingleQuote || inDoubleQuote)) ca[i] = '\u9998';
+				}
+				if (ca[i] != '\\') escapeCount = 0;
+			}
+			s = new String(ca);
+
+			// Remove spaces between '+' or '-' and the keyword.
+			//s = perl5Util.substitute("s/([\\+\\-])\\s+/$1/g", s);
+			s = s.replaceAll("([\\+\\-])\\s+", "$1");
+
+			// Replace:  [*]->[\u3001] as placeholder for '%', ignore escaped.
+			s = replace(s, '*', '\u9997', true);
+			// Replace:  [?]->[\u3002] as placeholder for '_', ignore escaped.
+			s = replace(s, '?', '\u9996', true);
+			// Replace:  [\*]->[*], [\?]->[?]
+			s = unEscapeChars(s, new char[]{'*','?'});
+
+			// Remove spaces
+			s = s.trim();
+
+			// Re-replace the [+] and [-] characters inside quotes.
+			s = s.replace('\u9999', '+');
+			s = s.replace('\u9998', '-');
+
+			String[] sa = splitQuoted(s, ' ');
+			List<String> l = new ArrayList<String>(sa.length);
+			int numOrs = 0;
+			for (int i = 0; i < sa.length; i++) {
+				String token = sa[i];
+				int len = token.length();
+				if (len > 0) {
+					char c = token.charAt(0);
+					String s2 = null;
+					if ((c == '+' || c == '-') && len > 1)
+						s2 = token.substring(1);
+					else {
+						s2 = token;
+						c = '^';
+						numOrs++;
+					}
+					// Trim off leading and trailing single and double quotes.
+					if (s2.matches("\".*\"") || s2.matches("'.*'"))
+						s2 = s2.substring(1, s2.length()-1);
+
+					// Replace:  [\"]->["]
+					s2 = unEscapeChars(s2, new char[]{'"','\''});
+
+					// Un-escape remaining escaped backslashes.
+					s2 = unEscapeChars(s2, new char[]{'\\'});
+
+					l.add(c + s2);
+				}
+			}
+
+			// If there's a single OR clause, turn it into an AND clause (makes the SQL cleaner).
+			if (numOrs == 1) {
+				int ii = l.size();
+				for (int i = 0; i < ii; i++) {
+					String x = l.get(i);
+					if (x.charAt(0) == '^')
+						l.set(i, '+'+x.substring(1));
+				}
+			}
+			return l;
+		}
+
+		public boolean matches(String input) {
+			if (input == null) return false;
+			for (int i = 0; i < andPatterns.length; i++)
+				if (! andPatterns[i].matcher(input).matches())
+					return false;
+			for (int i = 0; i < notPatterns.length; i++)
+				if (notPatterns[i].matcher(input).matches())
+					return false;
+			for (int i = 0; i < orPatterns.length; i++)
+				if (orPatterns[i].matcher(input).matches())
+					return true;
+			return orPatterns.length == 0;
+		}
+
+	}
+
+	/**
+	 * Same as split(String, char), but does not split on characters inside
+	 * single quotes.
+	 * Does not split on escaped delimiters, and escaped quotes are also ignored.
+	 * Example:
+	 * split("a,b,c",',') -> {"a","b","c"}
+	 * split("a,'b,b,b',c",',') -> {"a","'b,b,b'","c"}
+	 */
+	private static String[] splitQuoted(String s, char c) {
+
+		if (s == null || s.matches("\\s*"))
+			return new String[0];
+
+		List<String> l = new LinkedList<String>();
+		char[] sArray = s.toCharArray();
+		int x1 = 0;
+		int escapeCount = 0;
+		boolean inSingleQuote = false;
+		boolean inDoubleQuote = false;
+		for (int i = 0; i < sArray.length; i++) {
+			if (sArray[i] == '\\') escapeCount++;
+			else if (escapeCount % 2 == 0) {
+				if (sArray[i] == '\'' && ! inDoubleQuote) inSingleQuote = ! inSingleQuote;
+				else if (sArray[i] == '"' && ! inSingleQuote) inDoubleQuote = ! inDoubleQuote;
+				else if (sArray[i] == c && ! inSingleQuote && ! inDoubleQuote) {
+					String s2 = new String(sArray, x1, i-x1).trim();
+					l.add(s2);
+					x1 = i+1;
+				}
+			}
+			if (sArray[i] != '\\') escapeCount = 0;
+		}
+		String s2 = new String(sArray, x1, sArray.length-x1).trim();
+		l.add(s2);
+
+		return l.toArray(new String[l.size()]);
+	}
+
+	/**
+	 * Replaces tokens in a string with a different token.
+	 * replace("A and B and C", "and", "or") -> "A or B or C"
+	 * replace("andandand", "and", "or") -> "ororor"
+	 * replace(null, "and", "or") -> null
+	 * replace("andandand", null, "or") -> "andandand"
+	 * replace("andandand", "", "or") -> "andandand"
+	 * replace("A and B and C", "and", null) -> "A  B  C"
+	 * @param ignoreEscapedChars Specify 'true' if escaped 'from' characters should be ignored.
+	 */
+	static String replace(String s, char from, char to, boolean ignoreEscapedChars) {
+		if (s == null) return null;
+
+		char[] sArray = s.toCharArray();
+
+		int escapeCount = 0;
+		int singleQuoteCount = 0;
+		int doubleQuoteCount = 0;
+		for (int i = 0; i < sArray.length; i++) {
+			char c = sArray[i];
+			if (c == '\\' && ignoreEscapedChars)
+				escapeCount++;
+			else if (escapeCount % 2 == 0) {
+				if (c == from && singleQuoteCount % 2 == 0 && doubleQuoteCount % 2 == 0)
+				sArray[i] = to;
+			}
+			if (sArray[i] != '\\') escapeCount = 0;
+		}
+		return new String(sArray);
+	}
+
+	/**
+	 * Removes escape characters (specified by escapeChar) from the specified characters.
+	 */
+	static String unEscapeChars(String s, char[] toEscape) {
+		char escapeChar = '\\';
+		if (s == null) return null;
+		if (s.length() == 0) return s;
+		StringBuffer sb = new StringBuffer(s.length());
+		char[] sArray = s.toCharArray();
+		for (int i = 0; i < sArray.length; i++) {
+			char c = sArray[i];
+
+			if (c == escapeChar) {
+				if (i+1 != sArray.length) {
+					char c2 = sArray[i+1];
+					boolean isOneOf = false;
+					for (int j = 0; j < toEscape.length && ! isOneOf; j++)
+						isOneOf = (c2 == toEscape[j]);
+					if (isOneOf) {
+						i++;
+					} else if (c2 == escapeChar) {
+						sb.append(escapeChar);
+						i++;
+					}
+				}
+			}
+			sb.append(sArray[i]);
+		}
+		return sb.toString();
+	}
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest$JsonNode.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest$JsonNode.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest$JsonNode.class
new file mode 100755
index 0000000..32b73b8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest$JsonNode.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.class
new file mode 100755
index 0000000..3daabb9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.java
new file mode 100755
index 0000000..6923d65
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRest.java
@@ -0,0 +1,843 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static java.net.HttpURLConnection.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.json.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Provides the ability to perform standard REST operations (GET, PUT, POST, DELETE) against
+ * nodes in a POJO model.  Nodes in the POJO model are addressed using URLs.
+ * <p>
+ * 	A POJO model is defined as a tree model where nodes consist of consisting of the following:
+ * 	<ul>
+ * 		<li>{@link Map Maps} and Java beans representing JSON objects.
+ * 		<li>{@link Collection Collections} and arrays representing JSON arrays.
+ * 		<li>Java beans.
+ * 	</ul>
+ * <p>
+ * 	Leaves of the tree can be any type of object.
+ * <p>
+ * 	Use {@link #get(String) get()} to retrieve an element from a JSON tree.<br>
+ * 	Use {@link #put(String,Object) put()} to create (or overwrite) an element in a JSON tree.<br>
+ * 	Use {@link #post(String,Object) post()} to add an element to a list in a JSON tree.<br>
+ * 	Use {@link #delete(String) delete()} to remove an element from a JSON tree.<br>
+ * <p>
+ * 	Leading slashes in URLs are ignored.  So <js>"/xxx/yyy/zzz"</js> and <js>"xxx/yyy/zzz"</js> are considered identical.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct an unstructured POJO model</jc>
+ * 	ObjectMap m = <jk>new</jk> ObjectMap(<js>""</js>
+ * 		+ <js>"{"</js>
+ * 		+ <js>"	name:'John Smith', "</js>
+ * 		+ <js>"	address:{ "</js>
+ * 		+ <js>"		streetAddress:'21 2nd Street', "</js>
+ * 		+ <js>"		city:'New York', "</js>
+ * 		+ <js>"		state:'NY', "</js>
+ * 		+ <js>"		postalCode:10021 "</js>
+ * 		+ <js>"	}, "</js>
+ * 		+ <js>"	phoneNumbers:[ "</js>
+ * 		+ <js>"		'212 555-1111', "</js>
+ * 		+ <js>"		'212 555-2222' "</js>
+ * 		+ <js>"	], "</js>
+ * 		+ <js>"	additionalInfo:null, "</js>
+ * 		+ <js>"	remote:false, "</js>
+ * 		+ <js>"	height:62.4, "</js>
+ * 		+ <js>"	'fico score':' &gt; 640' "</js>
+ * 		+ <js>"} "</js>
+ * 	);
+ *
+ * 	<jc>// Wrap Map inside a PojoRest object</jc>
+ * 	PojoRest johnSmith = <jk>new</jk> PojoRest(m);
+ *
+ * 	<jc>// Get a simple value at the top level</jc>
+ * 	<jc>// "John Smith"</jc>
+ * 	String name = johnSmith.getString(<js>"name"</js>);
+ *
+ * 	<jc>// Change a simple value at the top level</jc>
+ * 	johnSmith.put(<js>"name"</js>, <js>"The late John Smith"</js>);
+ *
+ * 	<jc>// Get a simple value at a deep level</jc>
+ * 	<jc>// "21 2nd Street"</jc>
+ * 	String streetAddress = johnSmith.getString(<js>"address/streetAddress"</js>);
+ *
+ * 	<jc>// Set a simple value at a deep level</jc>
+ * 	johnSmith.put(<js>"address/streetAddress"</js>, <js>"101 Cemetery Way"</js>);
+ *
+ * 	<jc>// Get entries in a list</jc>
+ * 	<jc>// "212 555-1111"</jc>
+ * 	String firstPhoneNumber = johnSmith.getString(<js>"phoneNumbers/0"</js>);
+ *
+ * 	<jc>// Add entries to a list</jc>
+ * 	johnSmith.post(<js>"phoneNumbers"</js>, <js>"212 555-3333"</js>);
+ *
+ * 	<jc>// Delete entries from a model</jc>
+ * 	johnSmith.delete(<js>"fico score"</js>);
+ *
+ * 	<jc>// Add entirely new structures to the tree</jc>
+ * 	ObjectMap medicalInfo = new ObjectMap(<js>""</js>
+ * 		+ <js>"{"</js>
+ * 		+ <js>"	currentStatus: 'deceased',"</js>
+ * 		+ <js>"	health: 'non-existent',"</js>
+ * 		+ <js>"	creditWorthiness: 'not good'"</js>
+ * 		+ <js>"}"</js>
+ * 	);
+ * 	johnSmith.put(<js>"additionalInfo/medicalInfo"</js>, medicalInfo);
+ * <p>
+ * 	In the special case of collections/arrays of maps/beans, a special XPath-like selector notation
+ * 	can be used in lieu of index numbers on GET requests to return a map/bean with a specified attribute value.<br>
+ * 	The syntax is {@code @attr=val}, where attr is the attribute name on the child map, and val is the matching value.
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Get map/bean with name attribute value of 'foo' from a list of items</jc>
+ * 	Map m = pojoRest.getMap(<js>"/items/@name=foo"</js>);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({"unchecked","rawtypes"})
+public final class PojoRest {
+
+	/** The list of possible request types. */
+	private static final int GET=1, PUT=2, POST=3, DELETE=4;
+
+	private ReaderParser parser = JsonParser.DEFAULT;
+	private final BeanContext bc;
+
+	/** If true, the root cannot be overwritten */
+	private boolean rootLocked = false;
+
+	/** The root of the model. */
+	private JsonNode root;
+
+	/**
+	 * Create a new instance of a REST interface over the specified object.
+	 * <p>
+	 * 	Uses {@link BeanContext#DEFAULT} for working with Java beans.
+	 *
+	 * @param o The object to be wrapped.
+	 */
+	public PojoRest(Object o) {
+		this(o, null);
+	}
+
+	/**
+	 * Create a new instance of a REST interface over the specified object.
+	 * <p>
+	 * 	The parser is used as the bean context.
+	 *
+	 * @param o The object to be wrapped.
+	 * @param parser The parser to use for parsing arguments and converting objects to the correct data type.
+	 */
+	public PojoRest(Object o, ReaderParser parser) {
+		if (parser == null)
+			parser = JsonParser.DEFAULT;
+		this.parser = parser;
+		this.bc = parser.getBeanContext();
+		this.root = new JsonNode(null, null, o, bc.object());
+	}
+
+	/**
+	 * Call this method to prevent the root object from being overwritten on put("", xxx); calls.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public PojoRest setRootLocked() {
+		this.rootLocked = true;
+		return this;
+	}
+
+	/**
+	 * The root object that was passed into the constructor of this method.
+	 *
+	 * @return The root object.
+	 */
+	public Object getRootObject() {
+		return root.o;
+	}
+
+	/**
+	 * Retrieves the element addressed by the URL.
+	 *
+	 * @param url The URL of the element to retrieve.
+	 * 		If null or blank, returns the root.
+	 * @return The addressed element, or null if that element does not exist in the tree.
+	 */
+	public Object get(String url) {
+		return get(url, null);
+	}
+
+	/**
+	 * Retrieves the element addressed by the URL.
+	 *
+	 * @param url The URL of the element to retrieve.
+	 * 		If null or blank, returns the root.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The addressed element, or null if that element does not exist in the tree.
+	 */
+	public Object get(String url, Object defVal) {
+		Object o = service(GET, url, null);
+		return o == null ? defVal : o;
+	}
+
+	/**
+	 * Retrieves the element addressed by the URL as the specified object type.
+	 * <p>
+	 * Will convert object to the specified type per {@link BeanContext#convertToType(Object, ClassMeta)}.
+	 *
+	 * @param type The specified object type.
+	 * @param url The URL of the element to retrieve.
+	 * 		If null or blank, returns the root.
+	 * @param <T> The specified object type.
+	 *
+	 * @return The addressed element, or null if that element does not exist in the tree.
+	 */
+	public <T> T get(Class<T> type, String url) {
+		return get(type, url, null);
+	}
+
+	/**
+	 * Retrieves the element addressed by the URL as the specified object type.
+	 * <p>
+	 * Will convert object to the specified type per {@link BeanContext#convertToType(Object, ClassMeta)}.
+	 *
+	 * @param type The specified object type.
+	 * @param url The URL of the element to retrieve.
+	 * 		If null or blank, returns the root.
+	 * @param def The default value if addressed item does not exist.
+	 * @param <T> The specified object type.
+	 *
+	 * @return The addressed element, or null if that element does not exist in the tree.
+	 */
+	public <T> T get(Class<T> type, String url, T def) {
+		Object o = service(GET, url, null);
+		if (o == null)
+			return def;
+		return bc.convertToType(o, type);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link String}.
+	 * <p>
+	 * 	Shortcut for <code>get(String.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 */
+	public String getString(String url) {
+		return get(String.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link String}.
+	 * <p>
+	 * 	Shortcut for <code>get(String.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 */
+	public String getString(String url, String defVal) {
+		return get(String.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to an {@link Integer}.
+	 * <p>
+	 * 	Shortcut for <code>get(Integer.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer getInt(String url) {
+		return get(Integer.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to an {@link Integer}.
+	 * <p>
+	 * 	Shortcut for <code>get(Integer.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Integer getInt(String url, Integer defVal) {
+		return get(Integer.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Long}.
+	 * <p>
+	 * 	Shortcut for <code>get(Long.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long getLong(String url) {
+		return get(Long.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Long}.
+	 * <p>
+	 * 	Shortcut for <code>get(Long.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Long getLong(String url, Long defVal) {
+		return get(Long.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Boolean}.
+	 * <p>
+	 * 	Shortcut for <code>get(Boolean.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean getBoolean(String url) {
+		return get(Boolean.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Boolean}.
+	 * <p>
+	 * 	Shortcut for <code>get(Boolean.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Boolean getBoolean(String url, Boolean defVal) {
+		return get(Boolean.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(Map.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> getMap(String url) {
+		return get(Map.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(Map.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public Map<?,?> getMap(String url, Map<?,?> defVal) {
+		return get(Map.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link List}.
+	 * <p>
+	 * 	Shortcut for <code>get(List.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> getList(String url) {
+		return get(List.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link List}.
+	 * <p>
+	 * 	Shortcut for <code>get(List.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public List<?> getList(String url, List<?> defVal) {
+		return get(List.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link Map}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectMap.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap getObjectMap(String url) {
+		return get(ObjectMap.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectMap}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectMap.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectMap getObjectMap(String url, ObjectMap defVal) {
+		return get(ObjectMap.class, url, defVal);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectList}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectList.<jk>class</jk>, key)</code>.
+	 *
+	 * @param url The key.
+	 * @return The converted value, or <jk>null</jk> if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList getObjectList(String url) {
+		return get(ObjectList.class, url);
+	}
+
+	/**
+	 * Returns the specified entry value converted to a {@link ObjectList}.
+	 * <p>
+	 * 	Shortcut for <code>get(ObjectList.<jk>class</jk>, key, defVal)</code>.
+	 *
+	 * @param url The key.
+	 * @param defVal The default value if the map doesn't contain the specified mapping.
+	 * @return The converted value, or the default value if the map contains no mapping for this key.
+	 * @throws InvalidDataConversionException If value cannot be converted.
+	 */
+	public ObjectList getObjectList(String url, ObjectList defVal) {
+		return get(ObjectList.class, url, defVal);
+	}
+
+	/**
+	 * Executes the specified method with the specified parameters on the specified object.
+	 *
+	 * @param url The URL of the element to retrieve.
+	 * @param method The method signature.
+	 * 	<p>
+	 * 		Can be any of the following formats:
+	 * 	</p>
+	 * 	<ul>
+	 * 		<li>Method name only.  e.g. <js>"myMethod"</js>.
+	 * 		<li>Method name with class names.  e.g. <js>"myMethod(String,int)"</js>.
+	 * 		<li>Method name with fully-qualified class names.  e.g. <js>"myMethod(java.util.String,int)"</js>.
+	 * 	</ul>
+	 * 	<p>
+	 * 		As a rule, use the simplest format needed to uniquely resolve a method.
+	 * 	</p>
+	 * @param args The arguments to pass as parameters to the method.<br>
+	 * 	These will automatically be converted to the appropriate object type if possible.<br>
+	 * 	This must be an array, like a JSON array.
+	 * @return The returned object from the method call.
+	 * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible.
+	 * @throws IllegalArgumentException If one of the following occurs:
+	 * 	<ul>
+	 * 		<li>The number of actual and formal parameters differ.
+	 * 		<li>An unwrapping conversion for primitive arguments fails.
+	 * 		<li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion.
+	 * 		<li>The constructor pertains to an enum type.
+	 * 	</ul>
+	 * @throws InvocationTargetException If the underlying constructor throws an exception.
+	 * @throws ParseException If the input contains a syntax error or is malformed.
+	 * @throws NoSuchMethodException
+	 * @throws IOException
+	 */
+	public Object invokeMethod(String url, String method, String args) throws InvocationTargetException, IllegalArgumentException, IllegalAccessException, ParseException, NoSuchMethodException, IOException {
+		return new PojoIntrospector(get(url), parser).invokeMethod(method, args);
+	}
+
+	/**
+	 * Returns the list of available methods that can be passed to the {@link #invokeMethod(String, String, String)} for the object
+	 * 	addressed by the specified URL.
+	 *
+	 * @param url The URL.
+	 * @return The list of methods.
+	 */
+	public Collection<String> getPublicMethods(String url) {
+		Object o = get(url);
+		if (o == null)
+			return null;
+		return bc.getClassMeta(o.getClass()).getPublicMethods().keySet();
+	}
+
+	/**
+	 * Returns the class type of the object at the specified URL.
+	 *
+	 * @param url The URL.
+	 * @return The class type.
+	 */
+	public ClassMeta getClassMeta(String url) {
+		JsonNode n = getNode(normalizeUrl(url), root);
+		if (n == null)
+			return null;
+		return n.cm;
+	}
+
+	/**
+	 * Sets/replaces the element addressed by the URL.
+	 * <p>
+	 * 	This method expands the POJO model as necessary to create the new element.
+	 *
+	 * @param url The URL of the element to create.
+	 * 		If <jk>null</jk> or blank, the root itself is replaced with the specified value.
+	 * @param val The value being set.  Value can be of any type.
+	 * @return The previously addressed element, or <jk>null</jk> the element did not previously exist.
+	 */
+	public Object put(String url, Object val) {
+		return service(PUT, url, val);
+	}
+
+	/**
+	 * Adds a value to a list element in a POJO model.
+	 * <p>
+	 * 	The URL is the address of the list being added to.
+	 * <p>
+	 * 	If the list does not already exist, it will be created.
+	 * <p>
+	 * 	This method expands the POJO model as necessary to create the new element.
+	 * <p>
+	 * 	Note:  You can only post to three types of nodes:
+	 * 	<ul>
+	 * 		<li>{@link List Lists}
+	 * 		<li>{@link Map Maps} containing integers as keys (i.e sparse arrays)
+	 * 		<li>arrays
+	 * 	</ul>
+	 *
+	 * @param url The URL of the element being added to.
+	 * 		If null or blank, the root itself (assuming it's one of the types specified above) is added to.
+	 * @param val The value being added.
+	 * @return The URL of the element that was added.
+	 */
+	public String post(String url, Object val) {
+		return (String)service(POST, url, val);
+	}
+
+	/**
+	 * Remove an element from a POJO model.
+	 * <p>
+	 * qIf the element does not exist, no action is taken.
+	 *
+	 * @param url The URL of the element being deleted.
+	 * 		If <jk>null</jk> or blank, the root itself is deleted.
+	 * @return The removed element, or null if that element does not exist.
+	 */
+	public Object delete(String url) {
+		return service(DELETE, url, null);
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return String.valueOf(root.o);
+	}
+
+	/** Handle nulls and strip off leading '/' char. */
+	private String normalizeUrl(String url) {
+
+		// Interpret nulls and blanks the same (i.e. as addressing the root itself)
+		if (url == null)
+			url = "";
+
+		// Strip off leading slash if present.
+		if (url.length() > 0 && url.charAt(0) == '/')
+			url = url.substring(1);
+
+		return url;
+	}
+
+
+	/*
+	 * Workhorse method.
+	 */
+	private Object service(int method, String url, Object val) throws PojoRestException {
+
+		url = normalizeUrl(url);
+
+		if (method == GET) {
+			JsonNode p = getNode(url, root);
+			return p == null ? null : p.o;
+		}
+
+		// Get the url of the parent and the property name of the addressed object.
+		int i = url.lastIndexOf('/');
+		String parentUrl = (i == -1 ? null : url.substring(0, i));
+		String childKey = (i == -1 ? url : url.substring(i + 1));
+
+		if (method == PUT) {
+			if (url.length() == 0) {
+				if (rootLocked)
+					throw new PojoRestException(HTTP_FORBIDDEN, "Cannot overwrite root object");
+				Object o = root.o;
+				root = new JsonNode(null, null, val, bc.object());
+				return o;
+			}
+			JsonNode n = (parentUrl == null ? root : getNode(parentUrl, root));
+			if (n == null)
+				throw new PojoRestException(HTTP_NOT_FOUND, "Node at URL ''{0}'' not found.", parentUrl);
+			ClassMeta cm = n.cm;
+			Object o = n.o;
+			if (cm.isMap())
+				return ((Map)o).put(childKey, convert(val, cm.getValueType()));
+			if (cm.isCollection() && o instanceof List)
+				return ((List)o).set(parseInt(childKey), convert(val, cm.getElementType()));
+			if (cm.isArray()) {
+				o = setArrayEntry(n.o, parseInt(childKey), val, cm.getElementType());
+				ClassMeta pct = n.parent.cm;
+				Object po = n.parent.o;
+				if (pct.isMap()) {
+					((Map)po).put(n.keyName, o);
+					return url;
+				}
+				if (pct.isBean()) {
+					BeanMap m = bc.forBean(po);
+					m.put(n.keyName, o);
+					return url;
+				}
+				throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform PUT on ''{0}'' with parent node type ''{1}''", url, pct);
+			}
+			if (cm.isBean())
+				return bc.forBean(o).put(childKey, val);
+			throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform PUT on ''{0}'' whose parent is of type ''{1}''", url, cm);
+		}
+
+		if (method == POST) {
+			// Handle POST to root special
+			if (url.length() == 0) {
+				ClassMeta cm = root.cm;
+				Object o = root.o;
+				if (cm.isCollection()) {
+					Collection c = (Collection)o;
+					c.add(convert(val, cm.getElementType()));
+					return (c instanceof List ? url + "/" + (c.size()-1) : null);
+				}
+				if (cm.isArray()) {
+					Object[] o2 = addArrayEntry(o, val, cm.getElementType());
+					root = new JsonNode(null, null, o2, null);
+					return url + "/" + (o2.length-1);
+				}
+				throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform POST on ''{0}'' of type ''{1}''", url, cm);
+			}
+			JsonNode n = getNode(url, root);
+			if (n == null)
+				throw new PojoRestException(HTTP_NOT_FOUND, "Node at URL ''{0}'' not found.", url);
+			ClassMeta cm = n.cm;
+			Object o = n.o;
+			if (cm.isArray()) {
+				Object[] o2 = addArrayEntry(o, val, cm.getElementType());
+				ClassMeta pct = n.parent.cm;
+				Object po = n.parent.o;
+				if (pct.isMap()) {
+					((Map)po).put(childKey, o2);
+					return url + "/" + (o2.length-1);
+				}
+				if (pct.isBean()) {
+					BeanMap m = bc.forBean(po);
+					m.put(childKey, o2);
+					return url + "/" + (o2.length-1);
+				}
+				throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform POST on ''{0}'' with parent node type ''{1}''", url, pct);
+			}
+			if (cm.isCollection()) {
+				Collection c = (Collection)o;
+				c.add(convert(val, cm.getElementType()));
+				return (c instanceof List ? url + "/" + (c.size()-1) : null);
+			}
+			throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform POST on ''{0}'' of type ''{1}''", url, cm);
+		}
+
+		if (method == DELETE) {
+			if (url.length() == 0) {
+				if (rootLocked)
+					throw new PojoRestException(HTTP_FORBIDDEN, "Cannot overwrite root object");
+				Object o = root.o;
+				root = new JsonNode(null, null, null, bc.object());
+				return o;
+			}
+			JsonNode n = (parentUrl == null ? root : getNode(parentUrl, root));
+			ClassMeta cm = n.cm;
+			Object o = n.o;
+			if (cm.isMap())
+				return ((Map)o).remove(childKey);
+			if (cm.isCollection() && o instanceof List)
+				return ((List)o).remove(parseInt(childKey));
+			if (cm.isArray()) {
+				int index = parseInt(childKey);
+				Object old = ((Object[])o)[index];
+				Object[] o2 = removeArrayEntry(o, index);
+				ClassMeta pct = n.parent.cm;
+				Object po = n.parent.o;
+				if (pct.isMap()) {
+					((Map)po).put(n.keyName, o2);
+					return old;
+				}
+				if (pct.isBean()) {
+					BeanMap m = bc.forBean(po);
+					m.put(n.keyName, o2);
+					return old;
+				}
+				throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform POST on ''{0}'' with parent node type ''{1}''", url, pct);
+			}
+			if (cm.isBean())
+				return bc.forBean(o).put(childKey, null);
+			throw new PojoRestException(HTTP_BAD_REQUEST, "Cannot perform PUT on ''{0}'' whose parent is of type ''{1}''", url, cm);
+		}
+
+		return null;	// Never gets here.
+	}
+
+	private Object[] setArrayEntry(Object o, int index, Object val, ClassMeta componentType) {
+		Object[] a = (Object[])o;
+		if (a.length <= index) {
+			// Expand out the array.
+			Object[] a2 = (Object[])Array.newInstance(a.getClass().getComponentType(), index+1);
+			System.arraycopy(a, 0, a2, 0, a.length);
+			a = a2;
+		}
+		a[index] = convert(val, componentType);
+		return a;
+	}
+
+	private Object[] addArrayEntry(Object o, Object val, ClassMeta componentType) {
+		Object[] a = (Object[])o;
+		// Expand out the array.
+		Object[] a2 = (Object[])Array.newInstance(a.getClass().getComponentType(), a.length+1);
+		System.arraycopy(a, 0, a2, 0, a.length);
+		a2[a.length] = convert(val, componentType);
+		return a2;
+	}
+
+	private Object[] removeArrayEntry(Object o, int index) {
+		Object[] a = (Object[])o;
+		// Shrink the array.
+		Object[] a2 = (Object[])Array.newInstance(a.getClass().getComponentType(), a.length-1);
+		System.arraycopy(a, 0, a2, 0, index);
+		System.arraycopy(a, index+1, a2, index, a.length-index-1);
+		return a2;
+	}
+
+	class JsonNode {
+		Object o;
+		ClassMeta cm;
+		JsonNode parent;
+		String keyName;
+
+		JsonNode(JsonNode parent, String keyName, Object o, ClassMeta cm) {
+			this.o = o;
+			this.keyName = keyName;
+			this.parent = parent;
+			if (cm == null || cm.isObject()) {
+				if (o == null)
+					cm = bc.object();
+				else
+					cm = bc.getClassMetaForObject(o);
+			}
+			this.cm = cm;
+		}
+	}
+
+	JsonNode getNode(String url, JsonNode n) {
+		if (url == null || url.isEmpty())
+			return n;
+		int i = url.indexOf('/');
+		String parentKey, childUrl = null;
+		if (i == -1) {
+			parentKey = url;
+		} else {
+			parentKey = url.substring(0, i);
+			childUrl = url.substring(i + 1);
+		}
+
+		Object o = n.o;
+		Object o2 = null;
+		ClassMeta cm = n.cm;
+		ClassMeta ct2 = null;
+		if (o == null)
+			return null;
+		if (cm.isMap()) {
+			o2 = ((Map)o).get(parentKey);
+			ct2 = cm.getValueType();
+		} else if (cm.isCollection() && o instanceof List) {
+			int key = parseInt(parentKey);
+			List l = ((List)o);
+			if (l.size() <= key)
+				return null;
+			o2 = l.get(key);
+			ct2 = cm.getElementType();
+		} else if (cm.isArray()) {
+			int key = parseInt(parentKey);
+			Object[] a = ((Object[])o);
+			if (a.length <= key)
+				return null;
+			o2 = a[key];
+			ct2 = cm.getElementType();
+		} else if (cm.isBean()) {
+			BeanMap m = bc.forBean(o);
+			o2 = m.get(parentKey);
+			BeanPropertyMeta pMeta = m.getPropertyMeta(parentKey);
+			if (pMeta == null)
+				throw new PojoRestException(HTTP_BAD_REQUEST,
+					"Unknown property ''{0}'' encountered while trying to parse into class ''{1}''",
+					parentKey, m.getClassMeta()
+				);
+			ct2 = pMeta.getClassMeta();
+		}
+
+		if (childUrl == null)
+			return new JsonNode(n, parentKey, o2, ct2);
+
+		return getNode(childUrl, new JsonNode(n, parentKey, o2, ct2));
+	}
+
+	private Object convert(Object in, ClassMeta cm) {
+		if (cm == null)
+			return in;
+		if (cm.isBean() && in instanceof Map)
+			return bc.convertToType(in, cm);
+		return in;
+	}
+
+	private int parseInt(String key) {
+		try {
+			return Integer.parseInt(key);
+		} catch (NumberFormatException e) {
+			throw new PojoRestException(HTTP_BAD_REQUEST,
+				"Cannot address an item in an array with a non-integer key ''{0}''", key
+			);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.class
new file mode 100755
index 0000000..a9c026e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.java
new file mode 100755
index 0000000..86e3934
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/PojoRestException.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.net.*;
+import java.text.*;
+
+/**
+ * Generic exception thrown from the {@link PojoRest} class.
+ * <p>
+ * 	Typically, this is a user-error, such as trying to address a non-existent node in the tree.
+ * <p>
+ * 	The status code is an HTTP-equivalent code.  It will be one of the following:
+ * <ul>
+ * 	<li>{@link HttpURLConnection#HTTP_BAD_REQUEST HTTP_BAD_REQUEST} - Attempting to do something impossible.
+ * 	<li>{@link HttpURLConnection#HTTP_NOT_FOUND HTTP_NOT_FOUND} - Attempting to access a non-existent node in the tree.
+ * 	<li>{@link HttpURLConnection#HTTP_FORBIDDEN HTTP_FORBIDDEN} - Attempting to overwrite the root object.
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class PojoRestException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	private int status;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param status The HTTP-equivalent status code.
+	 * @param message The detailed message.
+	 * @param args Optional message arguments.
+	 */
+	public PojoRestException(int status, String message, Object...args) {
+		super(args.length == 0 ? message : MessageFormat.format(message, args));
+		this.status = status;
+	}
+
+	/**
+	 * The HTTP-equivalent status code.
+	 * <p>
+	 * 	See above for details.
+	 *
+	 * @return The HTTP-equivalent status code.
+	 */
+	public int getStatus() {
+		return status;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$1.class
new file mode 100755
index 0000000..72f4d06
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$2.class
new file mode 100755
index 0000000..9f5f469
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$3.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$3.class
new file mode 100755
index 0000000..b13996a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$4.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$4.class
new file mode 100755
index 0000000..c75c48a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$5.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$5.class
new file mode 100755
index 0000000..d83e166
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$Matcher.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$Matcher.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$Matcher.class
new file mode 100755
index 0000000..9521154
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder$Matcher.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.class
new file mode 100755
index 0000000..5083520
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.class differ


[39/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/package.html b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/package.html
new file mode 100755
index 0000000..407ef7c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/client/com/ibm/juno/client/package.html
@@ -0,0 +1,850 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>REST Client API</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#SSL'>SSL Support</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#SSLOpts'>SSLOpts Bean</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Authentication'>Authentication</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#BASIC'>BASIC Authentication</a></p>
+			<li><p><a class='doclink' href='#FORM'>FORM-based Authentication</a></p>
+			<li><p><a class='doclink' href='#OIDC'>OIDC Authentication</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#ResponsePatterns'>Using Response Patterns</a></p>
+		<li><p><a class='doclink' href='#PipingOutput'>Piping Response Output</a></p>
+		<li><p><a class='doclink' href='#Logging'>Logging</a></p>
+		<li><p><a class='doclink' href='#Interceptors'>Interceptors</a></p>
+		<li><p><a class='doclink' href='#Remoteable'>Remoteable Proxies</a></p>
+		<li><p><a class='doclink' href='#Other'>Other Useful Methods</a></p>
+	</ol>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - REST Client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides an HTTP client API that makes it extremely simple to connect to remote REST interfaces and 
+		seemlessly send and receive serialized POJOs in requests and responses.  
+	</p>
+	<h6 class='notes'>Features:</h6>
+	<ul class='notes'>
+		<li>Converts POJOs directly to HTTP request message bodies using {@link com.ibm.juno.core.serializer.Serializer} classes.
+	 	<li>Converts HTTP response message bodies directly to POJOs using {@link com.ibm.juno.core.parser.Parser} classes.
+		<li>Exposes the full functionality of the Apache HttpClient API by exposing all methods defined on the 
+			{@link org.apache.http.impl.client.HttpClientBuilder} class.
+		<li>Provides various convenience methods for setting up common SSL and authentication methods.
+		<li>Provides a fluent interface that allows you to make complex REST calls in a single line of code.
+	</ul>	
+	<p>
+		The client API is designed to work as a thin layer on top of the proven Apache HttpClient API.  
+		By leveraging the HttpClient library, details such as SSL certificate negotiation, proxies, encoding, etc...
+			are all handled in Apache code. 
+	</p>
+	<p>
+		The Juno client API prereq's Apache HttpClient 4.1.2+. 
+		At a mimimum, the following jars are required:
+	</p>
+	<ul>
+		<li><code>httpclient-4.5.jar</code>
+		<li><code>httpcore-4.4.1.jar</code>
+		<li><code>httpmime-4.5.jar</code>
+	</ul>
+	<h6 class='topic'>Examples</h6>
+	<p class='bcode'>
+	<jc>// Examples below use the Juno Address Book resource example</jc>
+
+	<jc>// Create a reusable client with JSON support</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+	
+	<jc>// GET request, ignoring output</jc>
+	<jk>try</jk> {
+		<jk>int</jk> rc = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>).execute();
+		<jc>// Succeeded!</jc>
+	} <jk>catch</jk> (RestCallException e) {
+		<jc>// Failed!</jc>
+		System.<jsf>err</jsf>.println(
+			String.<jsm>format</jsm>(<js>"status=%s, message=%s"</js>, e.getResponseStatus(), e.getResponseMessage())
+		);
+	}
+			
+	<jc>// Remaining examples ignore thrown exceptions.</jc>		
+			
+	<jc>// GET request, secure, ignoring output</jc>
+	client.doGet(<js>"https://localhost:9443/sample/addressBook"</js>).execute();
+			
+	<jc>// GET request, getting output as a String.  No POJO parsing is performed.
+	// Note that when calling one of the getX() methods, you don't need to call connect() or disconnect(), since
+	//	it's automatically called for you.</jc>
+	String output = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponseAsString();
+			
+	<jc>// GET request, getting output as a Reader</jc>
+	Reader r = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getReader();
+			
+	<jc>// GET request, getting output as an ObjectMap</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	ObjectMap m = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(ObjectMap.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a ObjectList</jc>
+	<jc>// Input must be an array (e.g. "[...]")</jc>
+	ObjectList l = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(ObjectList.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an object (e.g. "{...}")</jc>
+	<jc>// Note that you don't have to do any casting!</jc>
+	Person p = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
+		.getResponse(Person.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed bean</jc>
+	<jc>// Input must be an array of objects (e.g. "[{...},{...}]")</jc>
+	Person[] pa = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(Person[].<jk>class</jk>);
+			
+	<jc>// Same as above, except as a List&lt;Person&gt;</jc>
+	ClassMeta cm = BeanContext.<jsf>DEFAULT</jsf>.getCollectionClassMeta(LinkedList.<jk>class</jk>, Person.<jk>class</jk>);
+	List&lt;Person&gt; pl = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
+		.getResponse(cm);
+			
+	<jc>// GET request, getting output as a parsed string</jc>
+	<jc>// Input must be a string (e.g. "&lt;string&gt;foo&lt;/string&gt;" or "'foo'")</jc>
+	String name = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/name"</js>)
+		.getResponse(String.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed number</jc>
+	<jc>// Input must be a number (e.g. "&lt;number&gt;123&lt;/number&gt;" or "123")</jc>
+	<jk>int</jk> age = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/age"</js>)
+		.getResponse(Integer.<jk>class</jk>);
+			
+	<jc>// GET request, getting output as a parsed boolean</jc>
+	<jc>// Input must be a boolean (e.g. "&lt;boolean&gt;true&lt;/boolean&gt;" or "true")</jc>
+	<jk>boolean</jk> isCurrent = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/addresses/0/isCurrent"</js>)
+		.getResponse(Boolean.<jk>class</jk>);
+			
+	<jc>// GET request, getting a filtered object</jc>
+	client.getParser().addFilters(CalendarFilter.<jsf>ISO8601</jsf>.<jk>class</jk>);
+	Calendar birthDate = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>)
+		.getResponse(GregorianCalendar.<jk>class</jk>);
+
+	<jc>// PUT request on regular field</jc>
+	String newName = <js>"John Smith"</js>;
+	<jk>int</jk> rc = client.doPut(<js>"http://localhost:9080/addressBook/0/name"</js>, newName).execute();
+	
+	<jc>// PUT request on filtered field</jc>
+	Calendar newBirthDate = <jk>new</jk> GregorianCalendar(1, 2, 3, 4, 5, 6);
+	rc = client.doPut(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>, newBirthDate).execute();
+	
+	<jc>// POST of a new entry to a list</jc>
+	Address newAddress = <jk>new</jk> Address(<js>"101 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12121, <jk>false</jk>);
+	rc = client.doPost(<js>"http://localhost:9080/addressBook/0/addresses"</js>, newAddress).execute();	
+	</p>
+	
+	<h6 class='notes'>Notes:</h6>
+	<ul class='notes'>
+		<li><p>The {@link com.ibm.juno.client.RestClient} class exposes all the builder methods on the Apache HttpClient {@link org.apache.http.impl.client.HttpClientBuilder} class.
+			Use these methods to provide any customized HTTP client behavior..</p>
+	</ul>
+	
+	<!-- ======================================================================================================== -->
+	<a id="SSL"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - SSL Support</h3>
+	<div class='topic'>
+		<p>
+			The simplest way to enable SSL support in the client is to use the {@link com.ibm.juno.client.RestClient#enableSSL(SSLOpts)} method
+			and one of the predefined {@link com.ibm.juno.client.SSLOpts} instances:
+			<ul>
+				<li>{@link com.ibm.juno.client.SSLOpts#DEFAULT} - Normal certificate and hostname validation.
+				<li>{@link com.ibm.juno.client.SSLOpts#LAX} - Allows for self-signed certificates.
+			</ul>
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableSSL(SSLOpts.<jsf>LAX</jsf>);
+		
+	<jc>// ...or...</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.enableLaxSSL();
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	
+	HostnameVerifier hv = <jk>new</jk> NoopHostnameVerifier();
+	TrustManager tm = <jk>new</jk> SimpleX509TrustManager(<jk>true</jk>);
+
+	<jk>for</jk> (String p : <jk>new</jk> String[]{<js>"SSL"</js>,<js>"TLS"</js>,<js>"SSL_TLS"</js>}) {
+		SSLContext ctx = SSLContext.<jsm>getInstance</jsm>(p);
+		ctx.init(<jk>null</jk>, <jk>new</jk> TrustManager[] { tm }, <jk>null</jk>);
+		SSLConnectionSocketFactory sf = <jk>new</jk> SSLConnectionSocketFactory(ctx, hv);
+		restClient.setSSLSocketFactory(sf);
+		Registry&lt;ConnectionSocketFactory&gt; r = RegistryBuilder.&lt;ConnectionSocketFactory&gt;<jsm>.create</jsm>().register(<js>"https"</js>, sf).build();
+		restClient.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r));
+	}
+		</p>
+		<p>
+			More complex SSL support can be enabled through the various {@link org.apache.http.impl.client.HttpClientBuilder} methods defined on the class.
+		</p>
+		
+		<!-- ======================================================================================================== -->
+		<a id="SSLOpts"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.1 - SSLOpts Bean</h4>
+		<div class='topic'>
+	<p>
+				The {@link com.ibm.juno.client.SSLOpts} class itself is a bean that can be created by the parsers.
+				For example, SSL options can be specified in a config file and retrieved as a bean using the {@link com.ibm.juno.core.ini.ConfigFile} class.
+	</p>
+			<h6 class='figure'>Contents of <code>MyConfig.cfg</code></h6>
+			<p class='bcode'>
+		<jc>#================================================================================
+		# My Connection Settings
+		#================================================================================</jc>
+		[Connection]
+		url = https://myremotehost:9443
+		ssl = {certValidate:'LAX',hostVerify:'LAX'}
+			</p>
+			<h6 class='figure'>Code that reads an <code>SSLOpts</code> bean from the config file</h6>
+			<p class='bcode'>
+		<jc>// Read config file and set SSL options based on what's in that file.</jc>
+		ConfigFile cf = ConfigMgr.<jsf>DEFAULT</jsf>.get(<js>"MyConfig.cfg"</js>);
+		SSLOpts ssl = cf.getObject(SSLOpts.<jk>class</jk>, <js>"Connection/ssl"</js>);
+		RestClient rc = <jk>new</jk> RestClient().enableSSL(ssl);
+			</p>
+		</div>
+	</div>	
+
+	<!-- ======================================================================================================== -->
+	<a id="Authentication"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - Authentication</h3>
+	<div class='topic'>
+
+		<!-- ======================================================================================================== -->
+		<a id="BASIC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.1 - BASIC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient#setBasicAuth(String,int,String,String)} method can be used to quickly enable
+				BASIC authentication support.
+			</p>
+			<h6 class='topic'>Example:</h6>
+			<p class='bcode'>
+	<jc>// Create a client that performs BASIC authentication using the specified user/pw.</jc>
+	RestClient restClient = <jk>new</jk> RestClient() 
+		.setBasicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>);
+		</p>
+		<p>
+			This is functionally equivalent to the following:
+		</p>
+		<p class='bcode'>
+	RestClient restClient = <jk>new</jk> RestClient();
+	AuthScope scope = <jk>new</jk> AuthScope(<jsf>HOST</jsf>, <jsf>PORT</jsf>);
+	Credentials up = <jk>new</jk> UsernamePasswordCredentials(<jsf>USER</jsf>, <jsf>PW</jsf>);
+	CredentialsProvider p = <jk>new</jk> BasicCredentialsProvider();
+	p.setCredentials(scope, up);
+	restClient.setDefaultCredentialsProvider(p);
+			</p>
+		</div>
+	
+		<!-- ======================================================================================================== -->
+		<a id="FORM"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.2 - FORM-based Authentication</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.client.RestClient} class does not itself provide FORM-based authentication since there
+				is no standard way of providing such support. 
+				Typically, to perform FORM-based or other types of authentication, you'll want to create your own
+				subclass of {@link com.ibm.juno.client.RestClient} and override the {@link com.ibm.juno.client.RestClient#createHttpClient()}
+				method to provide an authenticated client.
+			</p>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				FORM-based authentication support.
+			</p>
+			<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		formBasedAuthenticate(client);
+		visitAuthenticatedURL(client);
+		<jk>return</jk> client;
+	}
+
+	<jc>/*
+	 * Performs form-based authentication against the Jazz server.
+	 */</jc>
+	<jk>private void</jk> formBasedAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		URI uri2 = <jf>jazzUri</jf>.resolve(<js>"j_security_check"</js>);
+		HttpPost request = <jk>new</jk> HttpPost(uri2);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		NameValuePairs params = <jk>new</jk> NameValuePairs()
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_username""</js>, <jf>user</jf>))
+			.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, <jf>pw</jf>));
+		request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> rc = response.getStatusLine().getStatusCode();
+
+			Header authMsg = response.getFirstHeader(<js>"X-com-ibm-team-repository-web-auth-msg"</js>);
+			<jk>if</jk> (authMsg != <jk>null</jk>)
+				<jk>throw new</jk> IOException(authMsg.getValue());
+
+			<jc>// The form auth request should always respond with a 200 ok or 302 redirect code</jc>
+			<jk>if</jk> (rc == <jsf>SC_MOVED_TEMPORARILY</jsf>) {
+				<jk>if</jk> (response.getFirstHeader(<js>"Location"</js>).getValue().matches(<js>"^.*/auth/authfailed.*$"</js>))
+					<jk>throw new</jk> IOException(<js>"Invalid credentials."</js>);
+			} <jk>else if</jk> (rc != <jsf>SC_OK</jsf>) {
+				<jk>throw new</jk> IOException(<js>"Unexpected HTTP status: "</js> + rc);
+			}
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jc>/*
+	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
+	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
+	 * otherwise tomcat will not consider the session authenticated
+	 */</jc>
+	<jk>private int</jk> visitAuthenticatedURL(HttpClient httpClient) <jk>throws</jk> IOException {
+		HttpGet authenticatedURL = <jk>new</jk> HttpGet(<jf>jazzUri</jf>.resolve(<js>"authenticated/identity"</js>));
+		HttpResponse response = httpClient.execute(authenticatedURL);
+		<jk>try</jk> {
+			<jk>return</jk> response.getStatusLine().getStatusCode();
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+			</p>
+		</div>
+		
+		<!-- ======================================================================================================== -->
+		<a id="OIDC"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.2.3 - OIDC Authentication</h4>
+		<div class='topic'>
+			<p>
+				The following example shows how the {@link com.ibm.juno.client.jazz.JazzRestClient} class provides
+				OIDC authentication support.
+			</p>
+	<p class='bcode'>
+	<jd>/**
+	 * Constructor.
+	 */</jd>
+	<jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
+		...
+	}
+
+	<jd>/**
+	 * Override the createHttpClient() method to return an authenticated client.
+	 */</jd>
+	<ja>@Override</ja> <jc>/* RestClient */</jc>
+	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
+		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
+		oidcAuthenticate(client);
+			<jk>return</jk> client;
+		}
+
+	<jk>private void</jk> oidcAuthenticate(HttpClient client) <jk>throws</jk> IOException {
+
+		HttpGet request = <jk>new</jk> HttpGet(<jf>jazzUri</jf>);
+		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
+		
+		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
+		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);
+
+		HttpResponse response = client.execute(request);
+		<jk>try</jk> {
+			<jk>int</jk> code = response.getStatusLine().getStatusCode();
+
+			<jc>// Already authenticated</jc>
+			<jk>if</jk> (code == <jsf>SC_OK</jsf>)
+				<jk>return</jk>;
+
+			<jk>if</jk> (code != <jsf>SC_UNAUTHORIZED</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// x-jsa-authorization-redirect</jc>
+			String redirectUri = getHeader(response, <js>"X-JSA-AUTHORIZATION-REDIRECT"</js>);
+
+			<jk>if</jk> (redirectUri == <jk>null</jk>)
+				<jk>throw new</jk> RestCallException(<js>"Expected a redirect URI during OIDC authentication: "</js> + response.getStatusLine());
+
+			<jc>// Handle Bearer Challenge</jc>
+			HttpGet method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			String loginRequired = getHeader(response, <js>"X-JSA-LOGIN-REQUIRED"</js>);
+
+			<jk>if</jk> (! <js>"true"</js>.equals(loginRequired))
+				<jk>throw new</jk> RestCallException(<js>"X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: "</js> + response.getStatusLine());
+
+			method = <jk>new</jk> HttpGet(redirectUri + <js>"&prompt=none"</js>);
+
+			addDefaultOidcHeaders(method);
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 3: "</js> + response.getStatusLine());
+
+			<jc>// Handle JAS Challenge</jc>
+			method = <jk>new</jk> HttpGet(redirectUri);
+			addDefaultOidcHeaders(method);
+
+			response = client.execute(method);
+
+			code = response.getStatusLine().getStatusCode();
+
+			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
+				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 4: "</js> + response.getStatusLine());
+
+			<jf>cookie</jf> = getHeader(response, <js>"Set-Cookie"</js>);
+
+			Header[] defaultHeaders = <jk>new</jk> Header[] {
+				<jk>new</jk> BasicHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>),
+				<jk>new</jk> BasicHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>),
+				<jk>new</jk> BasicHeader(<js>"Accept"</js>, <js>"text/json"</js>),
+				<jk>new</jk> BasicHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>)),
+				<jk>new</jk> BasicHeader(<js>"Cookie"</js>, cookie)
+	};
+
+			setDefaultHeaders(Arrays.<jsm>asList</jsm>(defaultHeaders));
+
+		} <jk>finally</jk> {
+			EntityUtils.<jsm>consume</jsm>(response.getEntity());
+		}
+	}
+
+	<jk>private void</jk> addDefaultOidcHeaders(HttpRequestBase method) {
+		method.addHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>);
+		method.addHeader(<js>"X-com-ibm-team-configuration-versions"</js>, <js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>);
+		method.addHeader(<js>"Accept"</js>, <js>"text/json"</js>);
+
+		<jk>if</jk> (<jf>cookie</jf> != <jk>null</jk>) {
+			method.addHeader(<js>"Authorization"</js>, <js>"Basic "</js> + StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>));
+			method.addHeader(<js>"Cookie"</js>, cookie);
+		}
+	}
+			</p>	
+		</div>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="ResponsePatterns"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.3 - Using Response Patterns</h3>
+	<div class='topic'>
+		<p>
+			One issue with REST (and HTTP in general) is that the HTTP response code must be set as a header before the 
+			body of the request is sent.  This can be problematic when REST calls invoke long-running processes, pipes
+			the results through the connection, and then fails after an HTTP 200 has already been sent.
+		</p>
+		<p>
+			One common solution is to serialize some text at the end to indicate whether the long-running process succeeded (e.g. <js>"FAILED"</js> or <js>"SUCCEEDED"</js>).
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class has convenience methods for scanning the response without
+			interfering with the other methods used for retrieving output.  
+		</p>
+		<p>
+			The following example shows how the {@link com.ibm.juno.client.RestCall#successPattern(String)} method can be used
+			to look for a SUCCESS message in the output:
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.successPattern(<js>"SUCCESS"</js>)
+		.run();
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#failurePattern(String)} method does the opposite.  
+			It throws an exception if a failure message is detected.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
+	restClient.doPost(<jsf>URL</jsf>)
+		.failurePattern(<js>"FAILURE|ERROR"</js>)
+		.run();
+		</p>
+		<p>
+			These convenience methods are specialized methods that use the {@link com.ibm.juno.client.RestCall#addResponsePattern(ResponsePattern)}
+				method which uses regular expression matching against the response body.
+			This method can be used to search for arbitrary patterns in the response body.
+		</p>
+		<p>
+			The following example shows how to use a response pattern finder to find and capture patterns for <js>"x=number"</js> and <js>"y=string"</js>
+				from a response body.
+		</p>	
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
+	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
+	
+	String responseText = restClient.doGet(<jsf>URL</jsf>)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
+				}
+			}
+		)
+		.addResponsePattern(
+			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
+				<ja>@Override</ja>
+				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
+					yList.add(m.group(1));
+				}
+				<ja>@Override</ja>
+				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
+					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
+				}
+			}
+		)
+		.getResponseAsString();
+		</p>
+		<p>
+			Using response patterns does not affect the functionality of any of the other methods
+			used to retrieve the response such as {@link com.ibm.juno.client.RestCall#getResponseAsString()} or {@link com.ibm.juno.client.RestCall#getResponse(Class)}.<br>
+			HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
+			use {@link com.ibm.juno.client.RestCall#getCapturedResponse()} since this method will not absorb the response for those other methods.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="#PipingOutput"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.4 - Piping Response Output</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestCall} class provides various convenience <code>pipeTo()</code> methods 
+			to pipe output to output streams and writers.
+		</p>
+		<p>
+			If you want to pipe output without any intermediate buffering, you can use the {@link com.ibm.juno.client.RestCall#byLines()} method.  
+			This will cause the output to be piped and flushed after every line.  
+			This can be useful if you want to display the results in real-time from a long running process producing
+				output on a REST call.
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Pipe output from REST call to System.out in real-time.</jc>
+	restClient.doPost(<jsf>URL</jsf>).byLines().pipeTo(<jk>new</jk> PrintWriter(System.<jk>out</jk>)).run();
+		</p>
+	</div>	
+	
+	<!-- ======================================================================================================== -->
+	<a id="Logging"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.5 - Logging</h3>
+	<div class='topic'>
+		<p>
+			Use the {@link com.ibm.juno.client.RestClient#logTo(Level,Logger)} and {@link com.ibm.juno.client.RestCall#logTo(Level,Logger)} methods
+			to log HTTP calls.
+			These methods will cause the HTTP request and response headers and body to be logged to the specified logger.  
+		</p>
+		<h6 class='topic'>Example:</h6>
+		<p class='bcode'>
+	<jc>// Log the HTTP request/response to the specified logger.</jc>
+	<jk>int</jk> rc = restClient.doGet(<jsf>URL</jsf>).logTo(<jsf>INFO</jsf>, getLogger()).run();
+		</p>
+		<p>
+			The method call is ignored if the logger level is below the specified level.
+		</p>
+		<p>
+			Customized logging can be handled by subclassing the {@link com.ibm.juno.client.RestCallLogger} class and using the 
+			{@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} method.
+		</p>
+	</div>
+	
+	<!-- ======================================================================================================== -->
+	<a id="Interceptors"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.6 - Interceptors</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#addInterceptor(RestCallInterceptor)} and {@link com.ibm.juno.client.RestCall#addInterceptor(RestCallInterceptor)} methods
+			can be used to intercept responses during specific connection lifecycle events.
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCallLogger} class is an example of an interceptor that uses the various lifecycle methods
+				to log HTTP requests.
+		</p>
+		<p class='bcode'>
+	<jd>/**
+	 * Specialized interceptor for logging calls to a log file.
+	 */</jd>
+	<jk>public class</jk> RestCallLogger <jk>extends</jk> RestCallInterceptor {
+	
+		<jk>private</jk> Level <jf>level</jf>;
+		<jk>private</jk> Logger <jf>log</jf>;
+	
+		<jd>/**
+		 * Constructor.
+		 *
+		 * <ja>@param</ja> level The log level to log messages at.
+		 * <ja>@param</ja> log The logger to log to.
+		 */</jd>
+		<jk>protected</jk> RestCallLogger(Level level, Logger log) {
+			<jk>this</jk>.<jf>level</jf> = level;
+			<jk>this</jk>.<jf>log</jf> = log;
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onInit(RestCall restCall) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				restCall.captureResponse();
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onConnect(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jc>// Do nothing.</jc>
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onRetry(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
+			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
+				<jf>log</jf>.log(level, MessageFormat.<jsm>format</jsm>(<js>"Call to {0} returned {1}.  Will retry."</js>, req.getRequestLine().getUri(), statusCode)); 
+		}
+	
+		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
+		<jk>public void</jk> onClose(RestCall restCall) <jk>throws</jk> RestCallException {
+			<jk>try</jk> {
+				<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>)) {
+					String output = restCall.getCapturedResponse();
+					StringBuilder sb = <jk>new</jk> StringBuilder();
+					HttpUriRequest req = restCall.getRequest();
+					HttpResponse res = restCall.getResponse();
+					<jk>if</jk> (req != <jk>null</jk>) {
+						sb.append(<js>"\n=== HTTP Call =================================================================="</js>);
+	
+						sb.append(<js>"\n=== REQUEST ===\n"</js>).append(req);
+						sb.append(<js>"\n---request headers---"</js>);
+						<jk>for</jk> (Header h : req.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						<jk>if</jk> (req <jk>instanceof</jk> HttpEntityEnclosingRequestBase) {
+							sb.append(<js>"\n---request entity---"</js>);
+							HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
+							HttpEntity e = req2.getEntity();
+							<jk>if</jk> (e == <jk>null</jk>)
+								sb.append(<js>"\nEntity is null"</js>);
+							<jk>else</jk> {
+								<jk>if</jk> (e.getContentType() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentType());
+								<jk>if</jk> (e.getContentEncoding() != <jk>null</jk>)
+									sb.append(<js>"\n"</js>).append(e.getContentEncoding());
+								<jk>if</jk> (e.isRepeatable()) {
+									<jk>try</jk> {
+										sb.append(<js>"\n---request content---\n"</js>).append(EntityUtils.<jsm>toString</jsm>(e));
+									} <jk>catch</jk> (Exception ex) {
+										<jk>throw new</jk> RuntimeException(ex);
+									}
+								}
+							}
+						}
+					}
+					<jk>if</jk> (res != <jk>null</jk>) {
+						sb.append(<js>"\n=== RESPONSE ===\n"</js>).append(res.getStatusLine());
+						sb.append(<js>"\n---response headers---"</js>);
+						<jk>for</jk> (Header h : res.getAllHeaders())
+							sb.append(<js>"\n"</js>).append(h);
+						sb.append(<js>"\n---response content---\n"</js>).append(output);
+						sb.append(<js>"\n=== END ========================================================================"</js>);
+					}
+					<jf>log</jf>.log(<jf>level</jf>, sb.toString());
+				}
+			} <jk>catch</jk> (IOException e) {
+				<jf>log</jf>.log(Level.<jsf>SEVERE</jsf>, e.getLocalizedMessage(), e);
+			}
+		}
+	}
+		</p>
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Remoteable"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.7 - Remotable Proxies</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the capability of calling methods on POJOs on a server through client-side proxy interfaces.
+			It offers a number of advantages over other similar remote proxy interfaces, such as being much simpler to 
+				use and allowing much more flexibility.
+		</p>
+		<p>
+			Proxy interfaces are retrieved using the {@link com.ibm.juno.client.RestClient#getRemoteableProxy(Class)} method.
+			The {@link com.ibm.juno.client.RestClient#setRemoteableServletUri(String)} method is used to specify the location
+				of the remoteable services servlet running on the server.
+			The remoteable servlet is a specialized subclass of {@link com.ibm.juno.server.RestServlet} that provides a full-blown
+				REST interface for calling interfaces remotely. 
+		</p>
+		<p>
+			In this example, we have the following interface defined that we want to call from the client side against
+				a POJO on the server side (i.e. a Remoteable Service)...
+		<p class='bcode'>
+	<jk>public interface</jk> IAddressBook {
+		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
+	}
+		</p>			
+		<p>
+			The client side code for invoking this method is shown below...
+		</p>
+		<p class='bcode'>
+	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setRemoteableServletUri(<js>"https://localhost:9080/juno/sample/remoteable"</js>);
+	
+	<jc>// Create a proxy interface.</jc>
+	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
+	
+	<jc>// Invoke a method on the server side and get the returned result.</jc>
+	Person p = ab.createPerson(
+		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
+			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
+			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
+	);
+		</p>
+		<p>
+			The requirements for a method to be callable through a remoteable service are:
+			<ul>
+				<li>The method must be public.
+				<li>The parameter and return types must be <a href='../../../../com/ibm/juno/core/package-summary.html#PojoCategories'><u>serializable and parsable</u></a>.
+			</ul>
+		</p>
+		<p>
+			One significant feature is that the remoteable services servlet is a full-blown REST interface.  
+			Therefore, in cases where the interface classes are not available on the client side,
+				the same method calls can be made through pure REST calls.  
+			This can also aid significantly in debugging since calls to the remoteable service
+				can be called directly from a browser with no code involved.
+		</p>
+		<p>
+			See {@link com.ibm.juno.server.remoteable} for more information.
+		</p> 
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="Other"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.8 - Other Useful Methods</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setRootUrl(String)} method can be used to specify a root URL on 
+				all requests so that you don't have to use absolute paths on individual calls.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client with a root URL</jc>
+	RestClient rc = <jk>new</jk> RestClient().setRootUrl(<js>"http://localhost:9080/foobar"</js>);
+	String r = rc.doGet(<js>"/baz"</js>).getResponseAsString();  <jc>// Gets "http://localhost:9080/foobar/baz"</jc>
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestClient#setProperty(String,Object)} method can be used to set serializer
+			and parser properties.
+			For example, if you're parsing a response into POJOs and you want to ignore fields that aren't on the
+			POJOs, you can use the {@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties} property.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest client that ignores unknown fields in the response</jc>
+	RestClient rc = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>)
+		.setProperty(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>);
+	MyPojo myPojo = rc.doGet(<jsf>URL</jsf>).getResponse(MyPojo.<jk>class</jk>);
+		</p>
+		<p>
+			The {@link com.ibm.juno.client.RestCall#setRetryable(int,long,RetryOn)} method can be used to automatically
+				retry requests on failures.
+			This can be particularly useful if you're attempting to connect to a REST resource that may be in
+				the process of still initializing.
+		</p>
+		<p class='bcode'>
+	<jc>// Create a rest call that retries every 10 seconds for up to 30 minutes as long as a connection fails
+	// or a 400+ is received.</jc>
+	restClient.doGet(<jsf>URL</jsf>)
+		.setRetryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>)
+		.run();
+	</p>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/bin/core.test/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..37c0a6f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core.test/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.8.3
+Created-By: pwa6470_27sr1-20140411_01 (SR1) (IBM Corporation)
+Bundle-ManifestVersion: 2
+Bundle-Name: Juno Cloud API - Test
+Bundle-SymbolicName: com.ibm.team.juno.test
+Bundle-Version: 5.2.0.0
+Bundle-Vendor: IBM
+Require-Bundle: com.ibm.team.juno,com.ibm.team.juno.client,com.ibm.tea
+ m.juno.server,org.junit
+Import-Package: javax.servlet,javax.servlet.http,org.apache.commons.fi
+ leupload,org.apache.commons.fileupload.servlet,org.apache.derby.jdbc,
+ org.apache.http,org.apache.http.impl.client,org.osgi.framework,org.os
+ gi.service.http,org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Built-By: jbognar
+Build-Date: December 30 2015
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/AllTests.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/AllTests.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/AllTests.class
new file mode 100755
index 0000000..183422e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/AllTests.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$A.class
new file mode 100755
index 0000000..eed7601
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$Person1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$Person1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$Person1.class
new file mode 100755
index 0000000..fa1cb05
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations$Person1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations.class
new file mode 100755
index 0000000..019ece2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Annotations.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$1.class
new file mode 100755
index 0000000..bf7744b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$A.class
new file mode 100755
index 0000000..905b6b4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AHandler.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AHandler.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AHandler.class
new file mode 100755
index 0000000..a1e414d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AHandler.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Address.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Address.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Address.class
new file mode 100755
index 0000000..3e3826d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Address.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AddressablePerson.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AddressablePerson.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AddressablePerson.class
new file mode 100755
index 0000000..8affdb5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$AddressablePerson.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B.class
new file mode 100755
index 0000000..793718b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B2.class
new file mode 100755
index 0000000..e9d005e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C.class
new file mode 100755
index 0000000..708e768
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C1.class
new file mode 100755
index 0000000..5cf4232
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$D.class
new file mode 100755
index 0000000..d45f778
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterA.class
new file mode 100755
index 0000000..1b95d73
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterB.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterB.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterB.class
new file mode 100755
index 0000000..6009822
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterB.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterC.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterC.class
new file mode 100755
index 0000000..7a9ee46
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyBeanFilterC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterA.class
new file mode 100755
index 0000000..f777c52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterB.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterB.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterB.class
new file mode 100755
index 0000000..9c63aa9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterB.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterC.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterC.class
new file mode 100755
index 0000000..eec3b3a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$DummyPojoFilterC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Person.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Person.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Person.class
new file mode 100755
index 0000000..ea0c680
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$Person.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$ReadOnlyPerson.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$ReadOnlyPerson.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$ReadOnlyPerson.class
new file mode 100755
index 0000000..6d6e25c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$ReadOnlyPerson.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$TestEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$TestEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$TestEnum.class
new file mode 100755
index 0000000..7006ae7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext$TestEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext.class
new file mode 100755
index 0000000..44382fd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A.class
new file mode 100755
index 0000000..2f26e34
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A1.class
new file mode 100755
index 0000000..d5bf7ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A2.class
new file mode 100755
index 0000000..d1d36f3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B.class
new file mode 100755
index 0000000..fc1005d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B1.class
new file mode 100755
index 0000000..3a0872e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B2.class
new file mode 100755
index 0000000..cc09492
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C1.class
new file mode 100755
index 0000000..7e5bc5a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C2.class
new file mode 100755
index 0000000..7966648
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D1.class
new file mode 100755
index 0000000..81c274d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D2.class
new file mode 100755
index 0000000..573a8a6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter.class
new file mode 100755
index 0000000..76ab1bf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$A.class
new file mode 100755
index 0000000..d03c0b0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$B.class
new file mode 100755
index 0000000..904d1d9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$C.class
new file mode 100755
index 0000000..b654fb4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D.class
new file mode 100755
index 0000000..229d1c0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D1.class
new file mode 100755
index 0000000..9bca024
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D2.class
new file mode 100755
index 0000000..8d041d6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$E.class
new file mode 100755
index 0000000..48b7b62
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$F.class
new file mode 100755
index 0000000..d1cfa08
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G.class
new file mode 100755
index 0000000..0efb150
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G1.class
new file mode 100755
index 0000000..ae0aa66
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$G1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$H.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$H.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$H.class
new file mode 100755
index 0000000..0d453b1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$H.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$HEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$HEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$HEnum.class
new file mode 100755
index 0000000..dcb2c6b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$HEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$I.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$I.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$I.class
new file mode 100755
index 0000000..ae57a57
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$I.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$J.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$J.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$J.class
new file mode 100755
index 0000000..c0725ba
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$J.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$K.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$K.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$K.class
new file mode 100755
index 0000000..5e84db6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$K.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L.class
new file mode 100755
index 0000000..85a9752
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L1.class
new file mode 100755
index 0000000..dd8675a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L2.class
new file mode 100755
index 0000000..2ed42de
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$L2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M1.class
new file mode 100755
index 0000000..1a2574d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M2.class
new file mode 100755
index 0000000..602f02c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M3.class
new file mode 100755
index 0000000..0206697
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M4.class
new file mode 100755
index 0000000..50a5935
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M5.class
new file mode 100755
index 0000000..28fd58f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$M5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N1.class
new file mode 100755
index 0000000..7171d45
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N2.class
new file mode 100755
index 0000000..58b0063
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N3.class
new file mode 100755
index 0000000..ab6336b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N4.class
new file mode 100755
index 0000000..65a3f13
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N5.class
new file mode 100755
index 0000000..9a6b753
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$N5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$O.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$O.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$O.class
new file mode 100755
index 0000000..994d4c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$O.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P1.class
new file mode 100755
index 0000000..ab561ab
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P2.class
new file mode 100755
index 0000000..080ff57
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$P2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q1.class
new file mode 100755
index 0000000..ff9fbb0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q2.class
new file mode 100755
index 0000000..88d3adc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Q2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R1.class
new file mode 100755
index 0000000..b7aa31d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R2.class
new file mode 100755
index 0000000..b1628a9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$S.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$S.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$S.class
new file mode 100755
index 0000000..1a8b55b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$S.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$TEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$TEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$TEnum.class
new file mode 100755
index 0000000..7359efd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$TEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$U.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$U.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$U.class
new file mode 100755
index 0000000..93b6740
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$U.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V.class
new file mode 100755
index 0000000..f6a6b6c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V2.class
new file mode 100755
index 0000000..0213dd1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V3.class
new file mode 100755
index 0000000..c175453
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$V3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W.class
new file mode 100755
index 0000000..9ff4fb9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W2.class
new file mode 100755
index 0000000..e0fed88
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W3.class
new file mode 100755
index 0000000..e08bd67
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$W3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X1.class
new file mode 100755
index 0000000..52f6716
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X2.class
new file mode 100755
index 0000000..a1dce30
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$X2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Y.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Y.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Y.class
new file mode 100755
index 0000000..6e7c443
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap$Y.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap.class
new file mode 100755
index 0000000..f4c4897
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_BeanMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$G.class
new file mode 100755
index 0000000..7234f2a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$G.class differ



[14/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.java
new file mode 100755
index 0000000..4fa6458
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/JsonSerializerWriter.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json;
+
+import java.io.*;
+
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Specialized writer for serializing JSON.
+ * <p>
+ * 	<b>Note:  This class is not intended for external use.</b>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class JsonSerializerWriter extends SerializerWriter {
+
+	private final boolean laxMode, escapeSolidus;
+
+	// Characters that trigger special handling of serializing attribute values.
+	private static final AsciiSet
+		encodedChars = new AsciiSet("\n\t\b\f\r'\"\\"),
+		encodedChars2 = new AsciiSet("\n\t\b\f\r'\"\\/");
+
+	private static final KeywordSet reservedWords = new KeywordSet(
+		"arguments","break","case","catch","class","const","continue","debugger","default","delete",
+		"do","else","enum","eval","export","extends","false","finally","for","function","if",
+		"implements","import","in","instanceof","interface","let","new","null","package",
+		"private","protected","public","return","static","super","switch","this","throw",
+		"true","try","typeof","var","void","while","with","undefined","yield"
+	);
+
+
+	// Characters that represent attribute name characters that don't trigger quoting.
+	// These are actually more strict than the actual Javascript specification, but
+	// can be narrowed in the future if necessary.
+	// For example, we quote attributes that start with $ even though we don't need to.
+	private static final AsciiSet validAttrChars = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_");
+	private static final AsciiSet validFirstAttrChars = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_");
+
+	private final AsciiSet ec;
+
+	/**
+	 * 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>, whitespace will be used in output.
+	 * @param escapeSolidus If <jk>true</jk>, forward slashes should be escaped in the output.
+	 * @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>)
+	 * @param laxMode If <jk>true</jk>, JSON attributes will only be quoted when necessary.
+	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
+	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
+	 */
+	protected JsonSerializerWriter(Writer out, boolean useIndentation, boolean useWhitespace, boolean escapeSolidus, char quoteChar, boolean laxMode, String relativeUriBase, String absolutePathUriBase) {
+		super(out, useIndentation, useWhitespace, quoteChar, relativeUriBase, absolutePathUriBase);
+		this.laxMode = laxMode;
+		this.escapeSolidus = escapeSolidus;
+		this.ec = escapeSolidus ? encodedChars2 : encodedChars;
+	}
+
+	/**
+	 * Serializes the specified object as a JSON string value.
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException Should never happen.
+	 */
+	public JsonSerializerWriter stringValue(Object o) throws IOException {
+		 /*
+		  * Fixes up a Java string so that it can be used as a JSON string.<br>
+		  * Does the following:<br>
+		  * <ul>
+		  *  <li> Replaces {@code \r?\n} with {@code \\n}<br>
+		  *  <li> Replaces {@code \t} with {@code \\t}<br>
+		  *  <li> Replaces {@code '} with {@code \\'}<br>
+		  *  <li> Replaces {@code "} with {@code \\"}<br>
+		  * </ul>
+		  */
+		if (o == null)
+			return this;
+		String s = o.toString();
+		boolean doConvert = false;
+		for (int i = 0; i < s.length() && ! doConvert; i++) {
+			char c = s.charAt(i);
+			doConvert |= ec.contains(c);
+		}
+		q();
+		if (! doConvert) {
+			out.append(s);
+		} else {
+			for (int i = 0; i < s.length(); i++) {
+				char c = s.charAt(i);
+				if (ec.contains(c)) {
+					if (c == '\n')
+						out.append('\\').append('n');
+					else if (c == '\t')
+						out.append('\\').append('t');
+					else if (c == '\b')
+						out.append('\\').append('b');
+					else if (c == '\f')
+						out.append('\\').append('f');
+					else if (c == quoteChar)
+						out.append('\\').append(quoteChar);
+					else if (c == '\\')
+						out.append('\\').append('\\');
+					else if (c == '/' && escapeSolidus)
+						out.append('\\').append('/');
+					else if (c != '\r')
+						out.append(c);
+				} else {
+					out.append(c);
+				}
+			}
+		}
+		q();
+		return this;
+	}
+
+	/**
+	 * Serializes the specified object as a JSON attribute name.
+	 * @param o The object being serialized.
+	 * @return This object (for method chaining).
+	 * @throws IOException Should never happen.
+	 */
+	public JsonSerializerWriter attr(Object o) throws IOException {
+		/*
+		 * Converts a Java string to an acceptable JSON attribute name. If
+		 * useStrictJson is false, then quotes will only be used if the attribute
+		 * name consists of only alphanumeric characters.
+		 */
+		boolean doConvert = ! laxMode;		// Always convert when not in lax mode.
+
+		String s = null;
+
+		// If the attribute is null, it must always be printed as null without quotes.
+		// Technically, this isn't part of the JSON spec, but it does allow for null key values.
+		if (o == null) {
+			s = "null";
+			doConvert = false;
+
+		} else {
+			s = o.toString();
+
+			// Look for characters that would require the attribute to be quoted.
+			// All possible numbers should be caught here.
+			if (! doConvert) {
+				for (int i = 0; i < s.length() && ! doConvert; i++) {
+					char c = s.charAt(i);
+					doConvert |= ! (i == 0 ? validFirstAttrChars.contains(c) : validAttrChars.contains(c));
+				}
+			}
+
+			// Reserved words and blanks must be quoted.
+			if (! doConvert) {
+				if (s.isEmpty() || reservedWords.contains(s))
+					doConvert = true;
+			}
+		}
+
+		// If no conversion necessary, just print the attribute as-is.
+		if (doConvert)
+			stringValue(s);
+		else
+			out.append(s);
+
+		return this;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter cr(int depth) throws IOException {
+		super.cr(depth);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter appendln(int indent, String text) throws IOException {
+		super.appendln(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter appendln(String text) throws IOException {
+		super.appendln(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter append(int indent, String text) throws IOException {
+		super.append(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter append(int indent, char c) throws IOException {
+		super.append(indent, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter s() throws IOException {
+		super.s();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter q() throws IOException {
+		super.q();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter i(int indent) throws IOException {
+		super.i(indent);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter nl() throws IOException {
+		super.nl();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter append(Object text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter append(String text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter appendIf(boolean b, String text) throws IOException {
+		super.appendIf(b, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter appendIf(boolean b, char c) throws IOException {
+		super.appendIf(b, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public JsonSerializerWriter append(char c) throws IOException {
+		super.append(c);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.class
new file mode 100755
index 0000000..b375a8d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.java
new file mode 100755
index 0000000..d4b0f0a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/Json.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.json.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
+
+/**
+ * Annotation for specifying various JSON options for the JSON serializers and parsers.
+ * <p>
+ * 	Can be applied to Java types.
+ * <p>
+ * 	Can be used for the following:
+ * <ul>
+ * 	<li>Wrap bean instances inside wrapper object (e.g. <code>{'wrapperAttr':bean}</code>).
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Documented
+@Target({TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface Json {
+
+	/**
+	 * Wraps beans in a JSON object with the specified attribute name.
+	 * <p>
+	 * 	Applies only to {@link ElementType#TYPE}.
+	 * <p>
+	 * 	This annotation can be applied to beans as well as other objects serialized to other types (e.g. strings).
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<ja>@Json</ja>(wrapperAttr=<js>"myWrapper"</js>)
+	 * 	<jk>public class</jk> MyBean {
+	 * 		<jk>public int</jk> f1 = 123;
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	Without the <ja>@Xml</ja> annotations, serializing this bean as JSON would have produced the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	{
+	 * 		f1: 123
+	 * 	}
+	 * </p>
+	 * <p>
+	 * 	With the annotations, serializing this bean as XML produces the following...
+	 * </p>
+	 * <p class='bcode'>
+	 * 	{
+	 * 		myWrapper: {
+	 * 			f1: 123
+	 * 		}
+	 * 	}
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	String wrapperAttr() default "";
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/package.html
new file mode 100755
index 0000000..3d37d51
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/annotation/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>JSON annotations</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_HTML.png
new file mode 100755
index 0000000..b4a3576
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSON.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSON.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSON.png
new file mode 100755
index 0000000..13b5c22
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSON.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSchema.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSchema.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSchema.png
new file mode 100755
index 0000000..bf1cdc6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSchema.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSimple.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSimple.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSimple.png
new file mode 100755
index 0000000..935e8a9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/doc-files/Example_JSONSimple.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/package.html
new file mode 100755
index 0000000..d9a78ec
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/json/package.html
@@ -0,0 +1,1460 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>JSON serialization and parsing support</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>JSON support overview</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#OverviewExample'>Example</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#JsonSerializer'>JsonSerializer class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
+		<li><p><a class='doclink' href='#Collections'>Collections</a></p>
+		<li><p><a class='doclink' href='#JsonSchemaSupport'>JSON-Schema support</a></p>
+		<li><p><a class='doclink' href='#Recursion'> Non-tree models and recursion detection</a></p>
+		<li><p><a class='doclink' href='#SerializerConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#SerializerOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#JsonParser'>JsonParser class</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#GenericParsing'>Parsing into generic POJO models</a></p>
+		<li><p><a class='doclink' href='#ParserConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#ParserOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#RestApiSupport'>REST API support</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#RestServerSupport'>REST server support</a></p>
+		<ol>
+		<li><p><a class='doclink' href='#RestServletDefault'>Using RestServletDefault</a></p>
+		<li><p><a class='doclink' href='#RestServlet'>Using RestServlet with annotations</a></p>
+		<li><p><a class='doclink' href='#DefaultProvider'>Using JAX-RS DefaultProvider</a></p>
+		<li><p><a class='doclink' href='#BaseProvider'>Using JAX-RS BaseProvider with annotations</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#RestClientSupport'>REST client support</a></p>
+	</ol>	
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 -JSON support overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports converting arbitrary POJOs to and from JSON using ultra-efficient serializers and parsers.<br>
+		The JSON serializer converts POJOs directly to JSON without the need for intermediate DOM objects using a highly-efficient state machine.<br>
+		Likewise, the JSON parser creates POJOs directly from JSON without the need for intermediate DOM objects. 
+	</p>
+	<p>
+		Juno can serialize and parse instances of any of the following POJO types:
+	</p>
+	<ul>
+		<li>Java primitives and primitive objects (e.g. <code>String</code>, <code>Integer</code>, <code>Boolean</code>, <code>Float</code>).
+		<li>Java Collections Framework objects (e.g. <code>HashSet</code>, <code>TreeMap</code>) containing anything on this list.
+		<li>Multi-dimensional arrays of any type on this list.
+		<li>Java Beans with properties of any type on this list.
+		<li>Classes with standard transformations to and from <code>Strings</code> (e.g. classes containing <code>toString()</code>, <code>fromString()</code>, <code>valueOf()</code>, <code>constructor(String)</code>).
+		<li>Non-serializable classes and properties with associated <code>PojoFilters</code> that convert them to serializable forms.
+	</ul>
+	<p>
+		Refer to <a href='../package-summary.html#PojoCategories' class='doclink'>POJO Categories</a> for a complete definition of supported POJOs.
+	</p>
+	<h6 class='topic'>Prerequisites</h6>
+	<p>
+		The Juno JSON serialization and parsing support does not require any external prerequisites.  
+		It only requires Java 1.6 or above.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="OverviewExample"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - JSON support overview - example</h3>
+	<div class='topic'>
+		<p>
+			The example shown here is from the Address Book resource located in the <code>com.ibm.juno.sample.war</code> application.<br>
+			The POJO model consists of a <code>List</code> of <code>Person</code> beans, with each <code>Person</code> containing
+				zero or more <code>Address</code> beans.
+		</p>
+		<p>
+			When you point a browser at <code>/sample/addressBook</code>, the POJO is rendered as HTML:
+		</p>
+		<img class='bordered' src="doc-files/Example_HTML.png">
+		<p>
+			By appending <code>?Accept=<i>mediaType</i>&plainText=true</code> to the URL, you can view the data in the various supported JSON formats:
+		</p>
+		
+		<h6 class='figure'>Normal JSON</h6>
+		<img class='bordered' src="doc-files/Example_JSON.png">
+		
+		<h6 class='figure'>Simple JSON</h6>
+		<img class='bordered' src="doc-files/Example_JSONSimple.png">
+
+		<p>
+			In addition to serializing POJOs to JSON, Juno includes support for serializing POJO metamodels to JSON Schema.
+		</p>
+		
+		<h6 class='figure'>JSON Schema</h6>
+		<img class='bordered' src="doc-files/Example_JSONSchema.png">
+		
+		<p>
+			The JSON data type produced depends on the Java object type being serialized.
+		</p>
+		<ul>
+			<li>Primitives and primitive objects are converted to JSON primitives.<br>
+			<li>Beans and Maps are converted to JSON objects.<br>
+			<li>Collections and arrays are converted to JSON arrays.<br>
+			<li>Anything else is converted to JSON strings.
+		</ul>
+			
+		<h6 class='figure'>Examples</h6>
+			<table class='styled'>
+			<tr>
+				<th>POJO type</th>
+				<th>Example</th>
+				<th>Serialized form</th>
+			</tr>
+			<tr>
+				<td>String</td>
+				<td><code>serializer.serialize(<js>"foobar"</js>);</code></td>
+				<td><code><js>'foobar'</js></code>
+			</tr>
+			<tr>
+				<td>Number</td>
+				<td><code>serializer.serialize(123);</code></td>
+				<td><code><jk>123</jk></code>
+			</tr>
+			<tr>
+				<td>Boolean</td>
+				<td><code>serializer.serialize(<jk>true</jk>);</code></td>
+				<td><code><jk>true</jk></code>
+			</tr>
+			<tr>
+				<td>Null</td>
+				<td><code>serializer.serialize(<jk>null</jk>);</code></td>
+				<td><code><jk>null</jk></code>
+			</tr>
+			<tr>
+				<td>Beans with properties of any type on this list</td>
+				<td><code>serializer.serialize(<jk>new</jk> MyBean());</code></td>
+				<td><code>{p1:<js>'val1'</js>,p2:<jk>true</jk>}</code>
+			</tr>
+			<tr>
+				<td>Maps with values of any type on this list</td>
+				<td><code>serializer.serialize(<jk>new</jk> TreeMap());</code></td>
+				<td><code>{key1:<js>'val1'</js>,key2:<jk>true</jk>}</code>
+			</tr>
+			<tr>
+				<td>Collections and arrays of any type on this list</td>
+				<td><code>serializer.serialize(<jk>new</jk> Object[]{1,<js>"foo"</js>,<jk>true</jk>});</code></td>
+				<td><code>[1,'foo',true]</code>
+			</tr>
+		</table>
+		<p>
+			In addition, filters can be used to convert non-serializable POJOs into serializable forms, such as converting 
+				<code>Calendar</code> object to ISO8601 strings, or <code><jk>byte</jk>[]</code> arrays to Base-64 encoded strings.<br>
+			These filters can be associated at various levels:
+		</p>
+		<ul>
+			<li>On serializer and parser instances to handle all objects of the class type globally.
+			<li>On classes through the <code><ja>@Bean</ja></code> annotation.
+			<li>On bean properties through the <code><ja>@BeanProperty</ja></code> annotations.
+		</ul>
+		<p>
+			For more information about filters, refer to {@link com.ibm.juno.core.filter}.
+		</p>
+	</div>
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="JsonSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - JsonSerializer class</h2>
+<div class='topic'>
+	<p>
+		{@link com.ibm.juno.core.json.JsonSerializer} is the class used to convert POJOs to JSON.<br>
+		{@link com.ibm.juno.core.json.JsonSchemaSerializer} is the class used to generate JSON-Schema from POJOs.<br>
+	</p>	
+	<p>
+		The JSON serializer includes several configurable settings.<br>
+		Static reusable instances of Json serializers are provided with commonly-used settings:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.json.JsonSerializer#DEFAULT} - All default settings
+		<li>{@link com.ibm.juno.core.json.JsonSerializer#DEFAULT_LAX} - Single quotes, only quote attributes when necessary.
+		<li>{@link com.ibm.juno.core.json.JsonSerializer#DEFAULT_LAX_READABLE} - Readable output.
+	</ul>
+	<h6 class='topic'>Notes about examples</h6>
+	<p>
+		The examples shown in this document will use single-quote, readable settings.<br>
+		For brevity, the examples will use public fields instead of getters/setters to reduce the size of the examples.<br>
+		In the real world, you'll typically want to use standard bean getters and setters.
+	</p>
+	<p>
+		To start off simple, we'll begin with the following simplified bean and build upon it.
+	</p>
+	<p class='bcode'>
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name) {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+		}
+	}
+	</p>
+	<p>
+		The following code shows how to convert this to simple JSON:
+	</p>
+	<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+
+	<jc>// Serialize the bean to JSON.</jc>
+	String json = s.serialize(p);
+	</p>
+	<p>
+		We could have also created a new serializer with the same settings using the following code:
+	</p>
+	<p class='bcode'>
+	JsonSerializer s = <jk>new</jk> JsonSerializer()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(JsonSerializerProperties.<jsf>JSON_useWhitespace</jsf>, <jk>true</jk>)
+		.setProperty(JsonSerializerProperties.<jsf>JSON_simpleMode</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>);
+	</p>
+	
+	<p>
+		The code above produces the following output:
+	</p>
+	<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>
+	}
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="BeanAnnotations"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.1 - @Bean and @BeanProperty annotations</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.annotation.Bean @Bean} and {@link com.ibm.juno.core.annotation.BeanProperty @BeanProperty} annotations
+				are used to customize the behavior of beans across the entire framework.<br>
+			They have various uses:
+		</p>
+		<ul>
+			<li>Hiding bean properties.
+			<li>Specifying the ordering of bean properties.
+			<li>Overriding the names of bean properties.
+			<li>Associating filters at both the class and property level (to convert non-serializable POJOs to serializable forms).
+		</ul>
+		<p>
+			For example, we now add a <code>birthDate</code> property, and associate a filter with it to transform
+				it to an ISO8601 date-time string in GMT time.<br>
+			We'll also add a couple of <code>URI</code> properties.<br>
+			By default, <code>Calendars</code> are treated as beans by the framework, which is usually not how you want them serialized.<br>
+			Using filters, we can convert them to standardized string forms.
+		</p>
+		<p class='bcode'>	
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
+
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+		</p>
+		<p>
+			Next, we alter our code to pass in the birthdate:
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+		</p>
+		<p>
+			Now when we rerun the sample code, we'll get the following:
+		</p>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>
+	}
+		</p>
+		<p>
+			Another useful feature is the {@link com.ibm.juno.core.annotation.Bean#propertyNamer()} annotation that allows you to plug in your own
+				logic for determining bean property names.<br>
+			The {@link com.ibm.juno.core.PropertyNamerDashedLC} is an example of an alternate property namer.
+			It converts bean property names to lowercase-dashed format.
+		</p>
+		<h6 class='figure'>Example</h6>
+		<p class='bcode'>	
+	<ja>@Bean</ja>(propertyNamer=PropertyNamerDashedLC.<jk>class</jk>)
+	<jk>public class</jk> Person {
+		...
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		<js>'address-book-uri'</js>: <js>'http://sample/addressBook'</js>, 
+		<js>'birth-date'</js>: <js>'1946-08-12T00:00:00Z'</js>
+	}
+		</p>
+	</div>
+	
+		
+	<!-- ======================================================================================================== -->
+	<a id="Collections"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.2 - Collections</h3>
+	<div class='topic'>
+		<p>
+			In our example, let's add a list-of-beans property to our sample class:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+		...
+	}
+		</p>
+		<p>
+			The <code>Address</code> class has the following properties defined:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Address {
+
+		<jc>// Bean properties</jc>
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			Next, add some quick-and-dirty code to add an address to our person bean:
+		</p>
+		<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+		</p>
+		<p>
+			Now when we run the sample code, we get the following:
+		</p>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}
+		</p>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="JsonSchemaSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.3 - JSON-Schema support</h3>
+	<div class='topic'>
+		<p>
+			Juno provides the {@link com.ibm.juno.core.json.JsonSchemaSerializer} class for generating JSON-Schema documents
+				that describe the output generated by the {@link com.ibm.juno.core.json.JsonSerializer} class.<br>
+			This class shares the same properties as <code>JsonSerializer</code>.<br>
+			For convenience the {@link com.ibm.juno.core.json.JsonSerializer#getSchemaSerializer()} method 
+				has been added for creating instances of schema serializers from the regular serializer instance.
+		</p>
+		<p>
+			<i>Note:</i> As of this writing, JSON-Schema has not been standardized, so the output generated by the schema
+				serializer may be subject to future modifications.
+		</p>
+		<p>
+			Lets start with the classes from the previous examples:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.getDateInstance(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+
+	<jk>public class</jk> Address {
+		<jc>// Bean properties</jc>
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			The code for creating our POJO model and generating JSON-Schema is shown below:
+		</p>
+		<p class='bcode'>
+	<jc>// Get the schema serializer for one of the default JSON serializers.</jc>
+	JsonSchemaSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.getSchemaSerializer();
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);
+
+	<jc>// Get the JSON Schema corresponding to the JSON generated above.</jc>
+	String jsonSchema = s.serialize(p);
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	{
+		type: <js>'object'</js>, 
+		description: <js>'com.ibm.juno.sample.Person'</js>, 
+		properties: {
+			id: {
+				type: <js>'number'</js>, 
+				description: <js>'int'</js>
+			}, 
+			name: {
+				type: <js>'string'</js>, 
+				description: <js>'java.lang.String'</js>
+			}, 
+			uri: {
+				type: <js>'any'</js>, 
+				description: <js>'java.net.URI'</js>
+			}, 
+			addressBookUri: {
+				type: <js>'any'</js>, 
+				description: <js>'java.net.URI'</js>
+			}, 
+			birthDate: {
+				type: <js>'any'</js>, 
+				description: <js>'java.util.Calendar'</js>
+			}, 
+			addresses: {
+				type: <js>'array'</js>, 
+				description: <js>'java.util.LinkedList&lt;com.ibm.juno.sample.Address&gt;'</js>, 
+				items: {
+					type: <js>'object'</js>, 
+					description: <js>'com.ibm.juno.sample.Address'</js>, 
+					properties: {
+						uri: {
+							type: <js>'any'</js>, 
+							description: <js>'java.net.URI'</js>
+						}, 
+						personUri: {
+							type: <js>'any'</js>, 
+							description: <js>'java.net.URI'</js>
+						}, 
+						id: {
+							type: <js>'number'</js>, 
+							description: <js>'int'</js>
+						}, 
+						street: {
+							type: <js>'string'</js>, 
+							description: <js>'java.lang.String'</js>
+						}, 
+						city: {
+							type: <js>'string'</js>, 
+							description: <js>'java.lang.String'</js>
+						}, 
+						state: {
+							type: <js>'string'</js>, 
+							description: <js>'java.lang.String'</js>
+						}, 
+						zip: {
+							type: <js>'number'</js>, 
+							description: <js>'int'</js>
+						}, 
+						isCurrent: {
+							type: <js>'boolean'</js>, 
+							description: <js>'boolean'</js>
+						}
+					}
+				}
+			}
+		}
+	}
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Recursion"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.4 - Non-tree models and recursion detection</h3>
+	<div class='topic'>
+		<p>
+			The JSON serializer is designed to be used against POJO tree structures. <br> 
+			It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).<br>
+			If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
+				be thrown (if {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth} is not reached first).
+		</p>
+		<p>
+			If you still want to use the JSON serializer on such models, Juno provides the 
+				{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions} setting.<br>
+			It tells the serializer to look for instances of an object in the current branch of the tree and
+				skip serialization when a duplicate is encountered.
+		</p>
+		<p>
+			For example, let's make a POJO model out of the following classes:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> A {
+		<jk>public</jk> B b;
+	}
+	
+	<jk>public class</jk> B {
+		<jk>public</jk> C c;
+	}
+	
+	<jk>public class</jk> C {
+		<jk>public</jk> A a;
+	}
+		</p>
+		<p>
+			Now we create a model with a loop and serialize the results.
+		</p>
+		<p class='bcode'>
+	<jc>// Clone an existing serializer and set property for detecting recursions.</jc>
+	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.clone().setProperty(SerializerProperties.<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>);
+
+	<jc>// Create a recursive loop.</jc>
+	A a = <jk>new</jk> A();
+	a.<jf>b</jf> = <jk>new</jk> B();
+	a.<jf>b</jf>.<jf>c</jf> = <jk>new</jk> C();
+	a.<jf>b</jf>.<jf>c</jf>.<jf>a</jf> = a;
+	
+	<jc>// Serialize to JSON.</jc>
+	String json = s.serialize(a);
+		</p>
+		<p>
+			What we end up with is the following, which does not serialize the contents of the <code>c</code> field:
+		</p>
+		<p class='bcode'>
+	{
+		b: {
+			c: {
+			}
+		}
+	}
+		</p>
+		<p>
+			Without recursion detection enabled, this would cause a stack-overflow error.
+		</p>
+		<p>
+			Recursion detection introduces a performance penalty of around 20%.<br>
+			For this reason the setting is disabled by default.
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.5 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>JsonSerializer</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.json.JsonSerializerProperties#JSON_simpleMode}</td>
+				<td>Simple JSON mode</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.json.JsonSerializerProperties#JSON_useWhitespace}</td>
+				<td>Use whitespace in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth}</td>
+				<td>Maximum serialization depth</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions}</td>
+				<td>Automatically detect POJO recursions</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_useIndentation}</td>
+				<td>Use indentation in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_quoteChar}</td>
+				<td>Quote character</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimNullProperties}</td>
+				<td>Trim null bean property values from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyLists}</td>
+				<td>Trim empty lists and arrays from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyMaps}</td>
+				<td>Trim empty maps from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase}</td>
+				<td>URI context root for relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase}</td>
+				<td>URI authority for absolute path relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireDefaultConstructor}</td>
+				<td>Beans require no-arg constructors</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSerializable}</td>
+				<td>Beans require <code>Serializable</code> interface</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSettersForGetters}</td>
+				<td>Beans require setters for getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSomeProperties}</td>
+				<td>Beans require some properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanConstructorVisibility}</td>
+				<td>Look for bean constructors with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanClassVisibility}</td>
+				<td>Look for bean classes with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanFieldVisibility}</td>
+				<td>Look for bean fields with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_methodVisibility}</td>
+				<td>Look for bean methods with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useJavaBeanIntrospector}</td>
+				<td>Use Java bean Introspector for determining bean properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useInterfaceProxies}</td>
+				<td>Use interface proxies</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties}</td>
+				<td>Ignore unknown properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownNullBeanProperties}</td>
+				<td>Ignore unknown properties with null values</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignorePropertiesWithoutSetters}</td>
+				<td>Ignore properties without setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnGetters}</td>
+				<td>Ignore invocation errors when calling getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnSetters}</td>
+				<td>Ignore invocation errors when calling setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_addNotBeanPackages}</td>
+				<td>Add to the list of packages whose classes should not be considered beans</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_removeNotBeanPackages}</td>
+				<td>Remove from the list of packages whose classes should not be considered beans</td>
+			</tr>	
+		</table>	
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.6 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno serializers, the JSON serializer is thread safe and maintains an internal cache of bean classes encountered.<br>
+				For performance reasons, it's recommended that serializers be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="JsonParser"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - JsonParser class</h2>
+<div class='topic'>
+	<p>
+		The {@link com.ibm.juno.core.json.JsonParser} class is the class used to parse JSON back into POJOs.
+	</p>	
+	<p>
+		The JSON parser supports ALL valid JSON, including:
+	</p>
+	<ul>
+		<li>Javascript comments.
+		<li>Single or double quoted values.
+		<li>Quoted (strict) or unquoted (non-strict) attributes.
+		<li>JSON fragments (such as string, numeric, or boolean primitive values).
+		<li>Concatenated strings. 
+	</ul>	
+	<p>
+		A static reusable instance of <code>JsonParser</code> is also provided for convenience:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.json.JsonParser#DEFAULT}
+	</ul>
+	<p>
+		Let's build upon the previous example and parse the generated JSON back into the original bean.<br>
+		We start with the JSON that was generated.
+	</p>
+	<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+
+	<jc>// Serialize the bean to JSON.</jc>
+	String json = s.serialize(p);
+	</p>
+	<p>
+		This code produced the following:
+	</p>
+	<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}
+	</p>
+	<p>
+		The code to convert this back into a bean is:
+	</p>
+	<p class='bcode'>
+	<jc>// Parse it back into a bean using the reusable JSON parser.</jc>
+	Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(json, Person.<jk>class</jk>);
+
+	<jc>// Render it back as JSON.</jc>
+	json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(p);
+	</p>
+	<p>
+		We print it back out to JSON to show that all the data has been preserved:
+	</p>
+	<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}	
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="GenericParsing"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.1 - Parsing into generic POJO models</h3>
+	<div class='topic'>
+		<p>
+			The JSON parser is not limited to parsing back into the original bean classes.<br>  
+			If the bean classes are not available on the parsing side, the parser can also be used to 
+				parse into a generic model consisting of <code>Maps</code>, <code>Collections</code>, and primitive
+				objects.
+		</p>
+		<p>
+			You can parse into any <code>Map</code> type (e.g. <code>HashMap</code>, <code>TreeMap</code>), but
+				using {@link com.ibm.juno.core.ObjectMap} is recommended since it has many convenience methods
+				for converting values to various types.<br> 
+			The same is true when parsing collections.  You can use any Collection (e.g. <code>HashSet</code>, <code>LinkedList</code>)
+				or array (e.g. <code>Object[]</code>, <code>String[]</code>, <code>String[][]</code>), but using 
+				{@link com.ibm.juno.core.ObjectList} is recommended.
+		</p>
+		<p>
+			When the map or list type is not specified, or is the abstract <code>Map</code>, <code>Collection</code>, or <code>List</code> types, 
+				the parser will use <code>ObjectMap</code> and <code>ObjectList</code> by default.
+		</p>
+		<p>
+			Starting back with our original JSON:
+		</p>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}
+		</p>
+		<p>
+			We can parse this into a generic <code>ObjectMap</code>:
+		</p>
+		<p class='bcode'>	
+	<jc>// Parse JSON into a generic POJO model.</jc>
+	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);
+
+	<jc>// Convert it back to JSON.</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(m);
+		</p>
+		<p>
+			What we end up with is the exact same output.<br>
+			Even the numbers and booleans are preserved because they are parsed into <code>Number</code> and <code>Boolean</code> objects
+				when parsing into generic models.
+		</p>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}
+		</p>
+		<p>
+			Once parsed into a generic model, various convenience methods are provided on the <code>ObjectMap</code>
+				and <code>ObjectList</code> classes to retrieve values:
+		</p>
+		<p class='bcode'>
+	<jc>// Parse JSON into a generic POJO model.</jc>
+	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);
+
+	<jc>// Get some simple values.</jc>
+	String name = m.getString(<js>"name"</js>);
+	<jk>int</jk> id = m.getInt(<js>"id"</js>);
+
+	<jc>// Get a value convertable from a String.</jc>
+	URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>);
+
+	<jc>// Get a value using a filter.</jc>
+	CalendarFilter filter = <jk>new</jk> CalendarFilter.ISO8601DTZ();
+	Calendar birthDate = m.get(filter, <js>"birthDate"</js>);
+
+	<jc>// Get the addresses.</jc>
+	ObjectList addresses = m.getObjectList(<js>"addresses"</js>);
+
+	<jc>// Get the first address and convert it to a bean.</jc>
+	Address address = addresses.get(Address.<jk>class</jk>, 0);
+		</p>
+
+		<p>
+			As a general rule, parsing into beans is often more efficient than parsing into generic models.<br>
+			And working with beans is often less error prone than working with generic models.
+		</p>		
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.2 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The <code>JsonParser</code> class does not currently have any configurable properties.
+		</p>
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.3 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno parsers, the JSON parser is thread safe and maintains an internal cache of bean classes encountered.<br>
+				For performance reasons, it's recommended that parser be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+	
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="RestApiSupport"></a>
+<h2 class='topic' onclick='toggle(this)'>4 - REST API support</h2>
+<div class='topic'>
+	<p>
+		Juno provides fully-integrated support for JSON serialization/parsing in the REST server and client APIs.<br>
+		The next two sections describe these in detail.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestServerSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.1 - REST server support</h3>
+	<div class='topic'>
+		<p>
+			There are four general ways of defining REST interfaces with support for JSON.
+			Two using the built-in Juno Server API, and two using the JAX-RS integration component.
+		</p>
+		<ul>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.RestServletDefault}.<br>
+					This includes JSON serialization/parsing support by default, in addition to several other media types.<br><br>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.RestServlet} and specify the
+					a JSON serializer and/or parser using the {@link com.ibm.juno.server.annotation.RestResource#serializers()} and
+					{@link com.ibm.juno.server.annotation.RestResource#parsers()} on the entire servlet class, or 
+					the {@link com.ibm.juno.server.annotation.RestMethod#serializers()} and {@link com.ibm.juno.server.annotation.RestMethod#parsers()}
+					annotations on individual methods within the class.<br><br>
+			<li>Register {@link com.ibm.juno.server.jaxrs.DefaultProvider} with JAX-RS.<br>
+					This includes JSON serialization/parsing support by default, in addition to several other media types.<br><br>
+			<li>Create and register a subclass of {@link com.ibm.juno.server.jaxrs.BaseProvider} and specify the serializers and parsers to use on JAX-RS resources.
+		</ul>
+		<p>
+			In general, the Juno REST server API is much more configurable and easier to use than JAX-RS, but beware that the author may be slightly biased in this statement.
+		</p>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServletDefault"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.1 - Using RestServletDefault</h4>
+		<div class='topic'>
+			<p>
+				The quickest way to implement a REST resource with JSON support is to create a subclass of {@link com.ibm.juno.server.RestServletDefault}.<br>
+				This class provides support for JSON, XML, HTML, URL-Encoding, and others.
+			</p>
+			<p>
+				The <code>AddressBookResource</code> example shown in the first chapter uses the <code>RestServletJenaDefault</code> class
+					which is a subclass of <code>RestServletDefault</code> with additional support for RDF languages.<br>
+				The start of the class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<jc>// Proof-of-concept resource that shows off the capabilities of working with POJO resources.
+	// Consists of an in-memory address book repository.</jc>
+	<ja>@RestResource</ja>(
+		messages=<js>"nls/AddressBookResource"</js>,
+		properties={
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>),
+			<ja>@Property</ja>(name=HtmlSerializerProperties.<jsf>HTML_uriAnchorText</jsf>, value=<jsf>TO_STRING</jsf>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_description</jsf>, value=<js>"$L{description}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
+		},
+		encoders=GzipEncoder.<jk>class</jk>
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+			</p>
+			<p>
+				Notice how serializer and parser properties can be specified using the <code>@RestResource.properties()</code> annotation.<br>
+				The <jsf>SERIALIZER_quoteChar</jsf> is a property common to all serializers, including the JSON serializer.
+				The remaining properties are specific to the HTML serializer.
+			</p>
+			<p>
+ 				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
+ 				These variables are replaced at runtime based on the HTTP request locale.
+				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
+				See {@link com.ibm.juno.server.RestServlet#getVarResolver()} for more information.
+			</p>
+			<p>
+				This document won't go into all the details of the Juno <code>RestServlet</code> class.<br>
+				Refer to the {@link com.ibm.juno.server} documentation for more information on the REST servlet class in general.
+			</p>
+			<p>
+				The rest of the code in the resource class consists of REST methods that simply accept and return POJOs.<br>
+				The framework takes care of all content negotiation, serialization/parsing, and error handling.<br>
+				Below are 3 of those methods to give you a general idea of the concept:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404})
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+	
+	<jc>// POST person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/people"</js>, guards=AdminGuard.<jk>class</jk>, rc={307,404})
+	<jk>public void</jk> createPerson(RestResponse res, <ja>@Content</ja> CreatePerson cp) <jk>throws</jk> Exception {
+		Person p = addressBook.createPerson(cp);
+		res.sendRedirect(p.<jf>uri</jf>);
+	}
+
+	<jc>// DELETE person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"DELETE"</js>, path=<js>"/people/{id}"</js>, guards=AdminGuard.<jk>class</jk>, rc={200,404})
+	<jk>public</jk> String deletePerson(RestResponse res, <ja>@Attr</ja> <jk>int</jk> id) <jk>throws</jk> Exception {
+		Person p = findPerson(id);
+		addressBook.remove(p);
+		<jk>return</jk> <js>"DELETE successful"</js>;			
+	}	
+			</p>
+			<p>
+				The resource class can be registered with the web application like any other servlet, or can be 
+					defined as a child of another resource through the {@link com.ibm.juno.server.annotation.RestResource#children()} annotation.
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServlet"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.2 - Using RestServlet with annotations</h4>
+		<div class='topic'>
+			<p>
+				For fine-tuned control of media types, the {@link com.ibm.juno.server.RestServlet} class 
+					can be subclassed directly.<br>
+				The serializers/parsers can be specified through annotations at the class and/or method levels.
+			</p>
+			<p>
+				An equivalent <code>AddressBookResource</code> class could be defined to only support JSON using
+					the following definition:
+			</p>
+			<p class='bcode'>
+	<ja>@RestResource</ja>(
+		serializers={JsonSerializer.<jk>class</jk>},
+		parsers={JsonParser.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServlet {
+			</p>
+			<p>
+				Likewise, serializers and parsers can be specified/augmented/overridden at the method level like so:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404},
+		serializers={JsonSerializer.<jk>class</jk>},
+		parsers={JsonParser.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+			</p>
+			<p>
+				The {@link com.ibm.juno.server.annotation.RestMethod#serializersInherit()} and 
+					{@link com.ibm.juno.server.annotation.RestMethod#parsersInherit()} control how various artifacts
+					are inherited from the parent class.<br>
+				Refer to {@link com.ibm.juno.server} for additional information on using these annotations.
+			</p>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="DefaultProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.3 - Using JAX-RS DefaultProvider</h4>
+		<div class='topic'>
+			<p>
+				JSON media type support in JAX-RS can be achieved by using the {@link com.ibm.juno.server.jaxrs.DefaultProvider} class.<br>
+				It implements the JAX-RS <code>MessageBodyReader</code> and <code>MessageBodyWriter</code> interfaces for all Juno supported media types.
+			</p>
+			<p>
+				The <code>DefaultProvider</code> class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonSerializer</jc>
+		<js>"application/json+simple"</js>,<js>"text/json+simple"</js>,    <jc>// JsonSerializer.Simple</jc>
+		<js>"application/json+schema"</js>,<js>"text/json+schema"</js>,    <jc>// JsonSchemaSerializer</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlDocSerializer</jc>
+		<js>"text/xml+simple"</js>,                               <jc>// XmlDocSerializer.Simple</jc>
+		<js>"text/xml+schema"</js>,                               <jc>// XmlSchemaDocSerializer</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlDocSerializer</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingSerializer</jc>
+		<js>"text/xml+soap"</js>,                                 <jc>// SoapXmlSerializer</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectSerializer</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonParser</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlParser</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlParser</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingParser</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectParser</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			JsonSerializer.<jk>class</jk>,
+			JsonSerializer.Simple.<jk>class</jk>,
+			JsonSchemaSerializer.<jk>class</jk>,
+			XmlDocSerializer.<jk>class</jk>,
+			XmlDocSerializer.Simple.<jk>class</jk>,
+			XmlSchemaDocSerializer.<jk>class</jk>,
+			HtmlDocSerializer.<jk>class</jk>,
+			UrlEncodingSerializer.<jk>class</jk>,
+			SoapXmlSerializer.<jk>class</jk>,
+			JavaSerializedObjectSerializer.<jk>class</jk>
+		},
+		parsers={
+			JsonParser.<jk>class</jk>,
+			XmlParser.<jk>class</jk>,
+			HtmlParser.<jk>class</jk>,
+			UrlEncodingParser.<jk>class</jk>,
+			JavaSerializedObjectParser.<jk>class</jk>,
+		}
+	)
+	<jk>public final class</jk> DefaultProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				That's the entire class.  It consists of only annotations to hook up media types to Juno serializers and parsers.
+				The <ja>@Provider</ja>, <ja>@Produces</ja>, and <ja>@Consumes</ja> annotations are standard JAX-RS annotations, and the <ja>@JunoProvider</ja> annotation is from Juno.
+			</p>
+			<p>
+				To enable the provider, you need to make the JAX-RS environment aware of it.
+				In Wink, this is accomplished by adding an entry to a config file.
+			</p>
+			<p class='bcode'>
+	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>"2.3"</xs><xt>&gt;</xt>
+		<xt>&lt;servlet&gt;</xt>
+			<xt>&lt;servlet-name&gt;</xt>WinkService<xt>&lt;/servlet-name&gt;</xt>
+			<xt>&lt;servlet-class&gt;</xt>org.apache.wink.server.internal.servlet.RestServlet<xt>&lt;/servlet-class&gt;</xt>
+			<xt>&lt;init-param&gt;</xt>
+				<xt>&lt;param-name&gt;</xt>applicationConfigLocation<xt>&lt;/param-name&gt;</xt>
+				<xt>&lt;param-value&gt;</xt>/WEB-INF/wink.cfg<xt>&lt;/param-value&gt;</xt>
+			<xt>&lt;/init-param&gt;</xt>
+		<xt>&lt;/servlet&gt;</xt>
+			</p>
+			<p>
+				Simply include a reference to the provider in the configuration file.
+			<p class='bcode'>
+	com.ibm.juno.server.jaxrs.DefaultProvider
+			</p>
+			<p>
+				Properties can be specified on providers through the {@link com.ibm.juno.server.jaxrs.JunoProvider#properties()} annotation.<br>
+				Properties can also be specified at the method level by using the {@link com.ibm.juno.server.annotation.RestMethod#properties} annotation, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@GET</ja>
+	<ja>@Produces</ja>(<js>"*/*"</js>)
+	<ja>@RestMethod</ja>( <jc>/* Override some properties */</jc>
+		properties={
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public</jk> Message getMessage() {
+		<jk>return</jk> message;
+	}
+			</p>
+			<h6 class='topic'>Limitations</h6>
+			<p>
+				In general, the Juno REST API is considerably more flexible than the JAX-RS API, since you can specify and override
+					serializers, parsers, properties, filters, converters, guards, etc... at both the class and method levels.<br>
+				Therefore, the JAX-RS API has the following limitations that the Juno Server API does not:
+			</p>
+			<ul>
+				<li>The ability to specify different media type providers at the class and method levels.<br> 
+					For example, you may want to use <code>JsonSerializer</code> with one set of properties on 
+						one class, and another instance with different properties on another class.<br>
+					There is currently no way to define this at the class level.<br>
+					You can override properties at the method level, but this can be cumbersome since it would have to be
+						done for all methods in the resource.<br><br>
+				<li>The Juno Server API allows you to manipulate properties programatically through the {@link com.ibm.juno.server.RestResponse#setProperty(String,Object)}
+					method, and through the {@link com.ibm.juno.server.annotation.Properties} annotation.<br>
+					There is no equivalent in JAX-RS.
+			</ul>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="BaseProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.4 - Using JAX-RS BaseProvider with annotations</h4>
+		<div class='topic'>
+			<p>
+				To provide support for only JSON media types, you can define your own provider class, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonSerializer</jc>
+		<js>"application/json+simple"</js>,<js>"text/json+simple"</js>,    <jc>// JsonSerializer.Simple</jc>
+		<js>"application/json+schema"</js>,<js>"text/json+schema"</js>     <jc>// JsonSchemaSerializer</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>                  <jc>// JsonParser</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			JsonSerializer.<jk>class</jk>,
+			JsonSerializer.Simple.<jk>class</jk>,
+			JsonSchemaSerializer.<jk>class</jk>,
+		},
+		parsers={
+			JsonParser.<jk>class</jk>,
+		}
+		properties={
+			<ja>@Property</ja>(name=SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>)
+		}
+	)
+	<jk>public final class</jk> MyRdfProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				Then register it with Wink the same way as <code>DefaultProvider</code>.
+			</p>
+		</div>
+
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestClientSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.2 - REST client support</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class provides an easy-to-use REST client interface with 
+				pluggable media type handling using any of the Juno serializers and parsers.<br>
+			Defining a client to support JSON media types on HTTP requests and responses can be done in one line of code:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a client to handle JSON requests and responses.</jc>
+	RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+		</p>
+		<p>
+			The client handles all content negotiation based on the registered serializers and parsers.
+		</p>
+		<p>
+			The following code is pulled from the main method of the <code>ClientTest</code> class in the sample web application, and
+				is run against the <code>AddressBookResource</code> class running within the sample app.<br>
+			It shows how the client can be used to interact with the REST API while completely hiding the negotiated content type and working with nothing more than beans.
+		</p>
+		<h6 class='figure'>Example</h6>
+		<p class='bcode'>
+	String root = <js>"http://localhost:9080/sample/addressBook"</js>;
+	
+	<jc>// Get the current contents of the address book</jc>
+	AddressBook ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Delete the existing entries</jc>
+	<jk>for</jk> (Person p : ab) {
+		String r = client.doDelete(p.<jf>uri</jf>).getResponse(String.<jk>class</jk>);
+		System.<jsm>out</jsm>.println(<js>"Deleted person "</js> + p.<jf>name</jf> + <js>", response = "</js> + r);
+	}
+	
+	<jc>// Make sure they're gone</jc>
+	ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Add 1st person again</jc>
+	CreatePerson cp = <jk>new</jk> CreatePerson(
+		<js>"Barack Obama"</js>, 
+		<jsm>toCalendar</jsm>(<js>"Aug 4, 1961"</js>),
+		<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>true</jk>),
+		<jk>new</jk> CreateAddress(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, <js>"IL"</js>, 60615, <jk>false</jk>)
+	); 
+	Person p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add 2nd person again, but add addresses separately</jc>
+	cp = <jk>new</jk> CreatePerson(
+		<js>"George Walker Bush"</js>, 
+		toCalendar(<js>"Jul 6, 1946"</js>)
+	);
+	p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add addresses to 2nd person</jc>
+	CreateAddress ca = <jk>new</jk> CreateAddress(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, <js>"TX"</js>, 76638, <jk>true</jk>);
+	Address a = client.doPost(p.<jf>uri</jf> + <js>"/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+				
+	ca = <jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>false</jk>);
+	a = client.doPost(p.<jf>uri</jf> + "/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+	
+	<jc>// Find 1st person, and change name</jc>
+	Person[] pp = client.doGet(root + <js>"?q={name:\"'Barack+Obama'\"}"</js>).getResponse(Person[].<jk>class</jk>);
+	String r = client.doPut(pp[0].<jf>uri</jf> + <js>"/name"</js>, <js>"Barack Hussein Obama"</js>).getResponse(String.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Changed name, response = "</js> + r);
+	p = client.doGet(pp[0].<jf>uri</jf>).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"New name = "</js> + p.<jf>name</jf>);
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	Number of entries = 2
+	Deleted person Barack Obama, response = DELETE successful
+	Deleted person George Walker Bush, response = DELETE successful
+	Number of entries = 0
+	Created person Barack Obama, uri = http://localhost:9080/sample/addressBook/people/3
+	Created person George Walker Bush, uri = http://localhost:9080/sample/addressBook/people/4
+	Created address http://localhost:9080/sample/addressBook/addresses/7
+	Created address http://localhost:9080/sample/addressBook/addresses/8
+	Changed name, response = PUT successful
+	New name = Barack Hussein Obama
+		</p>
+	</div>
+</div>
+<p align="center"><i><b>*** f�n ***</b></i></p>
+
+</body>
+</html>
\ No newline at end of file


[34/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$A.class
new file mode 100755
index 0000000..1189531
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B$1.class
new file mode 100755
index 0000000..d2f1d9a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B.class
new file mode 100755
index 0000000..4518a98
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C$1.class
new file mode 100755
index 0000000..7910de6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C.class
new file mode 100755
index 0000000..f1ca5a3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$D.class
new file mode 100755
index 0000000..90bb7d4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$1.class
new file mode 100755
index 0000000..2251472
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$2.class
new file mode 100755
index 0000000..794a5b3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$3.class
new file mode 100755
index 0000000..29497df
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1.class
new file mode 100755
index 0000000..830e3b7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E2.class
new file mode 100755
index 0000000..b8ab1b7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$F.class
new file mode 100755
index 0000000..7d5e9e7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$G.class
new file mode 100755
index 0000000..0919c06
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$J.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$J.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$J.class
new file mode 100755
index 0000000..6081999
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$J.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R1.class
new file mode 100755
index 0000000..f4894d3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R2.class
new file mode 100755
index 0000000..e9cb6a1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R3.class
new file mode 100755
index 0000000..7ab3013
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common.class
new file mode 100755
index 0000000..57a89aa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Common.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$1.class
new file mode 100755
index 0000000..0623761
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A1.class
new file mode 100755
index 0000000..3c0fafa
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A2.class
new file mode 100755
index 0000000..e1a97b9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A3.class
new file mode 100755
index 0000000..037186e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$B.class
new file mode 100755
index 0000000..d3dc845
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$C.class
new file mode 100755
index 0000000..66b3d4e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser.class
new file mode 100755
index 0000000..ce461c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_CommonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$A.class
new file mode 100755
index 0000000..69ef1c3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$B.class
new file mode 100755
index 0000000..7f7582a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$C.class
new file mode 100755
index 0000000..474c452
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json.class
new file mode 100755
index 0000000..ad4ee42
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_Json.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$A.class
new file mode 100755
index 0000000..7dddfb9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$B.class
new file mode 100755
index 0000000..9646a62
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$C.class
new file mode 100755
index 0000000..e822169
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser.class
new file mode 100755
index 0000000..34255f0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonSchema.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonSchema.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonSchema.class
new file mode 100755
index 0000000..5f66192
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/json/CT_JsonSchema.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$1.class
new file mode 100755
index 0000000..b543f76
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A1.class
new file mode 100755
index 0000000..69274cc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A2.class
new file mode 100755
index 0000000..cb36d72
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A3.class
new file mode 100755
index 0000000..1a66f2f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$B.class
new file mode 100755
index 0000000..81f928c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$C.class
new file mode 100755
index 0000000..813ff58
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon.class
new file mode 100755
index 0000000..f906e0f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_Uon.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$1.class
new file mode 100755
index 0000000..70208a8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A1.class
new file mode 100755
index 0000000..2aec068
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A2.class
new file mode 100755
index 0000000..1ed15c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A3.class
new file mode 100755
index 0000000..5b9dceb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$B.class
new file mode 100755
index 0000000..dd8c49e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$C.class
new file mode 100755
index 0000000..62d2802
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding.class
new file mode 100755
index 0000000..d031e52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_CommonParser_UrlEncoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$A.class
new file mode 100755
index 0000000..5da3664
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B$1.class
new file mode 100755
index 0000000..92142e5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B.class
new file mode 100755
index 0000000..8e56d21
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C$1.class
new file mode 100755
index 0000000..5089134
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C.class
new file mode 100755
index 0000000..4590554
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$D.class
new file mode 100755
index 0000000..0c59906
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$1.class
new file mode 100755
index 0000000..7d7433d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$2.class
new file mode 100755
index 0000000..65cacdf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$3.class
new file mode 100755
index 0000000..b8188d2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1.class
new file mode 100755
index 0000000..cb12ed6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E2.class
new file mode 100755
index 0000000..b7c1269
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$F.class
new file mode 100755
index 0000000..e4ec430
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$G.class
new file mode 100755
index 0000000..7bbc560
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R1.class
new file mode 100755
index 0000000..baeb3b7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R2.class
new file mode 100755
index 0000000..f51a395
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R3.class
new file mode 100755
index 0000000..0822bbd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon.class
new file mode 100755
index 0000000..8a72db5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_Uon.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$A.class
new file mode 100755
index 0000000..d614bc8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B$1.class
new file mode 100755
index 0000000..00d9689
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B.class
new file mode 100755
index 0000000..c878893
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C$1.class
new file mode 100755
index 0000000..539b7e1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C.class
new file mode 100755
index 0000000..e1005a3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$D.class
new file mode 100755
index 0000000..0866503
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$1.class
new file mode 100755
index 0000000..602508b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$2.class
new file mode 100755
index 0000000..b34e325
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$3.class
new file mode 100755
index 0000000..2d98c82
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1.class
new file mode 100755
index 0000000..64ca42a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E2.class
new file mode 100755
index 0000000..e33069b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$F.class
new file mode 100755
index 0000000..fb7b4db
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$G.class
new file mode 100755
index 0000000..21ad9df
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R1.class
new file mode 100755
index 0000000..a6f711e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R2.class
new file mode 100755
index 0000000..154b15e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R3.class
new file mode 100755
index 0000000..039924a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding$R3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding.class
new file mode 100755
index 0000000..e18df74
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_Common_UrlEncoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser$A.class
new file mode 100755
index 0000000..7497649
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser.class
new file mode 100755
index 0000000..579fd8a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader$SlowStringReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader$SlowStringReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader$SlowStringReader.class
new file mode 100755
index 0000000..c4385bd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader$SlowStringReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader.class
new file mode 100755
index 0000000..150c7b8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonParserReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonSerializer.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonSerializer.class
new file mode 100755
index 0000000..4f59f72
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UonSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$A.class
new file mode 100755
index 0000000..d6a5a52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$B.class
new file mode 100755
index 0000000..5b8db55
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C.class
new file mode 100755
index 0000000..612d649
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C1.class
new file mode 100755
index 0000000..154c7f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D.class
new file mode 100755
index 0000000..81bef06
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D1.class
new file mode 100755
index 0000000..f68d94a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D2.class
new file mode 100755
index 0000000..6282b08
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$E.class
new file mode 100755
index 0000000..8962129
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser.class
new file mode 100755
index 0000000..4686f1f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingSerializer.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingSerializer.class
new file mode 100755
index 0000000..e0c83da
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/CT_UrlEncodingSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$A.class
new file mode 100755
index 0000000..4816315
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$1.class
new file mode 100755
index 0000000..14b653e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$10.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$10.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$10.class
new file mode 100755
index 0000000..b527f33
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$10.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$2.class
new file mode 100755
index 0000000..751c6d9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$3.class
new file mode 100755
index 0000000..b8b33f1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$4.class
new file mode 100755
index 0000000..c413822
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$5.class
new file mode 100755
index 0000000..af2d7a0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$6.class
new file mode 100755
index 0000000..014114e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$7.class
new file mode 100755
index 0000000..8083c61
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$8.class
new file mode 100755
index 0000000..789abca
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$9.class
new file mode 100755
index 0000000..57f4515
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B$9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B.class
new file mode 100755
index 0000000..7fcaaac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$1.class
new file mode 100755
index 0000000..03d22a2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$10.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$10.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$10.class
new file mode 100755
index 0000000..eed5757
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$10.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$2.class
new file mode 100755
index 0000000..9af9dc5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$3.class
new file mode 100755
index 0000000..9808dcd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$4.class
new file mode 100755
index 0000000..2019f18
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$5.class
new file mode 100755
index 0000000..1d98d77
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$6.class
new file mode 100755
index 0000000..235a670
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$7.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$7.class
new file mode 100755
index 0000000..86ef90c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$7.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$8.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$8.class
new file mode 100755
index 0000000..00f45dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$8.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$9.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$9.class
new file mode 100755
index 0000000..5dc908e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C$9.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C.class
new file mode 100755
index 0000000..c938b82
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs.class
new file mode 100755
index 0000000..2ba09f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/urlencoding/DTOs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_Args.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_Args.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_Args.class
new file mode 100755
index 0000000..b14bc53
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_Args.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ArrayUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ArrayUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ArrayUtils.class
new file mode 100755
index 0000000..b8b597a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ArrayUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayCache.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayCache.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayCache.class
new file mode 100755
index 0000000..489e097
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayCache.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayInOutStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayInOutStream.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayInOutStream.class
new file mode 100755
index 0000000..e1ea67b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ByteArrayInOutStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CharSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CharSet.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CharSet.class
new file mode 100755
index 0000000..4b34777
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CharSet.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A.class
new file mode 100755
index 0000000..fe6907b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A1.class
new file mode 100755
index 0000000..4195709
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A2.class
new file mode 100755
index 0000000..0323ca2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils.class
new file mode 100755
index 0000000..78dc2f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_ClassUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CollectionUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CollectionUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CollectionUtils.class
new file mode 100755
index 0000000..efc3ed5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_CollectionUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_FilteredMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_FilteredMap.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_FilteredMap.class
new file mode 100755
index 0000000..2fd15c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_FilteredMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$1.class
new file mode 100755
index 0000000..5dcb20f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$2.class
new file mode 100755
index 0000000..f9b7c18
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$3.class
new file mode 100755
index 0000000..9be5c4b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$4.class
new file mode 100755
index 0000000..997d764
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$5.class
new file mode 100755
index 0000000..2d98409
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestInputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestInputStream.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestInputStream.class
new file mode 100755
index 0000000..ff2244e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestInputStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestOutputStream.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestOutputStream.class
new file mode 100755
index 0000000..ab362cc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestOutputStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestReader.class
new file mode 100755
index 0000000..6a0604b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestWriter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestWriter.class
new file mode 100755
index 0000000..d333fcc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe$TestWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe.class
new file mode 100755
index 0000000..87e69d3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOPipe.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestInputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestInputStream.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestInputStream.class
new file mode 100755
index 0000000..f264018
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestInputStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestOutputStream.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestOutputStream.class
new file mode 100755
index 0000000..917cf82
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestOutputStream.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestReader.class
new file mode 100755
index 0000000..dc3f782
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestWriter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestWriter.class
new file mode 100755
index 0000000..6650d91
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/utils/CT_IOUtils$TestWriter.class differ



[18/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.java
new file mode 100755
index 0000000..5b865a1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfCollectionFormat.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import com.ibm.juno.core.jena.annotation.*;
+
+/**
+ * Used in conjunction with the {@link Rdf#collectionFormat() @Rdf.collectionFormat()} annotation to fine-tune how
+ * 	classes, beans, and bean properties are serialized, particularly collections.
+ * <p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public enum RdfCollectionFormat {
+
+	/**
+	 * Default formatting (default).
+	 * <p>
+	 * Inherit formatting from parent class or parent package.
+	 *	If no formatting specified at any level, default is {@link #SEQ}.
+	 */
+	DEFAULT,
+
+	/**
+	 * Causes collections and arrays to be rendered as RDF sequences.
+	 */
+	SEQ,
+
+	/**
+	 * Causes collections and arrays to be rendered as RDF bags.
+	 */
+	BAG,
+
+	/**
+	 * Causes collections and arrays to be rendered as RDF lists.
+	 */
+	LIST,
+
+	/**
+	 * Causes collections and arrays to be rendered as multi-valued RDF properties instead of sequences.
+	 * <p>
+	 * 	Note that enabling this setting will cause order of elements in the collection to be lost.
+	 */
+	MULTI_VALUED;
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$N3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$N3.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$N3.class
new file mode 100755
index 0000000..9170a84
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$N3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$NTriple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$NTriple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$NTriple.class
new file mode 100755
index 0000000..4a64589
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$NTriple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Turtle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Turtle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Turtle.class
new file mode 100755
index 0000000..39cc7e4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Turtle.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Xml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Xml.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Xml.class
new file mode 100755
index 0000000..3398700
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser$Xml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.class
new file mode 100755
index 0000000..8f78101
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.java
new file mode 100755
index 0000000..50fec99
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParser.java
@@ -0,0 +1,527 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import static com.ibm.juno.core.jena.Constants.*;
+import static com.ibm.juno.core.jena.RdfProperties.*;
+import static com.ibm.juno.core.utils.StringUtils.*;
+import static com.ibm.juno.core.xml.XmlUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.hp.hpl.jena.rdf.model.*;
+import com.hp.hpl.jena.util.iterator.*;
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Parses RDF into POJOs.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	Refer to <a class='doclink' href='package-summary.html#ParserConfigurableProperties'>Configurable Properties</a>
+ * 		for the entire list of configurable properties.
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for language-specific parsers:
+ * <ul>
+ * 	<li>{@link RdfParser.Xml} - RDF/XML and RDF/XML-ABBREV.
+ * 	<li>{@link RdfParser.NTriple} - N-TRIPLE.
+ * 	<li>{@link RdfParser.Turtle} - TURTLE.
+ * 	<li>{@link RdfParser.N3} - N3.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <p>
+ * 	See <a class='doclink' href='package-summary.html#TOC'>RDF Overview</a> for an overview of RDF support in Juno.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Consumes(value="text/xml+rdf")
+public class RdfParser extends ReaderParser {
+
+	/** Default XML parser, all default settings.*/
+	public static final RdfParser DEFAULT_XML = new RdfParser.Xml().lock();
+
+	/** Default Turtle parser, all default settings.*/
+	public static final RdfParser DEFAULT_TURTLE = new RdfParser.Turtle().lock();
+
+	/** Default N-Triple parser, all default settings.*/
+	public static final RdfParser DEFAULT_NTRIPLE = new RdfParser.NTriple().lock();
+
+	/** Default N3 parser, all default settings.*/
+	public static final RdfParser DEFAULT_N3 = new RdfParser.N3().lock();
+
+
+	/** Consumes RDF/XML input */
+	@Consumes("text/xml+rdf")
+	public static class Xml extends RdfParser {
+		/** Constructor */
+		public Xml() {
+			setProperty(RDF_language, LANG_RDF_XML);
+		}
+	}
+
+	/** Consumes N-Triple input */
+	@Consumes(value="text/n-triple")
+	public static class NTriple extends RdfParser {
+		/** Constructor */
+		public NTriple() {
+			setProperty(RDF_language, LANG_NTRIPLE);
+		}
+	}
+
+	/** Consumes Turtle input */
+	@Consumes(value="text/turtle")
+	public static class Turtle extends RdfParser {
+		/** Constructor */
+		public Turtle() {
+			setProperty(RDF_language, LANG_TURTLE);
+		}
+	}
+
+	/** Consumes N3 input */
+	@Consumes(value="text/n3")
+	public static class N3 extends RdfParser {
+		/** Constructor */
+		public N3() {
+			setProperty(RDF_language, LANG_N3);
+		}
+	}
+
+
+	/** Jena parser properties currently set on this parser. */
+	protected transient RdfParserProperties rpp = new RdfParserProperties();
+
+
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	@Override /* ReaderParser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+
+		in = IOUtils.getBufferedReader(in, estimatedSize);
+
+		RdfParserContext rctx = (RdfParserContext)ctx;
+
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+
+		Model model = rctx.model;
+		RDFReader r = rctx.rdfReader;
+		r.read(model, in, null);
+		BeanContext bc = ctx.getBeanContext();
+
+		List<Resource> roots = getRoots(model, rctx);
+
+		try {
+			// Special case where we're parsing a loose collection of resources.
+			if (rctx.isLooseCollection() && (type.isCollection() || type.isArray())) {
+				Collection c = null;
+				if (type.isArray())
+					c = new ArrayList();
+				else
+					c = (type.canCreateNewInstance(ctx.getOuter()) ? (Collection<?>)type.newInstance(ctx.getOuter()) : new ObjectList(bc));
+				for (Resource resource : roots)
+					c.add(parseAnything(type.getElementType(), resource, null, rctx, ctx.getOuter(), null));
+
+				if (type.isArray())
+					return (T)bc.toArray(type, c);
+				return (T)c;
+			}
+
+		if (roots.isEmpty())
+			return null;
+		if (roots.size() > 1)
+			throw new ParseException("Too many root nodes found in model:  {0}", roots.size());
+		Resource resource = roots.get(0);
+
+			return parseAnything(type, resource, null, rctx, ctx.getOuter(), null);
+
+		} catch (ParseException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new ParseException(e);
+		}
+	}
+
+	/*
+	 * Finds the roots in the model using either the "root" property to identify it,
+	 * 	or by resorting to scanning the model for all nodes with no incoming predicates.
+	 */
+	private List<Resource> getRoots(Model m, RdfParserContext ctx) {
+		List<Resource> l = new LinkedList<Resource>();
+
+		// First try to find the root using the "http://www.ibm.com/juno/root" property.
+		Property root = m.createProperty(ctx.junoNs.getUri(), RDF_junoNs_ROOT);
+		for (ResIterator i  = m.listResourcesWithProperty(root); i.hasNext();)
+			l.add(i.next());
+
+		if (! l.isEmpty())
+			return l;
+
+		// Otherwise, we need to find all resources that aren't objects.
+		// We want to explicitly ignore statements where the subject
+		// and object are the same node.
+		Set<RDFNode> objects = new HashSet<RDFNode>();
+		for (StmtIterator i = m.listStatements(); i.hasNext();) {
+			Statement st = i.next();
+			RDFNode subject = st.getSubject();
+			RDFNode object = st.getObject();
+			if (object.isResource() && ! object.equals(subject))
+				objects.add(object);
+		}
+		for (ResIterator i = m.listSubjects(); i.hasNext();) {
+			Resource r = i.next();
+			if (! objects.contains(r))
+				l.add(r);
+		}
+		return l;
+	}
+
+	private <T> BeanMap<T> parseIntoBeanMap(Resource r2, BeanMap<T> m, RdfParserContext ctx) throws ParseException {
+		BeanMeta<T> bm = m.getMeta();
+		if (bm.hasBeanUriProperty() && r2.getURI() != null)
+			m.putBeanUri(r2.getURI());
+		Property subTypeIdProperty = null;
+		BeanPropertyMeta<T> stp = bm.getSubTypeIdProperty();
+		if (stp != null) {
+			subTypeIdProperty = ctx.getProperty(stp.getName());
+			Statement st = r2.getProperty(subTypeIdProperty);
+			if (st == null)
+				throw new ParseException("Could not find subtype ID property for bean of type ''{0}''", m.getClassMeta());
+			String subTypeId = st.getLiteral().getString();
+			stp.set(m, subTypeId);
+		}
+		for (StmtIterator i = r2.listProperties(); i.hasNext();) {
+			Statement st = i.next();
+			Property p = st.getPredicate();
+			if (p.equals(subTypeIdProperty))
+				continue;
+			String key = XmlUtils.decode(p.getLocalName());
+			BeanPropertyMeta<T> pMeta = m.getPropertyMeta(key);
+			if (pMeta != null) {
+				RDFNode o = st.getObject();
+				ClassMeta<?> cm = pMeta.getClassMeta();
+				if ((cm.isArray() || cm.isCollection()) && isMultiValuedCollections(ctx, pMeta)) {
+					Object val = parseAnything(cm.getElementType(), o, pMeta, ctx, m.getBean(false), key);
+					pMeta.add(m, val);
+				} else {
+					Object val = parseAnything(cm, o, pMeta, ctx, m.getBean(false), key);
+					pMeta.set(m, val);
+				}
+			} else if (! (p.equals(ctx.pRoot) || p.equals(ctx.pClass) || p.equals(subTypeIdProperty))) {
+				if (bm.isSubTyped()) {
+					RDFNode o = st.getObject();
+					Object val = parseAnything(object(), o, null, ctx, m.getBean(false), key);
+					m.put(key, val);
+				} else {
+					onUnknownProperty(ctx, key, m, -1, -1);
+				}
+			}
+		}
+		return m;
+	}
+
+	private boolean isMultiValuedCollections(RdfParserContext ctx, BeanPropertyMeta<?> pMeta) {
+		if (pMeta != null && pMeta.getRdfMeta().getCollectionFormat() != RdfCollectionFormat.DEFAULT)
+			return pMeta.getRdfMeta().getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED;
+		return ctx.getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED;
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private <T> T parseAnything(ClassMeta<T> nt, RDFNode n, BeanPropertyMeta<?> p, RdfParserContext ctx, Object outer, Object name) throws ParseException {
+
+		BeanContext bc = ctx.getBeanContext();
+
+		if (nt == null)
+			nt = (ClassMeta<T>)object();
+		PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+		ClassMeta<?> ft = nt.getFilteredClassMeta();
+
+		if (! ft.canCreateNewInstance(outer)) {
+			if (n.isResource()) {
+				Statement st = n.asResource().getProperty(ctx.pClass);
+				if (st != null) {
+ 					String c = st.getLiteral().getString();
+					ft = nt = (ClassMeta<T>)bc.getClassMetaFromString(c);
+				}
+			}
+		}
+
+		try {
+
+			Object o = null;
+			if (n.isResource() && n.asResource().getURI() != null && n.asResource().getURI().equals(RDF_NIL)) {
+				// Do nothing.  Leave o == null.
+			} else if (ft.isObject()) {
+				if (n.isLiteral()) {
+					o = n.asLiteral().getValue();
+					if (o instanceof String) {
+						String s = o.toString();
+						s = decode(s);
+						if (ctx.trimWhitespace)
+							s = s.trim();
+						o = s;
+					}
+				}
+				else if (n.isResource()) {
+					Resource r = n.asResource();
+					if (ctx.wasAlreadyProcessed(r))
+						o = r.getURI();
+					else if (r.getProperty(ctx.pValue) != null) {
+						o = parseAnything(object(), n.asResource().getProperty(ctx.pValue).getObject(), null, ctx, outer, null);
+					} else if (isSeq(r, ctx)) {
+						o = new ObjectList(bc);
+						parseIntoCollection(r.as(Seq.class), (Collection)o, ft.getElementType(), ctx);
+					} else if (isBag(r, ctx)) {
+						o = new ObjectList(bc);
+						parseIntoCollection(r.as(Bag.class), (Collection)o, ft.getElementType(), ctx);
+					} else if (r.canAs(RDFList.class)) {
+						o = new ObjectList(bc);
+						parseIntoCollection(r.as(RDFList.class), (Collection)o, ft.getElementType(), ctx);
+					} else {
+						// If it has a URI and no child properties, we interpret this as an
+						// external resource, and convert it to just a URL.
+						String uri = r.getURI();
+						if (uri != null && ! r.listProperties().hasNext()) {
+							o = r.getURI();
+						} else {
+							o = new ObjectMap(bc);
+							parseIntoMap(r, (Map)o, null, null, ctx);
+						}
+					}
+				} else {
+					throw new ParseException("Unrecognized node type ''{0}'' for object", n);
+				}
+			} else if (ft.isBoolean()) {
+				o = bc.convertToType(getValue(n, ctx, outer), boolean.class);
+			} else if (ft.isCharSequence()) {
+				String s = decode(getValue(n, ctx, outer).toString());
+				if (ctx.trimWhitespace)
+					s = s.trim();
+				o = s;
+			} else if (ft.isChar()) {
+				o = decode(getValue(n, ctx, outer).toString()).charAt(0);
+			} else if (ft.isNumber()) {
+				o = parseNumber(getValue(n, ctx, outer).toString(), (Class<? extends Number>)ft.getInnerClass());
+			} else if (ft.isMap()) {
+				Resource r = n.asResource();
+				if (ctx.wasAlreadyProcessed(r))
+					return null;
+				Map m = (ft.canCreateNewInstance(outer) ? (Map)ft.newInstance(outer) : new ObjectMap(bc));
+				o = parseIntoMap(r, m, nt.getKeyType(), nt.getValueType(), ctx);
+			} else if (ft.isCollection() || ft.isArray()) {
+				if (ft.isArray())
+					o = new ArrayList();
+				else
+				o = (ft.canCreateNewInstance(outer) ? (Collection<?>)ft.newInstance(outer) : new ObjectList(bc));
+				Resource r = n.asResource();
+				if (ctx.wasAlreadyProcessed(r))
+					return null;
+				if (isSeq(r, ctx)) {
+					parseIntoCollection(r.as(Seq.class), (Collection)o, ft.getElementType(), ctx);
+				} else if (isBag(r, ctx)) {
+					parseIntoCollection(r.as(Bag.class), (Collection)o, ft.getElementType(), ctx);
+				} else if (r.canAs(RDFList.class)) {
+					parseIntoCollection(r.as(RDFList.class), (Collection)o, ft.getElementType(), ctx);
+				} else {
+					throw new ParseException("Unrecognized node type ''{0}'' for collection", n);
+				}
+				if (ft.isArray())
+					o = bc.toArray(ft, (Collection)o);
+			} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+				Resource r = n.asResource();
+				if (ctx.wasAlreadyProcessed(r))
+					return null;
+				Map m = new ObjectMap(bc);
+				parseIntoMap(r, m, nt.getKeyType(), nt.getValueType(), ctx);
+				o = ft.newInstanceFromObjectMap(outer, (ObjectMap)m);
+			} else if (ft.canCreateNewBean(outer)) {
+				Resource r = n.asResource();
+				if (ctx.wasAlreadyProcessed(r))
+					return null;
+				BeanMap<?> bm = bc.newBeanMap(outer, ft.getInnerClass());
+				o = parseIntoBeanMap(r, bm, ctx).getBean();
+			} else if (ft.isUri() && n.isResource()) {
+				o = ft.newInstanceFromString(outer, decode(n.asResource().getURI()));
+			} else if (ft.canCreateNewInstanceFromString(outer)) {
+				o = ft.newInstanceFromString(outer, decode(getValue(n, ctx, outer).toString()));
+			} else {
+				throw new ParseException("Class ''{0}'' could not be instantiated.  Reason: ''{1}''", ft.getInnerClass().getName(), ft.getNotABeanReason());
+			}
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (name != null)
+				setName(nt, o, name);
+
+			return (T)o;
+
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			if (p == null)
+				throw new ParseException("Error occurred trying to parse into class ''{0}''", ft).initCause(e);
+			throw new ParseException("Error occurred trying to parse value for bean property ''{0}'' on class ''{1}''",
+				p.getName(), p.getBeanMeta().getClassMeta()
+			).initCause(e);
+		}
+	}
+
+	private boolean isSeq(RDFNode n, RdfParserContext ctx) {
+		if (n.isResource()) {
+			Statement st = n.asResource().getProperty(ctx.pType);
+			if (st != null)
+				return RDF_SEQ.equals(st.getResource().getURI());
+		}
+		return false;
+	}
+
+	private boolean isBag(RDFNode n, RdfParserContext ctx) {
+		if (n.isResource()) {
+			Statement st = n.asResource().getProperty(ctx.pType);
+			if (st != null)
+				return RDF_BAG.equals(st.getResource().getURI());
+		}
+		return false;
+	}
+
+	private Object getValue(RDFNode n, RdfParserContext ctx, Object outer) throws ParseException {
+		if (n.isLiteral())
+			return n.asLiteral().getValue();
+		if (n.isResource()) {
+			Statement st = n.asResource().getProperty(ctx.pValue);
+			if (st != null) {
+				n = st.getObject();
+				if (n.isLiteral())
+					return n.asLiteral().getValue();
+				return parseAnything(object(), st.getObject(), null, ctx, outer, null);
+			}
+		}
+		throw new ParseException("Unknown value type for node ''{0}''", n);
+	}
+
+	private <K,V> Map<K,V> parseIntoMap(Resource r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, RdfParserContext ctx) throws ParseException {
+		// Add URI as "uri" to generic maps.
+		if (r.getURI() != null) {
+			K uri = convertAttrToType(m, "uri", keyType);
+			V value = convertAttrToType(m, r.getURI(), valueType);
+			m.put(uri, value);
+		}
+		for (StmtIterator i = r.listProperties(); i.hasNext();) {
+			Statement st = i.next();
+			Property p = st.getPredicate();
+			String key = p.getLocalName();
+			if (! (key.equals("root") && p.getURI().equals(ctx.junoNs.getUri()))) {
+				key = decode(key);
+				RDFNode o = st.getObject();
+				K key2 = convertAttrToType(m, key, keyType);
+				V value = parseAnything(valueType, o, null, ctx, m, key);
+				m.put(key2, value);
+			}
+
+		}
+		// TODO Auto-generated method stub
+		return m;
+	}
+
+	private <E> Collection<E> parseIntoCollection(Container c, Collection<E> l, ClassMeta<E> et, RdfParserContext ctx) throws ParseException {
+		for (NodeIterator ni = c.iterator(); ni.hasNext();) {
+			E e = parseAnything(et, ni.next(), null, ctx, l, null);
+			l.add(e);
+		}
+		return l;
+	}
+
+	private <E> Collection<E> parseIntoCollection(RDFList list, Collection<E> l, ClassMeta<E> et, RdfParserContext ctx) throws ParseException {
+		for (ExtendedIterator<RDFNode> ni = list.iterator(); ni.hasNext();) {
+			E e = parseAnything(et, ni.next(), null, ctx, l, null);
+			l.add(e);
+		}
+		return l;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public RdfParserContext createContext(ObjectMap op, Method javaMethod, Object outer) {
+		return new RdfParserContext(getBeanContext(), pp, rpp, op, javaMethod, outer);
+	}
+
+	@Override /* CoreApi */
+	public RdfParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! rpp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> RdfParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public RdfParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public RdfParser clone() {
+		try {
+			RdfParser c = (RdfParser)super.clone();
+			c.rpp = rpp.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.class
new file mode 100755
index 0000000..32ba6c5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.java
new file mode 100755
index 0000000..f85e31f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserContext.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import static com.ibm.juno.core.jena.Constants.*;
+import static com.ibm.juno.core.jena.RdfProperties.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.hp.hpl.jena.rdf.model.*;
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Context object that lives for the duration of a single parse of {@link RdfParser}.
+ * <p>
+ * 	See {@link ParserContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class RdfParserContext extends ParserContext {
+
+	final String rdfLanguage;
+	final Namespace junoNs, junoBpNs;
+	final Property pRoot, pValue, pClass, pType;
+	final Model model;
+	final boolean trimWhitespace, looseCollection;
+	final RDFReader rdfReader;
+	final Set<Resource> urisVisited = new HashSet<Resource>();
+	final RdfCollectionFormat collectionFormat;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanContext The bean context being used by the parser.
+	 * @param pp Default general parser properties.
+	 * @param rpp Default Jena parser properties.
+	 * @param op Override properties.
+	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param outer The outer object for instantiating top-level non-static inner classes.
+	 */
+	protected RdfParserContext(BeanContext beanContext, ParserProperties pp, RdfParserProperties rpp, ObjectMap op, Method javaMethod, Object outer) {
+		super(beanContext, pp, op, javaMethod, outer);
+		ObjectMap jenaSettings = new ObjectMap();
+		jenaSettings.putAll(rpp.jenaSettings);
+		if (op == null || op.isEmpty()) {
+			this.rdfLanguage = rpp.rdfLanguage;
+			this.junoNs = rpp.junoNs;
+			this.junoBpNs = rpp.junoBpNs;
+			this.trimWhitespace = rpp.trimWhitespace;
+			this.collectionFormat = rpp.collectionFormat;
+			this.looseCollection = rpp.looseCollection;
+		} else {
+			this.rdfLanguage = op.getString(RDF_language, rpp.rdfLanguage);
+			this.junoNs = (op.containsKey(RDF_junoNs) ? NamespaceFactory.parseNamespace(op.get(RDF_junoNs)) : rpp.junoNs);
+			this.junoBpNs = (op.containsKey(RDF_junoBpNs) ? NamespaceFactory.parseNamespace(op.get(RDF_junoBpNs)) : rpp.junoBpNs);
+			this.trimWhitespace = op.getBoolean(RdfParserProperties.RDF_trimWhitespace, rpp.trimWhitespace);
+			this.collectionFormat = RdfCollectionFormat.valueOf(op.getString(RDF_collectionFormat, "DEFAULT"));
+			this.looseCollection = op.getBoolean(RDF_looseCollection, rpp.looseCollection);
+		}
+		this.model = ModelFactory.createDefaultModel();
+		addModelPrefix(junoNs);
+		addModelPrefix(junoBpNs);
+		this.pRoot = model.createProperty(junoNs.getUri(), RDF_junoNs_ROOT);
+		this.pValue = model.createProperty(junoNs.getUri(), RDF_junoNs_VALUE);
+		this.pClass = model.createProperty(junoNs.getUri(), RDF_junoNs_CLASS);
+		this.pType = model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
+		rdfReader = model.getReader(rdfLanguage);
+
+		// Note: NTripleReader throws an exception if you try to set any properties on it.
+		if (! rdfLanguage.equals(LANG_NTRIPLE)) {
+			for (Map.Entry<String,Object> e : jenaSettings.entrySet())
+				rdfReader.setProperty(e.getKey(), e.getValue());
+		}
+	}
+
+	boolean wasAlreadyProcessed(Resource r) {
+		return ! urisVisited.add(r);
+	}
+
+	/**
+	 * Adds the specified namespace as a model prefix.
+	 *
+	 * @param ns The XML namespace.
+	 */
+	public void addModelPrefix(Namespace ns) {
+		model.setNsPrefix(ns.getName(), ns.getUri());
+	}
+
+	/**
+	 * Constructs a <code>Property</code> in the specified namespace in this mode.
+	 *
+	 * @param namespaceUri The namespace URI.
+	 * @param name The property name.
+	 * @return The new property object.
+	 */
+	public Property getProperty(String namespaceUri, String name) {
+		return model.createProperty(namespaceUri, name);
+	}
+
+	/**
+	 * Constructs a <code>Property</code> in the Juno Bean namespace in this mode.
+	 *
+	 * @param name The property name.
+	 * @return The new property object.
+	 */
+	public Property getProperty(String name) {
+		return model.createProperty(junoBpNs.getUri(), name);
+	}
+
+	/**
+	 * Returns the format for serializing collections.
+	 *
+	 * @return The format for serializing collections.
+	 */
+	protected RdfCollectionFormat getCollectionFormat() {
+		return collectionFormat;
+	}
+
+	/**
+	 * Returns the {@link RdfProperties#RDF_looseCollection} property value.
+	 *
+	 * @return The {@link RdfProperties#RDF_looseCollection} property value.
+	 */
+	protected boolean isLooseCollection() {
+		return looseCollection;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.class
new file mode 100755
index 0000000..c475e4b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.java
new file mode 100755
index 0000000..b6ea048
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfParserProperties.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Configurable properties on the {@link RdfParser} class.
+ * <p>
+ * 	Use the {@link RdfParser#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link RdfParser}.
+ * <ul>
+ * 	<li>{@link RdfProperties}
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RdfParserProperties extends RdfProperties implements Cloneable {
+
+
+	/**
+	 * Trim whitespace from text elements ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, whitespace in text elements will be automatically trimmed.
+	 */
+	public static final String RDF_trimWhitespace = "RdfParser.trimWhitespace";
+
+	boolean trimWhitespace = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	@Override /* RdfProperties */
+	public boolean setProperty(String property, Object value) {
+		if (property.equals(RDF_trimWhitespace))
+			trimWhitespace = BeanContext.DEFAULT.convertToType(value, boolean.class);
+		else
+			return super.setProperty(property, value);
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public RdfParserProperties clone() {
+		try {
+			return (RdfParserProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties$1.class
new file mode 100755
index 0000000..b05e79d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.class
new file mode 100755
index 0000000..804022f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.java
new file mode 100755
index 0000000..8994948
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfProperties.java
@@ -0,0 +1,415 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.jena.annotation.*;
+import com.ibm.juno.core.xml.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Configurable properties common to both the {@link RdfSerializer} and {@link RdfParser} classes.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings("serial")
+public class RdfProperties {
+
+	/**
+	 * Maps RDF writer names to property prefixes that apply to them.
+	 */
+	final static Map<String,String> LANG_PROP_MAP = new HashMap<String,String>() {{
+		put("RDF/XML","rdfXml.");
+		put("RDF/XML-ABBREV","rdfXml.");
+		put("N3","n3.");
+		put("N3-PP","n3.");
+		put("N3-PLAIN","n3.");
+		put("N3-TRIPLES","n3.");
+		put("TURTLE","n3.");
+		put("N-TRIPLE","ntriple.");
+	}};
+
+	/**
+	 * The RDF language to serialize to ({@link String}, default=<js>"RDF/XML-ABBREV"</js>).
+	 * <p>
+	 * 	Can be any of the following:
+	 * <ul>
+	 * 	<li><js>"RDF/XML"</js>
+	 * 	<li><js>"RDF/XML-ABBREV"</js>
+	 * 	<li><js>"N-TRIPLE"</js>
+	 * 	<li><js>"N3"</js> - General name for the N3 writer.
+	 * 		Will make a decision on exactly which writer to use (pretty writer, plain writer or simple writer) when created.
+	 * 		Default is the pretty writer but can be overridden with system property	<code>com.hp.hpl.jena.n3.N3JenaWriter.writer</code>.
+	 * 	<li><js>"N3-PP"</js> - Name of the N3 pretty writer.
+	 * 		The pretty writer uses a frame-like layout, with prefixing, clustering like properties and embedding one-referenced bNodes.
+	 * 	<li><js>"N3-PLAIN"</js> - Name of the N3 plain writer.
+	 * 		The plain writer writes records by subject.
+	 * 	<li><js>"N3-TRIPLES"</js> - Name of the N3 triples writer.
+	 * 		This writer writes one line per statement, like N-Triples, but does N3-style prefixing.
+	 * 	<li><js>"TURTLE"</js> -  Turtle writer.
+	 * 		http://www.dajobe.org/2004/01/turtle/
+	 * </ul>
+	 */
+	public static final String RDF_language = "Rdf.language";
+
+	/**
+	 * The XML namespace for Juno properties ({@link Namespace}, default=<js>{j:'http://www.ibm.com/juno/'}</js>).
+	 */
+	public static final String RDF_junoNs = "Rdf.junoNs";
+
+	/**
+	 * The default XML namespace for bean properties ({@link Namespace}, default=<js>{j:'http://www.ibm.com/junobp/'}</js>).
+	 */
+	public static final String RDF_junoBpNs = "Rdf.junoBpNs";
+
+	/**
+	 * Reuse XML namespaces when RDF namespaces not specified ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	When specified, namespaces defined using {@link XmlNs} and {@link Xml} will be inherited by the RDF serializers.
+	 * 	Otherwise, namespaces will be defined using {@link RdfNs} and {@link Rdf}.
+	 */
+	public static final String RDF_useXmlNamespaces = "Rdf.useXmlNamespaces";
+
+	/**
+	 * RDF/XML property: <code>iri_rules</code> ({@link String}, default=<js>"lax"</js>).
+	 * <p>
+	 *  	Set the engine for checking and resolving.
+	 * <p>
+	 * 	Possible values:
+	 * <ul>
+	 * 	<li><js>"lax"</js> - The rules for RDF URI references only, which does permit spaces although the use of spaces is not good practice.
+	 * 	<li><js>"strict"</js> - Sets the IRI engine with rules for valid IRIs, XLink and RDF; it does not permit spaces in IRIs.
+	 * 	<li><js>"iri"</js> - Sets the IRI engine to IRI (<a href='http://www.ietf.org/rfc/rfc3986.txt'>RFC 3986</a>, <a href='http://www.ietf.org/rfc/rfc3987.txt'>RFC 3987</a>).
+	 * </ul>
+	 */
+	public static final String RDF_arp_iriRules = "Rdf.jena.rdfXml.iri-rules";
+
+	/**
+	 * RDF/XML ARP property: <code>error-mode</code> ({@link String}, default=<js>"lax"</js>).
+	 * <p>
+	 * 	This allows a coarse-grained approach to control of error handling.
+	 * <p>
+	 * 	Possible values:
+	 * <ul>
+	 * 	<li><js>"default"</js>
+	 * 	<li><js>"lax"</js>
+	 * 	<li><js>"strict"</js>
+	 * 	<li><js>"strict-ignore"</js>
+	 * 	<li><js>"strict-warning"</js>
+	 * 	<li><js>"strict-error"</js>
+	 * 	<li><js>"strict-fatal"</js>
+	 * </ul>
+	 * <p>
+	 * 	See also:
+	 * <ul>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setDefaultErrorMode()'>ARPOptions.setDefaultErrorMode()</a>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setLaxErrorMode()'>ARPOptions.setLaxErrorMode()</a>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setStrictErrorMode()'>ARPOptions.setStrictErrorMode()</a>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setStrictErrorMode(int)'>ARPOptions.setStrictErrorMode(int)</a>
+	 * </ul>
+	 */
+	public static final String RDF_arp_errorMode = "Rdf.jena.rdfXml.error-mode";
+
+	/**
+	 * RDF/XML ARP property: <code>embedding</code> ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * 	Sets ARP to look for RDF embedded within an enclosing XML document.
+	 * <p>
+	 * 	See also:
+	 * <ul>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setEmbedding(boolean)'>ARPOptions.setEmbedding(boolean)</a>
+	 * </ul>
+	 */
+	public static final String RDF_arp_embedding = "Rdf.jena.rdfXml.embedding";
+
+	/**
+	 * RDF/XML ARP property: <code>ERR_xxx</code> ({@link String}).
+	 * <p>
+	 * 	Provides fine-grained control over detected error conditions.
+	 * <p>
+	 * 	Possible values:
+	 * <ul>
+	 * 	<li><js>"EM_IGNORE"</js>
+	 * 	<li><js>"EM_WARNING"</js>
+	 * 	<li><js>"EM_ERROR"</js>
+	 * 	<li><js>"EM_FATAL"</js>
+	 * </ul>
+	 * <p>
+	 * 	See also:
+	 * <ul>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPErrorNumbers.html'>ARPErrorNumbers</a>
+	 * 	<li><a href='http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/arp/ARPOptions.html#setErrorMode(int,%20int)'>ARPOptions.setErrorMode(int, int)</a>
+	 * </ul>
+	 */
+	public static final String RDF_arp_err_ = "Rdf.jena.rdfXml.ERR_";
+
+	/**
+	 * RDF/XML ARP property: <code>WARN_xxx</code> ({@link String}).
+	 * <p>
+	 * 	See {@link #RDF_arp_err_} for details.
+	 */
+	public static final String RDF_arp_warn_ = "Rdf.jena.rdfXml.WARN_";
+
+	/**
+	 * RDF/XML ARP property: <code>IGN_xxx</code> ({@link String}).
+	 * <p>
+	 * 	See {@link #RDF_arp_err_} for details.
+	 */
+	public static final String RDF_arp_ign_ = "Rdf.jena.rdfXml.IGN_";
+
+	/**
+	 * RDF/XML property: <code>xmlbase</code> ({@link String}, default=<jk>null</jk>).
+	 * <p>
+	 * 	The value to be included for an <xa>xml:base</xa> attribute on the root element in the file.
+	 */
+	public static final String RDF_rdfxml_xmlBase = "Rdf.jena.rdfXml.xmlbase";
+
+	/**
+	 * RDF/XML property: <code>longId</code> ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 *  	Whether to use long ID's for anon resources.
+	 *  	Short ID's are easier to read, but can run out of memory on very large models.
+	 */
+	public static final String RDF_rdfxml_longId = "Rdf.jena.rdfXml.longId";
+
+	/**
+	 * RDF/XML property: <code>allowBadURIs</code> ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * 	URIs in the graph are, by default, checked prior to serialization.
+	 */
+	public static final String RDF_rdfxml_allowBadUris = "Rdf.jena.rdfXml.allowBadURIs";
+
+	/**
+	 * RDF/XML property: <code>relativeURIs</code> ({@link String}).
+	 * <p>
+	 * 	What sort of relative URIs should be used.
+	 * <p>
+	 * 	A comma separate list of options:
+	 * <ul>
+	 * 	<li><js>"same-document"</js> - Same-document references (e.g. <js>""</js> or <js>"#foo"</js>)
+	 * 	<li><js>"network"</js>  - Network paths (e.g. <js>"//example.org/foo"</js> omitting the URI scheme)
+	 * 	<li><js>"absolute"</js> - Absolute paths (e.g. <js>"/foo"</js> omitting the scheme and authority)
+	 * 	<li><js>"relative"</js> - Relative path not begining in <js>"../"</js>
+	 * 	<li><js>"parent"</js> - Relative path begining in <js>"../"</js>
+	 * 	<li><js>"grandparent"</js> - Relative path begining in <js>"../../"</js>
+	 * </ul>
+	 * <p>
+	 * 	The default value is <js>"same-document, absolute, relative, parent"</js>.
+	 * 	To switch off relative URIs use the value <js>""</js>.
+	 * 	Relative URIs of any of these types are output where possible if and only if the option has been specified.
+	 */
+	public static final String RDF_rdfxml_relativeUris = "Rdf.jena.rdfXml.relativeURIs";
+
+	/**
+	 * RDF/XML property: <code>showXmlDeclaration</code> ({@link String}, default=<js>"default"</js>).
+	 * <p>
+	 * 	Possible values:
+	 * <ul>
+	 * 	<li><js>"true"</js> - Add XML Declaration to the output.
+	 * 	<li><js>"false"</js> - Don't add XML Declaration to the output.
+	 * 	<li><js>"default"</js> - Only add an XML Declaration when asked to write to an <code>OutputStreamWriter</code> that uses some encoding other than <code>UTF-8</code> or <code>UTF-16</code>.
+	 * 		In this case the encoding is shown in the XML declaration.
+	 * </ul>
+	 */
+	public static final String RDF_rdfxml_showXmlDeclaration = "Rdf.jena.rdfXml.showXmlDeclaration";
+
+	/**
+	 * RDF/XML property: <code>showDoctypeDeclaration</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	If true, an XML Doctype declaration is included in the output.
+	 * 	This declaration includes a <code>!ENTITY</code> declaration for each prefix mapping in the model, and any attribute value that starts with the URI of that mapping is written as starting with the corresponding entity invocation.
+	 */
+	public static final String RDF_rdfxml_showDoctypeDeclaration = "Rdf.jena.rdfXml.showDoctypeDeclaration";
+
+	/**
+	 * RDF/XML property: <code>tab</code> ({@link Integer}, default=<code>2</code>).
+	 * <p>
+	 * 	The number of spaces with which to indent XML child elements.
+	 */
+	public static final String RDF_rdfxml_tab = "Rdf.jena.rdfXml.tab";
+
+	/**
+	 * RDF/XML property: <code>attributeQuoteChar</code> ({@link Character}, default=<js>'"'</js>).
+	 * <p>
+	 * 	The XML attribute quote character.
+	 */
+	public static final String RDF_rdfxml_attributeQuoteChar = "Rdf.jena.rdfXml.attributeQuoteChar";
+
+	/**
+	 * RDF/XML property: <code>blockRules</code> ({@link String}, default=<js>""</js>).
+	 * <p>
+	 * 	A list of <code>Resource</code> or a <code>String</code> being a comma separated list of fragment IDs from <a href='http://www.w3.org/TR/rdf-syntax-grammar'>RDF Syntax Grammar</a> indicating grammar rules that will not be used.
+	 */
+	public static final String RDF_rdfxml_blockRules = "Rdf.jena.rdfXml.blockRules";
+
+	/**
+	 * N3/Turtle property: <code>minGap</code> ({@link Integer}, default=<code>1</code>).
+	 * <p>
+	 * 	Minimum gap between items on a line.
+	 */
+	public static final String RDF_n3_minGap = "Rdf.jena.n3.minGap";
+
+	/**
+	 * N3/Turtle property: <code>objectLists</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	Print object lists as comma separated lists.
+	 */
+	public static final String RDF_n3_objectLists = "Rdf.jena.n3.objectLists";
+
+	/**
+	 * N3/Turtle property: <code>subjectColumn</code> ({@link Integer}, default=indentProperty).
+	 * <p>
+	 * 	If the subject is shorter than this value, the first property may go on the same line.
+	 */
+	public static final String RDF_n3_subjectColumn = "Rdf.jena.n3.subjectColumn";
+
+	/**
+	 * N3/Turtle property: <code>propertyColumn</code> ({@link Integer}, default=<code>8</code>).
+	 * <p>
+	 *  	Width of the property column.
+	 */
+	public static final String RDF_n3_propertyColumn = "Rdf.jena.n3.propertyColumn";
+
+	/**
+	 * N3/Turtle property: <code>indentProperty</code> ({@link Integer}, default=<code>6</code>).
+	 * <p>
+	 * 	Width to indent properties.
+	 */
+	public static final String RDF_n3_indentProperty = "Rdf.jena.n3.indentProperty";
+
+	/**
+	 * N3/Turtle property: <code>widePropertyLen</code> ({@link Integer}, default=<code>20</code>).
+	 * <p>
+	 * 	Width of the property column.
+	 * 	Must be longer than <code>propertyColumn</code>.
+	 */
+	public static final String RDF_n3_widePropertyLen = "Rdf.jena.n3.widePropertyLen";
+
+	/**
+	 * N3/Turtle property: <code>abbrevBaseURI</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	Control whether to use abbreviations <code>&lt;&gt;</code> or <code>&lt;#&gt;</code>.
+	 */
+	public static final String RDF_n3_abbrevBaseUri = "Rdf.jena.n3.abbrevBaseURI";
+
+	/**
+	 * N3/Turtle property: <code>usePropertySymbols</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	Control whether to use <code>a</code>, <code>=</code> and <code>=&gt;</code> in output
+	 */
+	public static final String RDF_n3_usePropertySymbols = "Rdf.jena.n3.usePropertySymbols";
+
+	/**
+	 * N3/Turtle property: <code>useTripleQuotedStrings</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	Allow the use of <code>"""</code> to delimit long strings.
+	 */
+	public static final String RDF_n3_useTripleQuotedStrings = "Rdf.jena.n3.useTripleQuotedStrings";
+
+	/**
+	 * N3/Turtle property: <code>useDoubles</code> ({@link Boolean}, default=<jk>true</jk>).
+	 * <p>
+	 * 	Allow the use doubles as <code>123.456</code>.
+	 */
+	public static final String RDF_n3_useDoubles = "Rdf.jena.n3.useDoubles";
+
+	/**
+	 * The RDF format for representing collections and arrays.  ({@link String}, default=<js>"DEFAULT"</js>).
+	 * <p>
+	 * 	Possible values:
+	 * 	<ul>
+	 * 		<li><js>"DEFAULT"</js> - Default format.  The default is an RDF Sequence container.
+	 * 		<li><js>"SEQ"</js> - RDF Sequence container.
+	 * 		<li><js>"BAG"</js> - RDF Bag container.
+	 * 		<li><js>"LIST"</js> - RDF List container.
+	 * 		<li><js>"MULTI_VALUED"</js> - Multi-valued properties.
+	 * 	</ul>
+	 *	</p>
+	 *	<p>
+	 *		Important Note:  If you use <js>"BAG"</js> or <js>"MULTI_VALUED"</js>, the order of the elements
+	 *		in the collection will get lost.
+	 */
+	public static final String RDF_collectionFormat = "Rdf.collectionFormat";
+	RdfCollectionFormat collectionFormat = RdfCollectionFormat.DEFAULT;
+
+	/**
+	 * Specifies that collections should be serialized and parsed as loose collections.  ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * When specified, collections of resources are handled as loose collections of resources in RDF instead of
+	 * resources that are children of an RDF collection (e.g. Sequence, Bag).
+	 * <p>
+	 * Note that this setting is specialized for RDF syntax, and is incompatible with the concept of
+	 * losslessly representing POJO models, since the tree structure of these POJO models are lost
+	 * when serialized as loose collections.
+	 *	<p>
+	 *	This setting is typically only useful if the beans being parsed into do not have a bean property
+	 *	annotated with {@link BeanProperty#beanUri @BeanProperty(beanUri=true)}.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	WriterSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev().setProperty(<jsf>RDF_looseCollection</jsf>, <jk>true</jk>);
+	 * 	ReaderParser p = <jk>new</jk> RdfParser.Xml().setProperty(<jsf>RDF_looseCollection</jsf>, <jk>true</jk>);
+	 *
+	 * 	List&lt;MyBean&gt; l = createListOfMyBeans();
+	 *
+	 * 	<jc>// Serialize to RDF/XML as loose resources</jc>
+	 * 	String rdfXml = s.serialize(l);
+	 *
+	 *		<jc>// Parse back into a Java collection</jc>
+	 * 	l = p.parseCollection(rdfXml, LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 *
+	 * 	MyBean[] b = createArrayOfMyBeans();
+	 *
+	 * 	<jc>// Serialize to RDF/XML as loose resources</jc>
+	 * 	String rdfXml = s.serialize(b);
+	 *
+	 *		<jc>// Parse back into a bean array</jc>
+	 * 	b = p.parse(rdfXml, MyBean[].<jk>class</jk>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 */
+	public static final String RDF_looseCollection = "Rdf.looseCollection";
+
+	String rdfLanguage = "RDF/XML-ABBREV";
+	Namespace junoNs = NamespaceFactory.get("j", "http://www.ibm.com/juno/");
+	Namespace junoBpNs = NamespaceFactory.get("jp", "http://www.ibm.com/junobp/");
+	boolean useXmlNamespaces = true, looseCollection = false;
+	Map<String,Object> jenaSettings = new HashMap<String,Object>();
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		if (property.equals(RDF_language))
+			rdfLanguage = value.toString();
+		else if (property.equals(RDF_junoNs))
+			junoNs = NamespaceFactory.parseNamespace(value);
+		else if (property.equals(RDF_junoBpNs))
+			junoBpNs = NamespaceFactory.parseNamespace(value);
+		else if (property.startsWith("Rdf.jena."))
+			jenaSettings.put(property.substring(9), value);
+		else if (property.equals(RDF_collectionFormat))
+			collectionFormat = RdfCollectionFormat.valueOf(value.toString());
+		else if (property.equals(RDF_useXmlNamespaces))
+			useXmlNamespaces = Boolean.valueOf(value.toString());
+		else if (property.equals(RDF_looseCollection))
+			looseCollection = Boolean.valueOf(value.toString());
+		else
+			return false;
+		return true;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$1.class
new file mode 100755
index 0000000..4ac3006
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$N3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$N3.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$N3.class
new file mode 100755
index 0000000..e90348b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$N3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$NTriple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$NTriple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$NTriple.class
new file mode 100755
index 0000000..0314bf4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$NTriple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Turtle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Turtle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Turtle.class
new file mode 100755
index 0000000..8bde941
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Turtle.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Xml.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Xml.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Xml.class
new file mode 100755
index 0000000..79dc12d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$Xml.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$XmlAbbrev.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$XmlAbbrev.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$XmlAbbrev.class
new file mode 100755
index 0000000..8c176f9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer$XmlAbbrev.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.class
new file mode 100755
index 0000000..2af16f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.java
new file mode 100755
index 0000000..4acb7cd
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializer.java
@@ -0,0 +1,466 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import static com.ibm.juno.core.jena.Constants.*;
+import static com.ibm.juno.core.jena.RdfProperties.*;
+import static com.ibm.juno.core.xml.XmlUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.hp.hpl.jena.rdf.model.*;
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Serializes POJOs to RDF.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	Refer to <a class='doclink' href='package-summary.html#SerializerConfigurableProperties'>Configurable Properties</a>
+ * 		for the entire list of configurable properties.
+ *
+ *
+ * <h6 class='topic'>Behavior-specific subclasses</h6>
+ * <p>
+ * 	The following direct subclasses are provided for language-specific serializers:
+ * <ul>
+ * 	<li>{@link RdfSerializer.Xml} - RDF/XML.
+ * 	<li>{@link RdfSerializer.XmlAbbrev} - RDF/XML-ABBREV.
+ * 	<li>{@link RdfSerializer.NTriple} - N-TRIPLE.
+ * 	<li>{@link RdfSerializer.Turtle} - TURTLE.
+ * 	<li>{@link RdfSerializer.N3} - N3.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Additional Information</h6>
+ * <p>
+ * 	See <a class='doclink' href='package-summary.html#TOC'>RDF Overview</a> for an overview of RDF support in Juno.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@Produces(value="text/xml+rdf+abbrev", contentType="text/xml+rdf")
+public class RdfSerializer extends WriterSerializer {
+
+	/** Default RDF/XML serializer, all default settings.*/
+	public static final RdfSerializer DEFAULT_XML = new RdfSerializer.Xml().lock();
+
+	/** Default Abbreviated RDF/XML serializer, all default settings.*/
+	public static final RdfSerializer DEFAULT_XMLABBREV = new RdfSerializer.XmlAbbrev().lock();
+
+	/** Default Turtle serializer, all default settings.*/
+	public static final RdfSerializer DEFAULT_TURTLE = new RdfSerializer.Turtle().lock();
+
+	/** Default N-Triple serializer, all default settings.*/
+	public static final RdfSerializer DEFAULT_NTRIPLE = new RdfSerializer.NTriple().lock();
+
+	/** Default N3 serializer, all default settings.*/
+	public static final RdfSerializer DEFAULT_N3 = new RdfSerializer.N3().lock();
+
+
+	/** Produces RDF/XML output */
+	@Produces("text/xml+rdf")
+	public static class Xml extends RdfSerializer {
+		/** Constructor */
+		public Xml() {
+			setProperty(RDF_language, LANG_RDF_XML);
+		}
+	}
+
+	/** Produces Abbreviated RDF/XML output */
+	@Produces(value="text/xml+rdf+abbrev", contentType="text/xml+rdf")
+	public static class XmlAbbrev extends RdfSerializer {
+		/** Constructor */
+		public XmlAbbrev() {
+			setProperty(RDF_language, LANG_RDF_XML_ABBREV);
+		}
+	}
+
+	/** Produces N-Triple output */
+	@Produces("text/n-triple")
+	public static class NTriple extends RdfSerializer {
+		/** Constructor */
+		public NTriple() {
+			setProperty(RDF_language, LANG_NTRIPLE);
+		}
+	}
+
+	/** Produces Turtle output */
+	@Produces("text/turtle")
+	public static class Turtle extends RdfSerializer {
+		/** Constructor */
+		public Turtle() {
+			setProperty(RDF_language, LANG_TURTLE);
+		}
+	}
+
+	/** Produces N3 output */
+	@Produces("text/n3")
+	public static class N3 extends RdfSerializer {
+		/** Constructor */
+		public N3() {
+			setProperty(RDF_language, LANG_N3);
+		}
+	}
+
+
+	/** Jena serializer properties currently set on this serializer. */
+	protected transient RdfSerializerProperties rsp = new RdfSerializerProperties();
+
+	/** Xml serializer properties currently set on this serializer. */
+	protected transient XmlSerializerProperties xsp = new XmlSerializerProperties();
+
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+
+		RdfSerializerContext rctx = (RdfSerializerContext)ctx;
+
+		Model model = rctx.model;
+		Resource r = null;
+
+		ClassMeta<?> cm = rctx.getBeanContext().getClassMetaForObject(o);
+		if (rctx.isLooseCollection() && cm != null && (cm.isCollection() || cm.isArray())) {
+			Collection c = sort(ctx, cm.isCollection() ? (Collection)o : toList(cm.getInnerClass(), o));
+			for (Object o2 : c)
+				serializeAnything(o2, false, object(), rctx, "root", null, null);
+		} else {
+		RDFNode n = serializeAnything(o, false, object(), rctx, "root", null, null);
+		if (n.isLiteral()) {
+			r = model.createResource();
+			r.addProperty(rctx.pValue, n);
+		} else {
+			r = n.asResource();
+		}
+
+		if (rctx.addRootProperty)
+			r.addProperty(rctx.pRoot, "true");
+		}
+
+		rctx.writer.write(model, out, "http://unknown/");
+	}
+
+	private RDFNode serializeAnything(Object o, boolean isURI, ClassMeta<?> eType, RdfSerializerContext ctx, String attrName, BeanPropertyMeta bpm, Resource parentResource) throws SerializeException {
+		Model m = ctx.model;
+		BeanContext bc = ctx.getBeanContext();
+
+		ClassMeta<?> aType = null;       // The actual type
+		ClassMeta<?> wType = null;       // The wrapped type
+		ClassMeta<?> gType = object();   // The generic type
+
+		aType = ctx.push(attrName, o, eType);
+
+		if (eType == null)
+			eType = object();
+
+		// Handle recursion
+		if (aType == null) {
+			o = null;
+			aType = object();
+		}
+
+		if (o != null) {
+
+			if (aType.isDelegate()) {
+				wType = aType;
+				aType = ((Delegate)o).getClassMeta();
+			}
+
+			gType = aType.getFilteredClassMeta();
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+		} else {
+			gType = eType.getFilteredClassMeta();
+		}
+
+		RDFNode n = null;
+
+		if (o == null || gType.isChar() && ((Character)o).charValue() == 0) {
+			if (bpm != null) {
+				if (! ctx.isTrimNulls()) {
+					n = m.createResource(RDF_NIL);
+				}
+			} else {
+				n = m.createResource(RDF_NIL);
+			}
+
+		} else if (gType.isUri() || isURI) {
+			n = m.createResource(getUri(o, null, ctx));
+
+		} else if (gType.isCharSequence() || gType.isChar()) {
+			n = m.createLiteral(encodeTextInvalidChars(o));
+
+		} else if (gType.isNumber() || gType.isBoolean()) {
+			if (! ctx.addLiteralTypes)
+				n = m.createLiteral(o.toString());
+			else
+				n = m.createTypedLiteral(o);
+
+		} else if (gType.isMap() || (wType != null && wType.isMap())) {
+			if (o instanceof BeanMap) {
+				BeanMap bm = (BeanMap)o;
+				String uri = getUri(bm.getBeanUri(), null, ctx);
+				n = m.createResource(uri);
+				serializeBeanMap(bm, (Resource)n, ctx);
+			} else {
+				Map m2 = (Map)o;
+				n = m.createResource();
+				serializeMap(m2, (Resource)n, gType, ctx);
+			}
+
+		} else if (gType.hasToObjectMapMethod()) {
+			Map m2 = gType.toObjectMap(o);
+			n = m.createResource();
+				serializeMap(m2, (Resource)n, gType, ctx);
+
+		} else if (gType.isBean()) {
+			BeanMap bm = bc.forBean(o);
+			String uri = getUri(bm.getBeanUri(), null, ctx);
+			n = m.createResource(uri);
+			serializeBeanMap(bm, (Resource)n, ctx);
+
+		} else if (gType.isCollection() || gType.isArray() || (wType != null && wType.isCollection())) {
+			Collection c = sort(ctx, gType.isCollection() ? (Collection)o : toList(gType.getInnerClass(), o));
+			RdfCollectionFormat f = ctx.getCollectionFormat();
+			if (gType.getRdfMeta().getCollectionFormat() != RdfCollectionFormat.DEFAULT)
+				f = gType.getRdfMeta().getCollectionFormat();
+			if (bpm != null && bpm.getRdfMeta().getCollectionFormat() != RdfCollectionFormat.DEFAULT)
+				f = bpm.getRdfMeta().getCollectionFormat();
+			switch (f) {
+				case BAG: n = serializeToContainer(c, gType, m.createBag(), ctx); break;
+				case LIST: n = serializeToList(c, gType, ctx); break;
+				case MULTI_VALUED: serializeToMultiProperties(c, gType, bpm, ctx, attrName, parentResource); break;
+				default: n = serializeToContainer(c, gType, m.createSeq(), ctx);
+			}
+		} else {
+			n = m.createLiteral(encodeTextInvalidChars(o));
+		}
+
+		if (ctx.isAddClassAttrs() && n != null && n.isResource()) {
+			if (o != null && ! eType.equals(aType))
+				n.asResource().addProperty(ctx.pClass, aType.toString());
+			else if (o == null)
+				n.asResource().addProperty(ctx.pClass, eType.toString());
+		}
+
+		ctx.pop();
+
+		return n;
+	}
+
+	private String getUri(Object uri, Object uri2, RdfSerializerContext ctx) {
+		String s = null;
+		if (uri != null)
+			s = uri.toString();
+		if ((s == null || s.isEmpty()) && uri2 != null)
+			s = uri2.toString();
+		if (s == null)
+			return null;
+		if (s.indexOf("://") == -1) {
+			String aUri = ctx.getAbsolutePathUriBase();
+			String rUri = ctx.getRelativeUriBase();
+			if (StringUtils.startsWith(s, '/')) {
+				if (aUri != null)
+					return aUri + s;
+			} else {
+				if (rUri != null) {
+					if (rUri.equals("/"))
+						return '/' + s;
+					return rUri + '/' + s;
+				}
+			}
+		}
+		return s;
+	}
+
+	private void serializeMap(Map m, Resource r, ClassMeta<?> type, RdfSerializerContext ctx) throws SerializeException {
+
+		m = sort(ctx, m);
+
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		ArrayList<Map.Entry<Object,Object>> l = new ArrayList<Map.Entry<Object,Object>>(m.entrySet());
+		Collections.reverse(l);
+		for (Map.Entry<Object,Object> me : l) {
+			Object value = me.getValue();
+
+			Object key = generalize(ctx, me.getKey(), keyType);
+
+			Namespace ns = ctx.junoBpNs;
+			Model model = ctx.model;
+			Property p = model.createProperty(ns.getUri(), encodeElementName(key));
+			RDFNode n = serializeAnything(value, false, valueType, ctx, key == null ? null : key.toString(), null, r);
+			if (n != null)
+				r.addProperty(p, n);
+		}
+	}
+
+	private void serializeBeanMap(BeanMap m, Resource r, RdfSerializerContext ctx) throws SerializeException {
+		ArrayList<BeanMapEntry> l = new ArrayList<BeanMapEntry>(m.entrySet());
+		Collections.reverse(l);
+		for (BeanMapEntry bme : l) {
+			BeanPropertyMeta pMeta = bme.getMeta();
+			ClassMeta<?> cm = pMeta.getClassMeta();
+
+			if (pMeta.isBeanUri())
+				continue;
+
+			String key = bme.getKey();
+			Object value = null;
+			try {
+				value = bme.getValue();
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+
+			if (canIgnoreValue(ctx, cm, key, value))
+				continue;
+
+			BeanPropertyMeta bpm = bme.getMeta();
+			Namespace ns = bpm.getRdfMeta().getNamespace();
+			if (ns == null && ctx.isUseXmlNamespaces())
+				ns = bpm.getXmlMeta().getNamespace();
+			if (ns == null)
+				ns = ctx.junoBpNs;
+			else if (ctx.isAutoDetectNamespaces())
+				ctx.addModelPrefix(ns);
+
+			Property p = ctx.model.createProperty(ns.getUri(), encodeElementName(key));
+			RDFNode n = serializeAnything(value, pMeta.isUri(), cm, ctx, key, pMeta, r);
+			if (n != null)
+				r.addProperty(p, n);
+		}
+	}
+
+
+	private Container serializeToContainer(Collection c, ClassMeta<?> type, Container list, RdfSerializerContext ctx) throws SerializeException {
+
+		ClassMeta<?> elementType = type.getElementType();
+		for (Object e : c) {
+			RDFNode n = serializeAnything(e, false, elementType, ctx, null, null, null);
+			list = list.add(n);
+		}
+		return list;
+	}
+
+	private RDFList serializeToList(Collection c, ClassMeta<?> type, RdfSerializerContext ctx) throws SerializeException {
+		ClassMeta<?> elementType = type.getElementType();
+		List<RDFNode> l = new ArrayList<RDFNode>(c.size());
+		for (Object e : c) {
+			l.add(serializeAnything(e, false, elementType, ctx, null, null, null));
+		}
+		return ctx.model.createList(l.iterator());
+	}
+
+	private void serializeToMultiProperties(Collection c, ClassMeta<?> gType, BeanPropertyMeta bpm, RdfSerializerContext ctx, String attrName, Resource parentResource) throws SerializeException {
+		ClassMeta<?> elementType = gType.getElementType();
+		for (Object e : c) {
+			Namespace ns = null;
+			if (bpm != null) {
+				ns = bpm.getRdfMeta().getNamespace();
+				if (ns == null && ctx.isUseXmlNamespaces())
+					ns = bpm.getXmlMeta().getNamespace();
+			}
+			if (ns == null)
+				ns = ctx.junoBpNs;
+			else if (ctx.isAutoDetectNamespaces())
+				ctx.addModelPrefix(ns);
+			RDFNode n2 = serializeAnything(e, false, elementType, ctx, null, null, null);
+			Property p = ctx.model.createProperty(ns.getUri(), encodeElementName(attrName));
+			parentResource.addProperty(p, n2);
+		}
+
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	public RdfSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new RdfSerializerContext(getBeanContext(), sp, xsp, rsp, properties, javaMethod);
+	}
+
+	@Override /* CoreApi */
+	public RdfSerializer setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! rsp.setProperty(property, value))
+			if (! xsp.setProperty(property, value))
+				super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> RdfSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public RdfSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public RdfSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public RdfSerializer clone() {
+		try {
+			RdfSerializer c = (RdfSerializer)super.clone();
+			c.rsp = rsp.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.class
new file mode 100755
index 0000000..6d3e9ae
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.java
new file mode 100755
index 0000000..82d95c5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerContext.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import static com.ibm.juno.core.jena.Constants.*;
+import static com.ibm.juno.core.jena.RdfProperties.*;
+import static com.ibm.juno.core.jena.RdfSerializerProperties.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.hp.hpl.jena.rdf.model.*;
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of {@link RdfSerializer}.
+ * <p>
+ * 	See {@link SerializerContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RdfSerializerContext extends XmlSerializerContext {
+
+	final String rdfLanguage;
+	final Namespace junoNs, junoBpNs;
+	final boolean addLiteralTypes, addRootProperty, useXmlNamespaces, looseCollection;
+	final Property pRoot, pValue, pClass;
+	final Model model;
+	final RDFWriter writer;
+	final RdfCollectionFormat collectionFormat;
+
+	/**
+	 * Constructor.
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp Default general serializer properties.
+	 * @param xsp Default XML serializer properties.
+	 * @param jsp Default Jena serializer properties.
+	 * @param op Override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	protected RdfSerializerContext(BeanContext beanContext, SerializerProperties sp, XmlSerializerProperties xsp, RdfSerializerProperties jsp, ObjectMap op, Method javaMethod) {
+		super(beanContext, sp, xsp, op, javaMethod);
+		ObjectMap jenaSettings = new ObjectMap();
+		jenaSettings.put("rdfXml.tab", isUseIndentation() ? 2 : 0);
+		jenaSettings.put("rdfXml.attributeQuoteChar", Character.toString(getQuoteChar()));
+		jenaSettings.putAll(jsp.jenaSettings);
+		if (op == null || op.isEmpty()) {
+			this.rdfLanguage = jsp.rdfLanguage;
+			this.junoNs = jsp.junoNs;
+			this.junoBpNs = jsp.junoBpNs;
+			this.addLiteralTypes = jsp.addLiteralTypes;
+			this.addRootProperty = jsp.addRootProperty;
+			this.collectionFormat = jsp.collectionFormat;
+			this.looseCollection = jsp.looseCollection;
+			this.useXmlNamespaces = jsp.useXmlNamespaces;
+		} else {
+			this.rdfLanguage = op.getString(RDF_language, jsp.rdfLanguage);
+			this.junoNs = (op.containsKey(RDF_junoNs) ? NamespaceFactory.parseNamespace(op.get(RDF_junoNs)) : jsp.junoNs);
+			this.junoBpNs = (op.containsKey(RDF_junoBpNs) ? NamespaceFactory.parseNamespace(op.get(RDF_junoBpNs)) : jsp.junoBpNs);
+			this.addLiteralTypes = op.getBoolean(RDF_addLiteralTypes, jsp.addLiteralTypes);
+			this.addRootProperty = op.getBoolean(RDF_addRootProperty, jsp.addRootProperty);
+			for (Map.Entry<String,Object> e : op.entrySet()) {
+				String key = e.getKey();
+				if (key.startsWith("Rdf.jena."))
+					jenaSettings.put(key.substring(9), e.getValue());
+			}
+			this.collectionFormat = RdfCollectionFormat.valueOf(op.getString(RDF_collectionFormat, "DEFAULT"));
+			this.looseCollection = op.getBoolean(RDF_looseCollection, jsp.looseCollection);
+			this.useXmlNamespaces = op.getBoolean(RDF_useXmlNamespaces, jsp.useXmlNamespaces);
+		}
+		this.model = ModelFactory.createDefaultModel();
+		addModelPrefix(junoNs);
+		addModelPrefix(junoBpNs);
+		for (Namespace ns : this.getNamespaces())
+			addModelPrefix(ns);
+		this.pRoot = model.createProperty(junoNs.getUri(), RDF_junoNs_ROOT);
+		this.pValue = model.createProperty(junoNs.getUri(), RDF_junoNs_VALUE);
+		this.pClass = model.createProperty(junoNs.getUri(), RDF_junoNs_CLASS);
+		writer = model.getWriter(rdfLanguage);
+
+		// Only apply properties with this prefix!
+		String propPrefix = RdfProperties.LANG_PROP_MAP.get(rdfLanguage);
+		if (propPrefix == null)
+			throw new RuntimeException("Unknown RDF language encountered: '"+rdfLanguage+"'");
+
+		for (Map.Entry<String,Object> e : jenaSettings.entrySet())
+			if (e.getKey().startsWith(propPrefix))
+				writer.setProperty(e.getKey().substring(propPrefix.length()), e.getValue());
+	}
+
+	/**
+	 * Adds the specified namespace as a model prefix.
+	 * @param ns The XML namespace.
+	 */
+	public void addModelPrefix(Namespace ns) {
+		model.setNsPrefix(ns.getName(), ns.getUri());
+	}
+
+	/**
+	 * Returns the format for serializing collections.
+	 *
+	 * @return The format for serializing collections.
+	 */
+	protected RdfCollectionFormat getCollectionFormat() {
+		return collectionFormat;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if RDF serializer should use XML serializer namespaces.
+	 *
+	 * @return <jk>true</jk> if RDF serializer should use XML serializer namespaces.
+	 */
+	protected boolean isUseXmlNamespaces() {
+		return useXmlNamespaces;
+	}
+
+	/**
+	 * Returns the {@link RdfProperties#RDF_looseCollection} property value.
+	 *
+	 * @return The {@link RdfProperties#RDF_looseCollection} property value.
+	 */
+	protected boolean isLooseCollection() {
+		return looseCollection;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.class
new file mode 100755
index 0000000..e5fb1bc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.java
new file mode 100755
index 0000000..fd5ffbc
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfSerializerProperties.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Configurable properties on the {@link RdfSerializer} class.
+ * <p>
+ * 	Use the {@link RdfSerializer#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link RdfSerializer}.
+ * <ul>
+ * 	<li>{@link RdfProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class RdfSerializerProperties extends RdfProperties implements Cloneable {
+
+	/**
+	 * Add XSI data types to non-<code>String</code> literals ({@link Boolean}, default=<jk>false</jk>).
+	 */
+	public static final String RDF_addLiteralTypes = "RdfSerializer.addLiteralTypes";
+
+	/**
+	 * Add RDF root identifier property to root node ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * 	When enabled an RDF property <code>http://www.ibm.com/juno/root</code> is added with a value of <js>"true"</js>
+	 * 		to identify the root node in the graph.
+	 * 	This helps locate the root node during parsing.
+	 * <p>
+	 * 	If disabled, the parser has to search through the model to find any resources without
+	 * 		incoming predicates to identify root notes, which can introduce a considerable performance
+	 * 		degradation.
+	 */
+	public static final String RDF_addRootProperty = "RdfSerializer.addRootProperty";
+
+	boolean addLiteralTypes = false, addRootProperty = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	@Override /* RdfProperties */
+	public boolean setProperty(String property, Object value) {
+		if (property.equals(RDF_addLiteralTypes))
+			addLiteralTypes = BeanContext.DEFAULT.convertToType(value, boolean.class);
+		else if (property.equals(RDF_addRootProperty))
+			addRootProperty = BeanContext.DEFAULT.convertToType(value, boolean.class);
+		else
+			return super.setProperty(property, value);
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public RdfSerializerProperties clone() {
+		try {
+			return (RdfSerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.class
new file mode 100755
index 0000000..c20f2c9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.java
new file mode 100755
index 0000000..2e34b81
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/RdfUtils.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+package com.ibm.juno.core.jena;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.jena.annotation.*;
+import com.ibm.juno.core.xml.*;
+
+/**
+ * Utility classes.
+ */
+public class RdfUtils {
+
+	/**
+	 * Find the namespace given a list of <ja>@Rdf</ja> and <ja>@RdfSchema</ja> annotations.
+	 * The annotations should be a child-to-parent ordering of annotations found on
+	 * 	a class or method.
+	 *
+	 * @param rdfs The <code>@Rdf</code> annotations to search.
+	 * @param schemas The list of known RDF schemas.
+	 * @return The resolved namespace, or <jk>null</jk> if the namespace could not be resolved.
+	 */
+	public static Namespace findNamespace(List<Rdf> rdfs, List<RdfSchema> schemas) {
+
+		for (Rdf rdf : rdfs) {
+			Namespace ns = findNamespace(rdf.prefix(), rdf.namespace(), rdfs, schemas);
+			if (ns != null)
+				return ns;
+		}
+
+		for (RdfSchema schema : schemas) {
+			Namespace ns = findNamespace(schema.prefix(), schema.namespace(), null, schemas);
+			if (ns != null)
+				return ns;
+		}
+
+		return null;
+	}
+
+	private static Namespace findNamespace(String prefix, String ns, List<Rdf> rdfs, List<RdfSchema> schemas) {
+
+		// If both prefix and namespace specified, use that Namespace mapping.
+		if (! (prefix.isEmpty() || ns.isEmpty()))
+			return NamespaceFactory.get(prefix, ns);
+
+		// If only prefix specified, need to search for namespaceURI.
+		if (! prefix.isEmpty()) {
+			if (rdfs != null)
+				for (Rdf rdf2 : rdfs)
+					if (rdf2.prefix().equals(prefix) && ! rdf2.namespace().isEmpty())
+						return NamespaceFactory.get(prefix, rdf2.namespace());
+			for (RdfSchema schema : schemas) {
+				if (schema.prefix().equals(prefix) && ! schema.namespace().isEmpty())
+					return NamespaceFactory.get(prefix, schema.namespace());
+				for (RdfNs rdfNs : schema.rdfNs())
+					if (rdfNs.prefix().equals(prefix))
+						return NamespaceFactory.get(prefix, rdfNs.namespaceURI());
+			}
+			throw new BeanRuntimeException("Found @Rdf.prefix annotation with no matching URI.  prefix='"+prefix+"'");
+		}
+
+		// If only namespaceURI specified, need to search for prefix.
+		if (! ns.isEmpty()) {
+			if (rdfs != null)
+				for (Rdf rdf2 : rdfs)
+					if (rdf2.namespace().equals(ns) && ! rdf2.prefix().isEmpty())
+						return NamespaceFactory.get(rdf2.prefix(), ns);
+			for (RdfSchema schema : schemas) {
+				if (schema.namespace().equals(ns) && ! schema.prefix().isEmpty())
+					return NamespaceFactory.get(schema.prefix(), ns);
+				for (RdfNs rdfNs : schema.rdfNs())
+					if (rdfNs.namespaceURI().equals(ns))
+						return NamespaceFactory.get(rdfNs.prefix(), ns);
+			}
+		}
+
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.class
new file mode 100755
index 0000000..afb35fb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/jena/annotation/Rdf.class differ


[50/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.classpath
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.classpath b/com.ibm.team.juno.client/.classpath
new file mode 100755
index 0000000..47a82cf
--- /dev/null
+++ b/com.ibm.team.juno.client/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="lib" path="/com.ibm.team.juno.releng/lib/httpclient/httpclient-4.5.jar"/>
+	<classpathentry kind="lib" path="/com.ibm.team.juno.releng/lib/httpclient/httpcore-4.4.1.jar"/>
+	<classpathentry kind="lib" path="/com.ibm.team.juno.releng/lib/httpclient/httpmime-4.5.jar"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.project
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.project b/com.ibm.team.juno.client/.project
new file mode 100755
index 0000000..a037b80
--- /dev/null
+++ b/com.ibm.team.juno.client/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.ibm.team.juno.client</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/com.ibm.etools.references.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/com.ibm.etools.references.prefs b/com.ibm.team.juno.client/.settings/com.ibm.etools.references.prefs
new file mode 100755
index 0000000..60e92fc
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/com.ibm.etools.references.prefs
@@ -0,0 +1,4 @@
+#Fri Sep 28 14:37:35 EDT 2012
+com.ibm.etools.references.ui.validation.projectPropertiesEnabled=true
+eclipse.preferences.version=1
+com.ibm.etools.references.ui.validation.severityLevel=0

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/com.ibm.etools.webtools.packagepreferences.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/com.ibm.etools.webtools.packagepreferences.prefs b/com.ibm.team.juno.client/.settings/com.ibm.etools.webtools.packagepreferences.prefs
new file mode 100755
index 0000000..fea8f8b
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/com.ibm.etools.webtools.packagepreferences.prefs
@@ -0,0 +1,3 @@
+#Fri Jan 24 16:55:50 EST 2014
+use-project-settings=false
+eclipse.preferences.version=1

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.core.resources.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.core.resources.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.core.resources.prefs
new file mode 100755
index 0000000..4824b80
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.jdt.apt.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.jdt.apt.core.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100755
index 0000000..ec0c557
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.jdt.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.jdt.core.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..8cb714e
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,401 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=200
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=1
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=3
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=200
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=3
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.jdt.ui.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.jdt.ui.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.ui.prefs
new file mode 100755
index 0000000..ced2c41
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,120 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=false
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=true
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_Juno
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Juno
+formatter_settings_version=12
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * Bean property getter\:  &lt;property&gt;${bare_field_name}&lt;/property&gt;.\r\n *\r\n * @return The value of the &lt;property&gt;${bare_field_name}&lt;/property&gt; property on this bean, or &lt;jk&gt;null&lt;/jk&gt; if it is not set.\r\n */</template><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * Bean property setter\:  &lt;property&gt;${bare_field_name}&lt;/property&gt;.\r\n *\r\n * @param ${param} The new value for the &lt;property&gt;${bare_field_name}&lt;/property&gt; property on th
 is bean.\r\n * @return This object (for method chaining).\r\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * TODO\r\n * \r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * TODO\r\n * &lt;p&gt;\r\n * \r\n * @author James Bognar (jbognar@us.ibm.com)\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context
 " deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * TODO\r\n * \r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * TODO\r\n * \r\n * $
 {tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbo
 dy">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.
 jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.update_ibm_copyright_to_current_year=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.ltk.core.refactoring.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.ltk.core.refactoring.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100755
index 0000000..4823f83
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Tue Feb 03 13:34:43 EST 2009
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.pde.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.pde.core.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.pde.core.prefs
new file mode 100755
index 0000000..ecf8088
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jan 05 14:46:11 EST 2009
+eclipse.preferences.version=1
+resolve.requirebundle=false

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.pde.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.pde.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.pde.prefs
new file mode 100755
index 0000000..a9e32da
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,15 @@
+#Thu Feb 05 14:13:09 EST 2009
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.missing-packages=2
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=0
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.component
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.component b/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.component
new file mode 100755
index 0000000..1cbcd7b
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="com.ibm.team.juno.client">
+        <wb-resource deploy-path="/" source-path="/src"/>
+    </wb-module>
+</project-modules>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.project.facet.core.xml
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.project.facet.core.xml b/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100755
index 0000000..3e8b624
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<faceted-project>
+  <fixed facet="jst.java"/>
+  <fixed facet="jst.utility"/>
+  <installed facet="jst.utility" version="1.0"/>
+  <installed facet="jst.java" version="1.6"/>
+</faceted-project>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.wst.html.core.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.wst.html.core.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.wst.html.core.prefs
new file mode 100755
index 0000000..00c4f29
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.wst.html.core.prefs
@@ -0,0 +1,37 @@
+#Wed Sep 26 17:17:38 EDT 2012
+elemUnnecessaryEnd=2
+elemCoexistence=2
+attrUndefValue=2
+attrUndefName=2
+piInvalidContent=2
+elemMissingStart=2
+elemInvalidEmptyTag=2
+docDuplicateTag=1
+docInvalidChar=2
+piUndefined=2
+docInvalidContent=2
+elemStartInvalidCase=2
+commentInvalidContent=2
+use-project-settings=true
+attrInvalidName=2
+elemUnclosedStartTag=1
+attrNameMismatch=2
+elemInvalidContent=2
+elemDuplicate=2
+cdataInvalidContent=2
+piUnclosed=1
+commentUnclosed=1
+attrDuplicate=2
+docDoctypeUnclosed=1
+eclipse.preferences.version=1
+attrInvalidValue=2
+cdataUnclosed=1
+refInvalidContent=2
+attrValueUnclosed=2
+elemEndInvalidCase=1
+elemMissingEnd=2
+attrValueMismatch=1
+elemInvalidName=1
+elemInvalidDirective=1
+elemUnknownName=-1
+elemUnclosedEndTag=1

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/.settings/org.eclipse.wst.validation.prefs
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/.settings/org.eclipse.wst.validation.prefs b/com.ibm.team.juno.client/.settings/org.eclipse.wst.validation.prefs
new file mode 100755
index 0000000..1d71887
--- /dev/null
+++ b/com.ibm.team.juno.client/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,9 @@
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorList
+USER_MANUAL_PREFERENCE=enabledManualValidatorList
+USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.402.v201212031633
+eclipse.preferences.version=1
+override=true
+suspend=false
+vals/org.eclipse.wst.html.core.HTMLValidator/global=TF01
+vf.version=3

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/META-INF/MANIFEST.MF b/com.ibm.team.juno.client/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..a13e895
--- /dev/null
+++ b/com.ibm.team.juno.client/META-INF/MANIFEST.MF
@@ -0,0 +1,37 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Juno Cloud API - Client
+Bundle-SymbolicName: com.ibm.team.juno.client
+Bundle-Version: 5.2.1000.qualifier
+Bundle-Vendor: IBM
+Require-Bundle: 
+ com.ibm.team.juno
+Import-Package: 
+ org.apache.http,
+ org.apache.http.auth,
+ org.apache.http.client,
+ org.apache.http.client.config,
+ org.apache.http.client.entity,
+ org.apache.http.client.methods,
+ org.apache.http.client.params,
+ org.apache.http.client.utils,
+ org.apache.http.config,
+ org.apache.http.conn,
+ org.apache.http.conn.routing,
+ org.apache.http.conn.scheme,
+ org.apache.http.conn.socket,
+ org.apache.http.conn.ssl,
+ org.apache.http.conn.util,
+ org.apache.http.cookie,
+ org.apache.http.entity,
+ org.apache.http.impl.client,
+ org.apache.http.impl.conn,
+ org.apache.http.impl.cookie,
+ org.apache.http.message,
+ org.apache.http.params,
+ org.apache.http.protocol,
+ org.apache.http.util
+Export-Package: 
+ com.ibm.juno.client,
+ com.ibm.juno.client.jazz
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/OSGI-INF/l10n/plugin.properties
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/OSGI-INF/l10n/plugin.properties b/com.ibm.team.juno.client/OSGI-INF/l10n/plugin.properties
new file mode 100755
index 0000000..ffdfad1
--- /dev/null
+++ b/com.ibm.team.juno.client/OSGI-INF/l10n/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+#Licensed Materials - Property of IBM
+#(c) Copyright IBM Corporation 2014. All Rights Reserved.
+#
+#Note to U.S. Government Users Restricted Rights:  
+#Use, duplication or disclosure restricted by GSA ADP Schedule 
+#Contract with IBM Corp. 
+###############################################################################
+# NLS_ENCODING=UTF-8
+# NLS_MESSAGEFORMAT_VAR
+
+# META-INF/MANIFEST.MF
+bundle.name = Juno Cloud API - REST client component
+bundle.vendor = IBM

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/AllowAllRedirects.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/AllowAllRedirects.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/AllowAllRedirects.class
new file mode 100644
index 0000000..b656df4
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/AllowAllRedirects.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/DateHeader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/DateHeader.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/DateHeader.class
new file mode 100644
index 0000000..1912e6a
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/DateHeader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/HttpMethod.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/HttpMethod.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/HttpMethod.class
new file mode 100644
index 0000000..7143804
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/HttpMethod.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/NameValuePairs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/NameValuePairs.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/NameValuePairs.class
new file mode 100644
index 0000000..cd7bbfc
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/NameValuePairs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/ResponsePattern.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/ResponsePattern.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/ResponsePattern.class
new file mode 100644
index 0000000..7d0c974
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/ResponsePattern.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$1.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$1.class
new file mode 100644
index 0000000..a3ebe89
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$2.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$2.class
new file mode 100644
index 0000000..cb8a11f
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$3.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$3.class
new file mode 100644
index 0000000..6780731
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall.class
new file mode 100644
index 0000000..04fbcc8
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCall.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallException.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallException.class
new file mode 100644
index 0000000..0e50295
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallInterceptor.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallInterceptor.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallInterceptor.class
new file mode 100644
index 0000000..4fa44a6
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallInterceptor.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallLogger.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallLogger.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallLogger.class
new file mode 100644
index 0000000..595b9e0
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestCallLogger.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$1.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$1.class
new file mode 100644
index 0000000..fb7c203
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$2.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$2.class
new file mode 100644
index 0000000..b3979e3
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$3.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$3.class
new file mode 100644
index 0000000..c90175e
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient.class
new file mode 100644
index 0000000..bac2450
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestClient.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestRequestEntity.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestRequestEntity.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestRequestEntity.class
new file mode 100644
index 0000000..02aeb23
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RestRequestEntity.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn$1.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn$1.class
new file mode 100644
index 0000000..ec43d14
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn.class
new file mode 100644
index 0000000..9b2daca
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/RetryOn.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$CertValidate.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$CertValidate.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$CertValidate.class
new file mode 100644
index 0000000..e92f288
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$CertValidate.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$HostVerify.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$HostVerify.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$HostVerify.class
new file mode 100644
index 0000000..6914fd5
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts$HostVerify.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts.class
new file mode 100644
index 0000000..b7c1b3c
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SSLOpts.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/SerializedNameValuePair.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/SerializedNameValuePair.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SerializedNameValuePair.class
new file mode 100644
index 0000000..c3d0cfc
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SerializedNameValuePair.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/SimpleX509TrustManager.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/SimpleX509TrustManager.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SimpleX509TrustManager.class
new file mode 100644
index 0000000..89aadde
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/SimpleX509TrustManager.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/CertificateStore.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/CertificateStore.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/CertificateStore.class
new file mode 100644
index 0000000..bcd4fbc
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/CertificateStore.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class
new file mode 100644
index 0000000..033a284
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator$Trust.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator.class
new file mode 100644
index 0000000..fb9bf78
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ICertificateValidator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ITrustStoreProvider.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ITrustStoreProvider.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ITrustStoreProvider.class
new file mode 100644
index 0000000..4ac7d83
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ITrustStoreProvider.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/LenientCertificateValidator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/LenientCertificateValidator.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/LenientCertificateValidator.class
new file mode 100644
index 0000000..4ff59aa
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/LenientCertificateValidator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class
new file mode 100644
index 0000000..b44f35c
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/SharedTrustStoreProvider.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class
new file mode 100644
index 0000000..1d7aca6
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/deprecated/ValidatingX509TrustManager.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/JazzRestClient.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/JazzRestClient.class b/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/JazzRestClient.class
new file mode 100644
index 0000000..61d8191
Binary files /dev/null and b/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/JazzRestClient.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/package.html b/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/package.html
new file mode 100755
index 0000000..fce9248
--- /dev/null
+++ b/com.ibm.team.juno.client/bin/com/ibm/juno/client/jazz/package.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Jazz REST client API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#RestClient'>Jazz REST client API</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="RestClient"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Jazz REST client API</h2>
+<div class='topic'>
+	<p>
+		Juno provides a default REST client implementation for working with Jazz servers. 
+		The client automatically detects and handles BASIC and FORM authentication and basic certificate authentication.
+	</p>
+	<p>
+		The following code shows the Jazz REST client being used for querying and creating server messages on 
+			a Jazz server.  The <code>ServerMessage</code> and <code>CreateServerMessage</code> classes
+			are nothing more than simple beans that get serialized over the connection and reconstituted on 
+			the server.
+	</p>
+	<p class='bcode'>
+	System.<jsf>out</jsf>.println(<js>"Adding sample messages"</js>);
+
+	DateFormat df = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
+	String url = <js>"https://localhost:9443/jazz"</js>;
+	String sms = url + <js>"/serverMessages"</js>;
+	CreateServerMessage m;
+	ServerMessage m2;
+	String s1;
+	ServerMessage[] messages;
+	
+	<jc>// Serializer for debug messages.</jc>
+	WriterSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Create clients to handle JSON and XML requests and responses.</jc>
+	RestClient jsonClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>)
+		.setSerializer(JsonSerializer.<jk>class</jk>)
+		.setParser(<jk>new</jk> JsonParser().addFilters(DateFilter.<jsf>ISO8601DTZ</jsf>.<jk>class</jk>));
+	
+	RestClient xmlClient = <jk>new</jk> JazzRestClient(url, <js>"ADMIN"</js>, <js>"ADMIN"</js>, XmlSerializer.<jk>class</jk>, XmlParser.<jk>class</jk>);
+	
+	<jc>// Delete any existing messages.</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	
+	<jk>for</jk> (ServerMessage message : messages) {
+		<jk>int</jk> rc = jsonClient
+			.doDelete(message.getUri())
+			.execute();
+		System.<jsf>out</jsf>.println(rc);	<jc>// Prints 200.</jc>
+	}
+	
+	<jc>// Create an active server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #1"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+	
+	<jc>// POST the message, get response as string.</jc>
+	s1 = jsonClient
+		.doPost(sms, m)
+		.getResponseAsString(); 
+	System.<jsf>out</jsf>.println(<js>"TEST1: response="</js> + s1);
+
+	<jc>// POST another message, get response as ServerMessage</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #2"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2012-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>));
+
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST2: response="</js> + serializer.serialize(m2));
+	
+	<jc>// Create a future server message.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3"</js>,
+		<js>"subTypeFoo"</js>,
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	m2 = jsonClient
+		.doPost(sms, m)
+		.getResponse(ServerMessage.<jk>class</jk>); 
+	System.<jsf>out</jsf>.println(<js>"TEST3: response="</js> + serializer.serialize(m2));
+	System.<jsf>out</jsf>.println(<js>"TEST3: id="</js> + m2.getItemId().getUuidValue());
+
+	<jc>// Create a future server message using XML on both request and response.</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #4"</js>,
+		<js>"subTypeFoo"</js>,                                  
+		df.parse(<js>"2013-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2014-01-01T12:34:56EST"</js>));
+	
+	s1 = xmlClient
+		.doPost(sms, m)
+		.getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST4: response="</js> + s1);
+
+	<jc>// Get all the messages</jc>
+	messages = jsonClient
+		.doGet(sms)
+		.getResponse(ServerMessage[].<jk>class</jk>);
+	System.<jsf>out</jsf>.println(<js>"TEST5: response="</js> + serializer.serialize(messages)); 
+
+	<jc>// Get the first ID</jc>
+	URI firstMessageUrl = messages[0].getUri();
+	
+	System.<jsf>out</jsf>.println(<js>"firstMessageUrl=["</js>+firstMessageUrl+<js>"]"</js>);
+	
+	<jc>// Get the Date of the first ID.</jc>
+	Date startDate = jsonClient
+		.doGet(firstMessageUrl + <js>"/startDate"</js>)
+		.getResponse(Date.<jk>class</jk>);  
+	System.<jsf>out</jsf>.println(<js>"TEST5: response.startDate="</js>+startDate);
+	
+	<jc>// Change the start and end dates on first message</jc>
+	m = <jk>new</jk> CreateServerMessage(
+		<jsf>INFO</jsf>,
+		<js>"Test message #3 overwritten"</js>,
+		<js>"subTypeFooBar"</js>,
+		df.parse(<js>"2023-01-01T12:34:56EST"</js>),
+		df.parse(<js>"2024-01-01T12:34:56EST"</js>));
+	s1 = jsonClient.doPut(firstMessageUrl, m).getResponseAsString();
+	System.<jsf>out</jsf>.println(<js>"TEST6: response="</js>+s1);
+	</p>
+</div>
+</body>
+</html>
\ No newline at end of file


[44/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
new file mode 100755
index 0000000..980f88c
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.microservice;
+
+import java.io.File;
+import java.util.*;
+import java.util.logging.*;
+
+import javax.servlet.Servlet;
+
+import org.eclipse.jetty.security.ConstraintMapping;
+import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.security.SecurityHandler;
+import org.eclipse.jetty.security.authentication.BasicAuthenticator;
+import org.eclipse.jetty.server.*;
+import org.eclipse.jetty.server.ssl.SslSocketConnector;
+import org.eclipse.jetty.servlet.*;
+import org.eclipse.jetty.util.security.Constraint;
+import org.eclipse.jetty.util.security.Credential;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+import com.ibm.juno.core.ObjectMap;
+import com.ibm.juno.core.ini.ConfigFile;
+import com.ibm.juno.core.json.JsonSerializer;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.microservice.resources.LogEntryFormatter;
+import com.ibm.juno.server.annotation.RestResource;
+
+
+/**
+ * Entry point for Juno microservice that implements a REST interface using Jetty on a single port.
+ * 
+ * <h6 class='topic'>Jetty Server Details</h6>
+ * <p>
+ * The Jetty server is created by the {@link #createServer()} method and started with the {@link #startServer()} method.
+ * These methods can be overridden to provided customized behavior.
+ * <p>
+ * 
+ * <h6 class='topic'>Defining REST Resources</h6>
+ * <p>
+ * Top-level REST resources are defined by the {@link #getResourceMap()} method.
+ * This method can be overridden to provide a customized list of REST resources.
+ * <p>
+ * 
+ * <h6 class='topic'>Logging</h6>
+ * <p>
+ * Logging is initialized by the {@link #initLogging()} method.
+ * This method can be overridden to provide customized logging behavior.
+ *
+ * <h6 class='topic'>Lifecycle Listener Methods</h6>
+ * Subclasses can optionally implement the following event listener methods:
+ * <ul>
+ * 	<li>{@link #onStart()} - Gets executed before {@link #start()}.
+ * 	<li>{@link #onStop()} - Gets executed before {@link #stop()}.
+ * 	<li>{@link #onCreateServer()} - Gets executed before {@link #createServer()}.
+ * 	<li>{@link #onStartServer()} - Gets executed before {@link #startServer()}.
+ * 	<li>{@link #onPostStartServer()} - Gets executed after {@link #startServer()}.
+ * 	<li>{@link #onStopServer()} - Gets executed before {@link #stop()}.
+ * 	<li>{@link #onPostStopServer()} - Gets executed after {@link #stop()}.
+ * </ul>
+ *
+ * @author jbognar@us.ibm.com
+ */
+public class RestMicroservice extends Microservice {
+
+	Server server;
+	int port;
+	Logger logger;
+
+	/**
+	 * Main method.
+	 * Subclasses must also implement this method!
+	 * 
+	 * @param args Command line arguments.
+	 * @throws Exception 
+	 */
+	public static void main(String[] args) throws Exception {
+		new RestMicroservice(args).start();
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param args The command line arguments.
+	 * @throws Exception 
+	 */
+	public RestMicroservice(String[] args) throws Exception {
+		super(args);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Methods implemented on Microservice API
+	//--------------------------------------------------------------------------------
+
+	@Override /* Microservice */
+	protected void start() throws Exception {
+		super.start();
+		initLogging();
+		createServer();
+		startServer();
+	}
+
+	@Override /* Microservice */
+	public void stop() {
+		Thread t = new Thread() {
+			@Override /* Thread */
+			public void run() {
+				try {
+					onStopServer();
+					logger.warning("Stopping server.");
+					System.out.println();
+					server.stop();
+					logger.warning("Server stopped.");
+					onPostStopServer();
+				} catch (Exception e) {
+					logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
+				}
+			}
+		};
+		t.start();
+		try {
+			t.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		super.stop();
+	}
+
+	//--------------------------------------------------------------------------------
+	// RestMicroservice API methods.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Initialize the logging for this microservice.
+	 * <p>
+	 * Subclasses can override this method to provide customized logging.
+	 * <p>
+	 * The default implementation uses the <cs>Logging</cs> section in the config file to set up logging:
+	 * <p class='bcode'>
+	 * 	<cc>#================================================================================
+	 * 	# Logger settings
+	 * 	# See FileHandler Java class for details.
+	 * 	#================================================================================</cc>
+	 * 	<cs>[Logging]</cs>
+	 * 	
+	 * 	<cc># The directory where to create the log file.
+	 * 	# Default is ".".</cc>
+	 * 	<ck>logDir</ck> = logs
+	 * 	
+	 * 	<cc># The name of the log file to create for the main logger.
+	 * 	# The logDir and logFile make up the pattern that's passed to the FileHandler
+	 * 	# constructor.
+	 * 	# If value is not specified, then logging to a file will not be set up.</cc>
+	 * 	<ck>logFile</ck> = microservice.%g.log
+	 * 	
+	 * 	<cc># Whether to append to the existing log file or create a new one.
+	 * 	# Default is false.</cc>
+	 * 	<ck>append</ck> =
+	 * 	
+	 * 	<cc># The SimpleDateFormat format to use for dates.
+	 * 	# Default is "yyyy.MM.dd hh:mm:ss".</cc>
+	 * 	<ck>dateFormat</ck> = 
+	 * 	
+	 * 	<cc># The log message format.
+	 * 	# The value can contain any of the following variables:
+	 * 	# 	{date} - The date, formatted per dateFormat.
+	 * 	#	{class} - The class name.
+	 * 	#	{method} - The method name.
+	 * 	#	{logger} - The logger name.
+	 * 	#	{level} - The log level name.
+	 * 	#	{msg} - The log message.
+	 * 	#	{threadid} - The thread ID.
+	 * 	#	{exception} - The localized exception message.
+	 * 	# Default is "[{date} {level}] {msg}%n".</cc>
+	 * 	<ck>format</ck> = 
+	 * 	
+	 * 	<cc># The maximum log file size.
+	 * 	# Suffixes available for numbers.
+	 * 	# See ConfigFile.getInt(String,int) for details.
+	 * 	# Default is 1M.</cc>
+	 * 	<ck>limit</ck> = 10M
+	 * 	
+	 * 	<cc># Max number of log files.
+	 * 	# Default is 1.</cc>
+	 * 	<ck>count</ck> = 5
+	 * 
+	 * 	<cc># Default log levels.
+	 * 	# Keys are logger names.
+	 * 	# Values are serialized Level POJOs.</cc>
+	 * 	<ck>levels</ck> = { com.ibm.juno:'INFO' }
+	 * 	
+	 * 	<cc># Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
+	 * 	# Useful for preventing log files from filling up with duplicate stack traces.
+	 * 	# Default is false.</cc>
+	 * 	<ck>useStackTraceHashes</ck> = true
+	 * 	
+	 * 	<cc># The default level for the console logger.
+	 * 	# Default is WARNING.</cc>
+	 * 	<ck>consoleLevel</ck> = WARNING
+	 * </p>
+	 * 
+	 * @throws Exception 
+	 */
+	protected void initLogging() throws Exception {
+		ConfigFile cf = getConfig();
+		logger = Logger.getLogger("");
+		String logFile = cf.getString("Logging/logFile");
+		if (! StringUtils.isEmpty(logFile)) {
+			LogManager.getLogManager().reset();
+			String logDir = cf.getString("Logging/logDir", ".");
+			FileUtils.mkdirs(new File(logDir), false);
+			boolean append = cf.getBoolean("Logging/append");
+			int limit = cf.getInt("Logging/limit", 1024*1024);
+			int count = cf.getInt("Logging/count", 1);
+			FileHandler fh = new FileHandler(logDir + '/' + logFile, limit, count, append);
+
+			boolean useStackTraceHashes = cf.getBoolean("Logging/useStackTraceHashes");
+			String format = cf.getString("Logging/format", "[{date} {level}] {msg}%n");
+			String dateFormat = cf.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss");
+			fh.setFormatter(new LogEntryFormatter(format, dateFormat, useStackTraceHashes));
+			logger.addHandler(fh);
+
+			ConsoleHandler ch = new ConsoleHandler();
+			ch.setLevel(Level.parse(cf.getString("Logging/consoleLevel", "WARNING")));
+			ch.setFormatter(new LogEntryFormatter(format, dateFormat, false));
+			logger.addHandler(ch);
+		}
+		ObjectMap loggerLevels = cf.getObject(ObjectMap.class, "Logging/levels");
+		if (loggerLevels != null)
+		for (String l : loggerLevels.keySet())
+			Logger.getLogger(l).setLevel(loggerLevels.get(Level.class, l));
+	}
+
+	/**
+	 * Method used to create (but not start) an instance of a Jetty server.
+	 * <p>
+	 * Subclasses can override this method to customize the Jetty server before it is started.
+	 * <p>
+	 * The default implementation is configured by the following values in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<cc>#================================================================================
+	 * 	# REST settings
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># The HTTP port number to use.
+	 * 	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	 * 	<ck>port</ck> = 10000
+	 * 	
+	 * 	<cc># The context root of the Jetty server.
+	 * 	# Default is Rest-ContextPath in manifest file, or "/".</cc>
+	 * 	<ck>contextPath</ck> = 10000
+	 * 
+	 * 	<cc># Authentication:  NONE, BASIC.
+	 * 	# Default is Rest-AuthType in manifest file, or NONE.</cc>
+	 * 	<ck>authType</ck> = NONE
+	 * 
+	 * 	<cc># The BASIC auth username.
+	 * 	# Default is Rest-LoginUser in manifest file.</cc>
+	 * 	<ck>loginUser</ck> = 
+	 * 	
+	 * 	<cc># The BASIC auth password.
+	 * 	# Default is Rest-LoginPassword in manifest file.</cc>
+	 * 	<ck>loginPassword</ck> = 
+	 * 	
+	 * 	<cc># The BASIC auth realm.
+	 * 	# Default is Rest-AuthRealm in manifest file.</cc>
+	 * 	<ck>authRealm</ck> = 
+	 * 	
+	 * 	<cc># Enable SSL support.</cc>
+	 * 	<ck>useSsl</ck> = false
+	 * 
+	 * 	<cc>#================================================================================
+	 * 	# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
+	 * 	#--------------------------------------------------------------------------------
+	 * 	# Ignored if REST/useSsl is false.
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST-SslContextFactory]</cs>
+	 * 	<ck>keyStorePath</ck> = client_keystore.jks
+	 * 	<ck>keyStorePassword*</ck> = {HRAaRQoT}
+	 * 	<ck>excludeCipherSuites</ck> = TLS_DHE.*, TLS_EDH.*
+	 * 	<ck>excludeProtocols</ck> = SSLv3
+	 * 	<ck>allowRenegotiate</ck> = false
+	 * </p>
+	 * 
+	 * @return The newly-created server. 
+	 * @throws Exception 
+	 */
+	protected Server createServer() throws Exception {
+		onCreateServer();
+
+		ConfigFile cf = getConfig();
+		ObjectMap mf = getManifest();
+		
+		port = cf.getInt("REST/port", mf.getInt("Rest-Port", 8000));
+		String contextPath = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
+
+		if (cf.getBoolean("REST/useSsl")) {
+
+			SslContextFactory sslContextFactory = new SslContextFactory();
+
+			// Write the properties in REST-SslContextFactory to the bean setters on sslContextFactory.
+			// Throws an exception if section contains unknown properties.
+			// Only look for bean properties of type String/String/boolean/int since class has multiple
+			// 	setters with the same name (e.g. setKeyStore(KeyStore) and setKeyStore(String)).
+			ObjectMap m = cf.writeProperties("REST-SslContextFactory", sslContextFactory, false, String.class, String[].class, boolean.class, int.class);
+
+			// We're using Jetty 8 that doesn't allow regular expression matching in SslContextFactory.setExcludeCipherSuites(), 
+			// so to prevent having the config file list all old cipher suites, exclude the known bad ones.
+			String[] excludeCipherSuites = ArrayUtils.combine(
+				StringUtils.split("SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA", ','),
+				sslContextFactory.getExcludeCipherSuites()
+			);
+			sslContextFactory.setExcludeCipherSuites(excludeCipherSuites);
+			
+			logger.log(Level.WARNING, "SSL properties set: {0}", JsonSerializer.DEFAULT_LAX.toString(m));
+
+			SslSocketConnector connector = new SslSocketConnector(sslContextFactory);
+			connector.setPort(port);
+
+			server = new Server();
+			server.setConnectors(new Connector[] { connector });
+
+		} else {
+			server = new Server(port);
+		}
+
+		ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+
+		String authType = cf.getString("REST/authType", mf.getString("Rest-AuthType", "NONE"));
+		if (authType.equals("BASIC"))
+			context.setSecurityHandler(basicAuth(cf, mf));
+
+		context.setContextPath(contextPath);
+		server.setHandler(context);
+
+		for (Map.Entry<String,Class<? extends Servlet>> e : getResourceMap().entrySet())
+			context.addServlet(e.getValue(), e.getKey()).setInitOrder(0);
+
+		return server;
+	}
+
+	/**
+	 * Method used to start the Jetty server created by {@link #createServer()}.
+	 * <p>
+	 * Subclasses can override this method to customize server startup.
+	 * 
+	 * @throws Exception 
+	 */
+	protected void startServer() throws Exception {
+		onStartServer();
+		server.start();
+		logger.warning("Server started on port " + port);
+		onPostStartServer();
+		server.join();
+	}
+
+	/**
+	 * Returns the resource map to use for this microservice.
+	 * <p>
+	 * <p>
+	 * Subclasses can override this method to programmatically specify their resources.
+	 * <p>
+	 * The default implementation is configured by the following values in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 
+	 * 	<cc>#================================================================================
+	 * 	# REST settings
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># A JSON map of servlet paths to servlet classes.
+	 * 	# Example:  
+	 * 	# 	resourceMap = {'/*':'com.ibm.MyServlet'}
+	 * 	# Either resourceMap or resources must be specified if it's not defined in 
+	 * 	# the manifest file.</cc>
+	 * 	<ck>resourceMap</ck> = 
+	 * 
+	 * 	<cc># A comma-delimited list of names of classes that extend from Servlet.
+	 * 	# Resource paths are pulled from @RestResource.path() annotation, or
+	 * 	# 	"/*" if annotation not specified.
+	 * 	# Example:  
+	 * 	# 	resources = com.ibm.MyServlet
+	 * 	 * 	# Default is Rest-Resources in manifest file.
+	 * 	# Either resourceMap or resources must be specified if it's not defined in 
+	 * 	# the manifest file.</cc>
+	 * 	<ck>resources</ck> =
+	 * </p>
+	 * <p>
+	 * 	In most cases, the rest resources will be specified in the manifest file since
+	 * 	it's not likely to be a configurable property:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<mk>Rest-Resources:</mk> com.ibm.juno.microservice.sample.RootResources
+	 * </p> 
+	 * 
+	 * @return The map of REST resources. 
+	 * @throws ClassNotFoundException 
+	 * @throws ParseException 
+	 */
+	@SuppressWarnings("unchecked")
+	protected Map<String,Class<? extends Servlet>> getResourceMap() throws ClassNotFoundException, ParseException {
+		ConfigFile cf = getConfig();
+		ObjectMap mf = getManifest();
+		Map<String,Class<? extends Servlet>> rm = new LinkedHashMap<String,Class<? extends Servlet>>();
+
+		ObjectMap resourceMap = cf.getObject(ObjectMap.class, "REST/resourceMap");
+		String[] resources = cf.getStringArray("REST/resources", mf.getStringArray("Rest-Resources"));
+
+		if (resourceMap != null && ! resourceMap.isEmpty()) {
+			for (Map.Entry<String,Object> e : resourceMap.entrySet()) {
+				Class<?> c = Class.forName(e.getValue().toString());
+				if (! ClassUtils.isParentClass(Servlet.class, c))
+					throw new ClassNotFoundException("Invalid class specified as resource.  Must be a Servlet.  Class='"+c.getName()+"'");
+				rm.put(e.getKey(), (Class<? extends Servlet>)c);
+			}
+		} else if (resources.length > 0) {
+			for (String resource : resources) {
+				Class<?> c = Class.forName(resource);
+				if (! ClassUtils.isParentClass(Servlet.class, c))
+					throw new ClassNotFoundException("Invalid class specified as resource.  Must be a Servlet.  Class='"+c.getName()+"'");
+				RestResource rr = c.getAnnotation(RestResource.class);
+				String path = rr == null ? "/*" : rr.path();
+				if (! path.endsWith("*"))
+					path += (path.endsWith("/") ? "*" : "/*");
+				rm.put(path, (Class<? extends Servlet>)c);
+			}
+		}
+		return rm;
+	}
+
+	/**
+	 * Called when {@link ConfigFile#save()} is called on the config file.
+	 * <p>
+	 * The default behavior is configured by the following value in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># What to do when the config file is saved.
+	 * 	# Possible values:
+	 * 	# 	NOTHING - Don't do anything. (default)
+	 * 	#	RESTART_SERVER - Restart the Jetty server.
+	 * 	#	RESTART_SERVICE - Shutdown and exit with code '3'.</cc>
+	 * 	<ck>saveConfigAction</ck> = RESTART_SERVER
+	 * </p>
+	 */
+	@Override /* Microservice */
+	protected void onConfigSave(ConfigFile cf) {
+		try {
+			String saveConfigAction = cf.getString("REST/saveConfigAction", "NOTHING");
+			if (saveConfigAction.equals("RESTART_SERVER")) {
+				new Thread() {
+					@Override /* Thread */
+					public void run() {
+						try {
+							RestMicroservice.this.stop();
+							RestMicroservice.this.start();
+						} catch (Exception e) {
+							logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
+						}
+					}
+				}.start();
+			} else if (saveConfigAction.equals("RESTART_SERVICE")) {
+				stop();
+				System.exit(3);
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Lifecycle listener methods.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Called before {@link #createServer()} is called.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onCreateServer() {}
+
+	/**
+	 * Called before {@link #startServer()} is called.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStartServer() {}
+
+	/**
+	 * Called after the Jetty server is started.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onPostStartServer() {}
+
+	/**
+	 * Called before the Jetty server is stopped.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStopServer() {}
+
+	/**
+	 * Called after the Jetty server is stopped.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onPostStopServer() {}
+
+	//--------------------------------------------------------------------------------
+	// Other methods.
+	//--------------------------------------------------------------------------------
+
+	private static final SecurityHandler basicAuth(ConfigFile cf, ObjectMap mf) {
+
+		HashLoginService l = new HashLoginService();
+		String user = cf.getString("REST/loginUser", mf.getString("Rest-LoginUser"));
+		String pw = cf.getString("REST/loginPassword", mf.getString("Rest-LoginPassword"));
+		String realm = cf.getString("REST/authRealm", mf.getString("Rest-AuthRealm", ""));
+		String ctx = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
+
+		l.putUser(user, Credential.getCredential(pw), new String[] { "user" });
+		l.setName(realm);
+
+		Constraint constraint = new Constraint();
+		constraint.setName(Constraint.__BASIC_AUTH);
+		constraint.setRoles(new String[] { "user" });
+		constraint.setAuthenticate(true);
+
+		ConstraintMapping cm = new ConstraintMapping();
+		cm.setConstraint(constraint);
+		cm.setPathSpec(ctx);
+
+		ConstraintSecurityHandler csh = new ConstraintSecurityHandler();
+		csh.setAuthenticator(new BasicAuthenticator());
+		csh.setRealmName("myrealm");
+		csh.addConstraintMapping(cm);
+		csh.setLoginService(l);
+
+		return csh;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png
new file mode 100755
index 0000000..008c6b5
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png
new file mode 100755
index 0000000..9e55346
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png
new file mode 100755
index 0000000..f5f0c7c
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png
new file mode 100755
index 0000000..1234828
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png
new file mode 100755
index 0000000..4589f19
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png
new file mode 100755
index 0000000..21808c0
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png
new file mode 100755
index 0000000..b5e8471
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png
new file mode 100755
index 0000000..50504de
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png
new file mode 100755
index 0000000..e730d32
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png
new file mode 100755
index 0000000..77604c1
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
new file mode 100755
index 0000000..036160c
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
@@ -0,0 +1,1039 @@
+/* Javadoc style sheet */
+/*
+Overall document style
+*/
+body {
+	background-image: linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -o-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -moz-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -webkit-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -ms-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #cddddf), color-stop(20px, #eaeded), color-stop(70px, #ffffff) );
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	color: #353833;
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 76%;
+	margin: 0;
+}
+
+a:link,a:visited {
+	text-decoration: none;
+	color: #4c6b87;
+}
+
+a:hover,a:focus {
+	text-decoration: none;
+	color: #bb7a2a;
+}
+
+a:active {
+	text-decoration: none;
+	color: #4c6b87;
+}
+
+a[name] {
+	color: #353833;
+}
+
+a[name]:hover {
+	text-decoration: none;
+	color: #353833;
+}
+
+h1 {
+	font-size: 1.5em;
+}
+
+h2 {
+	font-size: 1.4em;
+}
+
+h3 {
+	font-size: 1.3em;
+}
+
+h4 {
+	font-size: 1.2em;
+}
+
+h5 {
+	font-size: 1.1em;
+}
+
+h6 {
+	font-size: 1.0em;
+}
+
+ul {
+	list-style-type: disc;
+}
+
+code, 
+tt, 
+pre,
+dt code {
+	font-size: 9pt;
+}
+
+table tr td dt code {
+	font-size: 9pt;
+	vertical-align: top;
+}
+
+sup {
+	font-size: .6em;
+}
+
+/*
+Document title and Copyright styles
+*/
+.clear {
+	clear: both;
+	height: 0px;
+	overflow: hidden;
+}
+
+.aboutLanguage {
+	float: right;
+	padding: 0px 21px;
+	font-size: .8em;
+	z-index: 200;
+	margin-top: -7px;
+}
+
+.legalCopy {
+	margin-left: .5em;
+}
+
+.bar a,
+.bar a:link,
+.bar a:visited,
+.bar a:active {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+.bar a:hover,
+.bar a:focus {
+	color: #bb7a2a;
+}
+
+.tab {
+	background-color: #0066ff;
+	background-image: url('data:image/gif;base64,R0lGODlhpAYoAOYAAAAAAP////CgOe6fON+VNfChOu+gOeKXNvGiO+2fOtqOML58Kr17Kr18Krt6Kbp6KbZ2KLZ3KNuPMdqOMdqPMcyFLsyGLsiDLcOALMB+K799K79+K758K7t6Krh3Kbh4KbZ3KdKKMNKLMM+IL8yGL8mELsiDLsiELsaCLcWBLcWCLcJ/LMKALLl4Krh4KtKLMc+JMOWYNuOXNt+UNdyRNNmPM9WNMvCgOuqcOOibOOaYN+aZN+WYN+KWNt2SNdqQNNmQNNWOM/GhO/CgO+2eOuyeOuucOeudOeqcOeeaOPOiPN2VP92XQd+bSOezd+i1evnt4Pvy6v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAFIALAAAAACkBigAAAf/gAFRT00UCgoThhSKh4iKjIeJCouOk5ATlZSGkY+TlZmQlZKUoIilhqOonameo6Wsqpaep42wnLS3mriSn5SYtqzBnbHExa3DuaG2osjJx7Kyv8jC0dOM1LrLy7vGm6a+tNjdma/Wspvb2uPO67zq5ee1zZLp5rqf767gwKv98a7int2rF49ZwXDI9tkzxk/guHf3uOFCWNDdPIYXDzbUpfCfP1/24GXLGDFfM4oD0WUMKM1jtZcjHaK8dNKkxoWzLFbEWPDaR587bwYluGqmSKA8Y6YUupQoUprsbgX0thFqyZU1caqMFM3oVHJfISrDyrRo1aMCS3U9G/ap0a1X/4dmdblUARQmOoYo2cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky
 5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLJu1kR4HbQhDg3p1bdwEhvBH4Bl5gePDiu3//Fp4c+HDjynvfhp47uW7qyJVnJ47dOPTuzZeHl64dePXtwcGXF89eCHf0yr9bD+99/nrs54mbZ77+PH7++sHn3nQCwifffbsdGOB/4wF4XIHSvafee9pNaCB9DTbIIIQOxpdhew8qmN6H/1kY3XMk8kagiSJ66CKFC34YIHkz+lYihv2tiCOMBCL4Yo8x9nejkECO6GONuG3Y4v9+Gu6oInIs2hekc1ImKKORSHJoIpMgnljkhVFW6OSSHDZJpJZOetkll2RWR6WYRz5Yo5JmmqdjnBfGSeaGc6Yo5Jbt0Qlnn3hySWiWQ04pp24SprmnlYNCmuWhIdY5X5g8/vhdo3g++mOBfGJZ6Z9pGorAEgMUIIABNxRgAKuv3sDqbbHW2qqrsBqAq6ywtqprrb3Smqusu+5qq7DGzgqsq8kSu+yzw/4Ka7LNSsurrL5Geyuw2OJa7bbRfltsrLwyy621r1J7rrHqhntuttfOKm667wobb7PlojsttPm6u2+u1c6rrb3H0juwq/kGzK/B99babsMD1yuwuApHrKz/xQ8fO7HE69Yb68a90ltxvyQ7bDLAHVscL7gre8uxvyuLnHLJ+jr7L802t/yyzjXLO3PBF/OccbA7nxzzryMzrPTN+iZN9MEe98yy0UDDC/TQ5sK8dNJD51y1xlFT/PPTVj/dtbJe9yxwyyCzbavMWjf989lrg41x0UyT3fbS3TrdLd5/S01w3oH7mvDYdFOtdtRu3w11tEgjvjDT1B4ed+J5+x203UIDLvjHChCRQAJFFDF66aiXPjrpqat+Ouqvt74667LHDjvrtt9Oeu62z9666bQDn3ruwrs+fPDG/0488Mgbv/zqyjdfPO/Q13789dYnr/3tvxdfu/SnP0/8//LMN9978OPTfn703YsP/u7vq189
 9tunz/399Oeve/vw82/++9vj3vqiB0D3se+A4vOe7v6XP/vVj4EH/B7/FLi/7PkPgg+M4AD1F0DXFTB+EcReAjfIQeaF8HsYVKADVZhC/B3vg/47YfJGiL4arpCFGqyhDCnowQka0IIihKELYefCGw6xh+z74QtTSELtNZGHUJzf9ZR4xOkJsYMmBGIVpShAEGpxhvK74RNjN0YAEtCHXkRhCMtYxAWuUYcWZOMOuei8NG4RdxRAAhKMgAMjHAEJfcRBIP34x0AO8giF5CMOEilIPvoRCYw8ZCT5mMhJ9hGRgJxkJP9oyU0CUv+RnfzkIkU5SkNSkpSOtCQhUXnJTLJylaYspSJT+clEghKSrPSkIUMZSF3OUpaNbGUsYfnLRwJTkrlE5S15ectdJrOXpGRmMI1ZTEwOs5CqxOQyn9nMbgaTkb785iuzmU1XXlOah6zlOM3pTWRek53TtOYvyynMasJzm7EM5zFPCU1n5nOd5wQoObk5TUFykqDHlKY++WnPgL5zn5dEJy3rGU94QpSa8ZSoM9G5UGB2lJ7VpOdA//lQjKYzodHEJUnbqdCUrrSiDm3oSOcJUJNOtKN+7Gc7GQrTkAp0nIzEJ039uVOPunSoDfXpQ2cqzpKK9KgZRehElSpToEq1nn//FGpTWUrQj9Y0qku1aixHyVGo6jShWj0rSl/q1ZKCtaox3WpPjzCBJOQgB0nIK17zyle+7rWvfgXsXwVrV8D2dbCB1athE4vYwh7WsYR9rGQjq9jJWvaymK1sYxNLWco2Fq+bRaxoFzvY0Rp2s5A97WIdi9rUcla1oe2saytL29q+NrO2ZexqUwta0so2trcFrmpXi9q9tla4niWubY+r3NneNre0LS50ezvc4PrWutWVLW6Nu1vkwva62O2sabUL3fJyt7nkhax0Xbte8OJWsd4dr2Xl+9zyOpe13XXvZNdLX+r+lrylBTB6sytZ5hKYs/xN72W9W1/z2je28RVw/
 3i3m9/rGji9f03wexn84OZemMK19e+CJbxc/Tb4vuc1MXz1S98Q5zfCmQ1wjAeM4Q4fmLYU4EEMeLADHvi4xzsAso9/zGMhDxnIPeZxkZU8ZCUHmclEfnKSk+xkIxO5ykdecpalHOUpaxnJTDYymLHsZS53GcpkznKatyzmJVP5zT+m8prHTGc3R/nMc7bzmeUMZjivec94fjKbw/zlQpu5zYLuM6AXzegyWznOTVY0lictaUQ7mtBm/vOfL81nPUsayp++tKZDzeg8ZxrOp76zoBdd50R7GtOcbrSeZT3qV3N51aYWdaVhzepZf3rTpd51qmndaiv/WthCxjWyA/9ta2Yf2tezBnatnz1saRc70rbWdbMpnW1QR5vU07a0t4ltaEQ7W9yofjS4jz3pXrv63ebmNrWN/W1oh5vXfrZ2udG87HTz297snve4IT1obcMb0+fGd8GxPeyAj9ndBo83nTstcHlLfN+xDjbA6y1wP0ugBzLoQQ8OAPKRi5zkJC95ylEu8pCnXOUnN3nIXR7zlNPc5DC/OctLDnOZ47zkOm/5z2/ec5vjnOhBL7rPV350nLM85Eo3OtOjnvORv3zmThf61Yee9Z4jvetBJ3nYtV5zno9d6UXfetK/vvWp35ztMaf62ccO9bmrHexcb3vc3573vWdd7H8nu8kBT3X/tNN96WWve98HL/inN77pbg88zQ8P87tHXu+P9/ripZ74wMv98ZyHfNmFvvbFG170mT8800Pv+MKXfvVVh73iMe942J/e9kDHO+ZvL3jeM37ukgd96oMPeNn3/uuvF3nPfQ931Nd+9JQH/uU7X/zOL//soff98xn/eddzP/fTP77uxR/+7e88+p5P/u8Rv/7rp3/867c9+uUP/+fLwPJ+3736m8969p8/+N43deCXf8rHf4JHdPiHeu4Xfgb4efRnfAFIgPHXAxJAADNggRY4AxeogRiogRz4gRn4gR64gRsYgiLYgR6YgSYYgi
 pIgiNIgiz4gic4gibogjOYgjT4/4ItiIMlyIMoOIM1CIM2uINAyIMXGIRCaIQi6IM5qIRJWIRQGIVMuIJLCINISIQ2mIVYSIVNyIU/2IJemIVCGIMyuIU6eIZD2IRMOIVs2IZdmIZw+IVu6IRg+IZBWIdrGIVk+IM4eIVVWIOA+IdqeIN6CIJ2WIaGmIdjKINPqIVoyIVV2Ih4uIhzKIVm2INLOIl0mIiUSIid+IabCIqCKIqdqImaaImjKIdSGIl+CIehCImOGIcuaIqcOIeXqIqfyIqJCIuSyIm0iImH2IeMeImvOIiBKIt7iIyICIy9CIzJeIePKItu+It8iIrK6ImKeIzZOIjNqIp8eIqfiIXbyP+NxDiLwziKxaiExxiGzxiM7tiN5qgANOADNFCP82iP+FiP9JiP9riP/ciP+niPACmQ+eiP/siP+3iQAYmP9KiQC/mPDAmQB6mQDkmQBTmQFhmRGamRFymREBmRFUmRHTmSGRmSA1mRD9mRKLmRLBmQJsmRKfmRJemRNFmTKomRE8mSIgmTMrmTJMmTQLmQK/mSCCmTGumTRUmTQ2mTHImSCemRRBmTUYmURlmVVimQS5mUJ6mTPzmVPxmTV9mST7mVWjmSTimVZMmUYAmSTEmVKemWYomTZJmVX/mQZzmTbFmWeEmScHmXaimUcqmXH3mXcNmVf9mScYmYJhmVewn/k32ZloIJmJB5lQY5l3W5ln4ZmVgZmJdZmf/ImI9plIwZloTJmRcJmnWZk1uJmkGpmlaZmZ25lpiZlhRQA0AABDXwAzWwm7qZm765m7+pm73Jm8BJnL45nMYpnMXZm8g5nMz5m8UZnMCJnNNpnNZ5ndJZndqpnc1JnM7pncsJntH5nN0JndL5nbxJnckZnuzJne1pntm5nuipnO6pnuTJnuX5A+oZn/BJnc+5nf15nfcpn/gJn+cJoO6JoP4poO/JnwN6oPUZnRC6nhFqnQ+qoOJJoOOZoQ6
 aofNpoPS5oea5oAUKoCSan9B5oReqoRTKoiWKnSf6njFaoRNaoy76/58s+qH2KaIhqqIMepwS2qENiqMjyqMFqqNHKqE+WqRAaqEcCqNBSqQkmqA/SqUTuqQhSqNC2qNaCqVNWp5W+qBYCqIcmqVhKqJniqFMyqVN6qI3+qNsaqMB2qZbmqJl+qQ1KqUeip0tOqdp6qUoiqRdmqd8KqRqCqZ2qqRVCqgyaqQ0OqY7Sqd62qa6OQFBYAOYagNBcKmZmqmbyqmdqqmb2qmjGqqiWqqh+qmmWqqoSqqj2qqi6qqwGqueCqq06qq1iqupaqu5uqqzGqu/qqq7aqq0Cqufyqu3mqyziqqtuqzImqy1+qyvKq3OSqyniqzNaqvViqnZ6qvEGqzgCv+t3Mqswqqr42quvaqs2Eqt3xqu4Lqu7Xqu3tqtvsqu7+qt+Oqu67qt8tqv6Uqv6Jqushqv9zqs1nqs+Oqv/AqwAtuw42qv1Aqv+QqxAeuv0Zqw9SqxCquxDGuxHnuqBBuxGNur+oquCGuwG5uwHSuuLFuuuFqwFVusFOuwmiqw/BqzLpurMButGquuKqutPUuzOXuuO/uxrDqzRnuzQluy9Tqy8kquN7uy5Fqx4dq08yqyGYuxUguqzcqzWgu0P0u17Gq1w1q0LcupQTABLxACIrC2IfACawu3bxsCdCu3dku3bxu3epu3czu3dhu3ePu3fuu2guu2fCu4hwu4hZv/uIy7uHdbuHsbuYDbuIEbuXUruX1LuYvLt5z7uJYLuY2ruKIbuoN7uJdruqd7t6RruI67t6bbuqv7uaMLuphLuJabupNLu4H7urIbu7xburq7uZtLuatbub+runJLvLR7u8pbu8bruaibvMLbu867vJo7u9V7u8M7vcR7vcfrvdYLvbVLvbnLvNy7veTbt9KrveMbveabvvDru7DbvuJbvqjbvN07v/aLv+ELvvQ7u/LLv5MrwPerv+pru+4bwH4bwOc7
 wA1cwABswP1bv/57wBCcwOh7vPv7wLqLu8Brv6pLwCEswacLvBU8wdh7wh7Muuybv9mrwQycwjD8v+Ab/8MY7MAtnMEUjMAhQAEjMAIw8MMwEMQ/XMRAPMRGXMRDTMRCzMRGvMROrMRInMRTPMVUjMRW3MRPvMRJfMRb/MVXLMVgPMZkLMVRrMVZbMZdnMZa7MVbzMZZHMdnbMVyvMZn7MZXfMdYrMdwfMdH3MdkDMhtPMhibMdd/MeHvMeJTMdcHMaFTMiDXMeOPMlvvMh4XMmUXMhs7MWSnMeWvMmNXMZtDMpB3MeCTMin3MmPLMqIbMikPMd+/MewHMizjMq1nMlNzMeXrMa47MakfMm/bMe3LMzDrMqR7MSnzMqh/MWvbMjO/MuqDMXObMvTbMy7DMm5/Ml8PMyarMvWDP/Eq5zMq8zLYdzMeVzMyHzL1hzMnuzK2zzNYAzN6bzI3IzNrVzO79zLVczE0kzJ68zP86zP+YzP9EzP6CzKjPzEZnzQ44zH/2zJwqzNBS3QQqwAJHDRFnDRFZDRFsDRF00CG00CHS3SHx3SI23SHg3SIM3RKb3SIu3RIe3SI53RGp3RKF3TL63SN23TLC3TPJ3TPx3UQk3SO43TM13SPU3TIV3URg3TSY3TLp3TFeDTRN3TN13UJk3VWP3UVE3TXY3TTP3VNy3VYm3VZg3UMq3VT83UYc3WQ+3VU33SZS3VZ33UWX3Va83Vba3Xb43UaO3WTU3SLo3XaB3YSt3Xhv3/1VEN2Fkt11tN15Bt104d2ZN91Iqt2EvN1XN91I6d15S92Wr913xd2JiN2Jud0jHN2HWN2pr92Jxt06cd2pJd1Z+N2Htd2JlN2q7N2ok92Kut05590r8d1LJd2bxt2aV92bst2Kk92oRt2cYd24et287d2h7d2aL92a5d3LRt2bft3aa93NOd3M/d0uLd2+Rt3dkN3hpN1std3t3N3bat3uz93VYd2/BN3GON3bMt3
 LWd1vmd3Mit2tS93rxNAhJwAhdQAiZQAifA4Aze4A1+Ag8u4RLu4BUe4RluAhf+4Bve4R/O4Bke4hNe4SH+4R4O4Rwu4ipuAije4iwu4S9u/+ExHuEQTuIYDuMTXuMrXuI6juMjDuEa7uA/3uIzbuMuruJH3uNAruM5TuM7nuRQ/uRIHuJDTuJLLuVVruRGXuRTDuRNruU9nuNX7uVDbuFYzuVobuZjDuZObuJvnuZffuNvzuNiDuJ1fuc3LudITuRR3udwfuEcnuJQnuV8fueH3uFxnuduXuhOPuh+vuVrPumSbueJTudfHuaNXultjumAbul5DuiXvuaJnuU8bup6/udtrumL7uhzruqKjuhdXupd7uqgbuudnumM3uqcHuuRnuuo7uAyXuu97umrvuu6LuhJTuuUzuRqfubFDut7juyizua+zurNjue47uvH/v/qm+7sr07kZb7tqL7h5R7q3f7pqU7lPb7s1n7uwz7p7k7uxA7utx7tv67t6v7t8a7uDj4BKJACKKACAj/wKaACBE/wKLDwCZ/wBW/wCM/wB+/wCy/xCH/wD9/wBy/xFk/xDN/xBd/wFQ/xCd/xJk/yGw/xJ6/xKgDyCo/yLw/zIe/yGT/xKc/yIZ/zEz/yLL/yOw/zFu/zF9/yMk/zFY/zH1/0Lg/yP7/0JC/0Ja/yTw/0So/0Rj/wVx/wEX/0Nk/0Ij/1PS/1Xx/2Vm/1VZ/1ZN/1OX/1Xv/zZl/2aN/1bJ/zQz/zEN/0VD/2bi/3Yr/3Qz/3dc/1gY/1Sp/3ar//9U6v91uf9m2/+Hxf9mov+B7f+B5v+IP/8nAP9pFf+Izv8Ihv+ZSf+Dfv91EP+YN/9pz/+JuP+asP9Tyv+o4f+6U/+rJP+5O/+aj/9rB/+2wP9Rjf97VP+b+f+pcf918v+rKP/L4v/Kx/+pmv+39f9XQ/+ctf89Fv+pX//Ljf+cP/8njf+csf9Jp//au//a1P/McP+uEP/C3//b
 u//rMf/ICf/ecP/fHP+xOAASuAASwACCwsGIKFhoSGh4mIiYOOjYKMipGQlI+ThYSSmYudjZKbm5aflZeeopykkIyimqueqbCms6OytqmotbGkqKG3pr6qwsOTucC0s8Gyypi//7q4pb2VrNO6xrmI16/byI/S0s3IoL/Y0dXd4qWO4Lvp7ezO3dnmxLHlyefc4Z3w+MPM7QIK9EbPGbVtAF0RA1iLobyCpyAOPKjKoa1+Ax+i+6bP3zJy+epZ0iby0j2L7kpqJGlwl8KLIN91zHhSIqd+DsdVwxnT2sxnE4ECvceCQoYNR5Fq2MC0KdIMS50yzQDVaVWpSq9KpRrValStVquCVep1LNmmYM1qTdsVbVu3WJ++nbrUrFysdq+Ohaq2LVu8Xf9unXt2a966hLkCjpt1rmC6iyHDHRw37+HCYQNr6Ou1M2XJoCd/NpwYcWXOkS8/zlzZNF7Un1U73jzbc/9o0Ktv67672HJtxnx/h4adG7No1r0Tw/Ys27ZztMsHLy++1q/w51Obv74+Wftw2pG/h6de+nR53+GZn7de+Xj03YqTmwc8nf1o8q3ny9+evvt67LwBiN5+pPUnWXX1YVedguXxRyBy0l2H33BuJXgcbvYJqNx/Dmo4lQQcNCDiAgyMaCKJJTawwIkMpLhiAy6yCKOJKqrYIo0ruhhjjSiKuCOJNJb444w1EvnikDHuiCSONjLZY5ErAmkki0tC2eSVCxw5ZY1KBslkkl5aOaSUL0Z5o5VSjnlmmVtm6WObW3Yppolysqmmk2vKCGePWlapZZF+xvklnnjeuWeeXBL/iqWedVKpqJqB8qjjoye+GWmjiWb6p52KsvmkpylCOiialo666Ztzaooqp2iK2uqqjqYK6oiGYmpmoaZWOuOlYbKaY690dhrrrIdGeuuiksIqKK+A5mrrobi+WmyuySJ77LNA/tqsrHqCWmu0UZbKraDcPmuot5S2aiyW326L7rjHvkusq75
 2W2Kf1JobrLv7Eisvo+B6yeypqiqJ77j6qgrnucMCrC618TJAwQMUd/CAAw9Y3IHGF2OsMccOeJxxByJvnPHFKH98csgnm0zyyi2D7HHJFtOMMc0Z2xwzzi9rrLPKPY8MM9Adxzw0z0UDjbTIIo98s9FBb/yz0FFP/+3y0lAnTXXKS/OMs9MpU2111D63PHbOWXedNtpEswy21zvHrbTZcou9dttYk70y3G0PvfXMdbusteCA4w113mETznbcfIP9ceNkQw5y2nmrPTfRUide9uOBb7545pf/Tfndltvdd82kd+434ZIzfnjnkJ+tN+qGn1761XdrfjTsukeuetW/I8566rWbLjrtx8t+seegG6948c/f/vbrnFfvvOzCy0z8360jX/nvgzM/OfTj3y6+3xhPH3rz7DOPfe7D2z460C9L/r74HtdPveP8447//s/j3vbi57zxXWwCHmjBBz6gQBcwcIEKVOAHHCjBCC6Qgguc4AMf2EANVv9wgxgE4QNDaEENehCCJ7xgCiUYwhSuUIUs3OALX9jBD8bQhiYkoQg/SMMTUlCCGtShC1soxBAScYM3RGENlQhDJjqwhzMkIRAdWEQZHpGHRrQiEpvIQSjqsINenGIUtShGLO4wg1XE4Re5aMEnrnGMahzhFsF4RSb20I1zZKMel7hGPJYwiFscIhlRmMI6nrGLb+zjHvUIRUCasYxoDGQWIXnINubxjouEoxPlGEdBxhGHmuyiCtMYSUom0ZOEVCQoFelFSeYRg6w0pCNTOUhGTrKUtPykHWN5SVIikpObRKUoTxlKS67ylZnEoBh9KcxTGvKUxtwlMlv5yE0u8Zf/zazkIhM5TW5W85cNXKYrKRnKZ26zl91EJw9nechsFlKG4vymO29pS2Qes5PezKU1P0ABEIAgAhEAAQQA+s+ABhQCAzWoQQWa0II2lKAHjcBDF4pQiBq0oRP9J0MBmtGJDjSjErWoRy36z4eOVKElJWlE
 UXpQkAqUoyrdKEtdilGCOjSkMxWpTnN60Z0WNKUsfWlQKzpUmA4VpBm9KVJ9atSf4hSoN+WpU4U6VaJWtakQ3ahSVXrSqDrVpEztaVGPGtOE0nSpY6VqVs0aVo1ada1YpShar7pSuj50q1KN61yfGleowpWsYz0rV2MK073y9bB+7SpEaVpWxiK2pYNN/6tjFUvRxkZ2qoW9rF41S1m/VhawdrVsXj+r1s9S9qOaPexeO/vY0rp1sqL9alkJCluFMtazhnVrbP8q2IVmdrSsBattU6tb0PJ2t2Klq2tXylqZyjata61tVXNb14Hi9ble7Stfgztb45oWudddbFhXK9LwJnezeeUudOXa3d5i968CReAH8ylKc3aQvknk5guPyExzvtOU57xnMPEbYA/GU59cLGctoQnM+qZTwJU8cDv9S89iNriEvFylhIlJ4QmPc58Oxqc6ERzNDOMyxAMesTb5+GAt9nfBXOywLlGMTQI3koofTrAvZQxiDLeYxgxmsYgBfE0ff/OPOJYnj//naU9pDtnJJAamiXUcSiZzOMfRBLIcqRllIaeYyAi2cJFXnMMRb5jKAP7viYPM5RqrmM2w/HGb4fzmLdtYlRM8szAVnGY8a5mOdR5ljq2cYD3LcscwxiSELTnnAvfzp+6NblsjGunk9rajOjWsenFL3LpKOrDgbW1NA2peTg83vZN27HTbG+qk/va9quVsqru7alCTtdSxPvV7Nw3fT4fWu54t7nKF2ty3fhfYoqYtq30bUk3P+ryPVbWvj4tsl75avLrWrnCzC21hT/vYtYa1sKWr3WEbO9jDdXa2z8tr0n67uJVGN1XJHWt1czuxz1buu5nbalrT+7a5Fren2Wv/63CnO7W8bre3Cf5rg3e7usu+N2RHu/DXRnzfqrbutaGd8Hz3muHUdjiuTytr2458vCWXuLRBDm6M+1u+KCTwleN45wuLcL8uHvSSl5xlI38ZymSOcwsMXUs+r7nAf
 y7zotlIdHIius9NTrofd9n0Exu9njP2uZuXrmhMZpPOje66iauOZgTz3OZgrzko2Tnzo6sZ6z0OejKxLGU5+1nrbBa0khNdYV/2XO5hx/OUBfliqLdd7ksHNNcFb/dLHp7OiVc6lMlO6Mr/Pe2BZvyT535ktJ8z8E12AeV3zveo493OgWZ72eHuwtGX/vFIP73igQ55fvpT2ch2brlRW23c/9ca0wcHrscVPnCLF9zlkrXpxk2tcmw3f73Gbzjyf3rydZN33fKON79vvfyAa9v534f+xKXP8uz7PuS7p3f0wU9aclef29d/vr7Lv32Rt7b7JEc19pOde7b2PvnHx3/2Z23NhnDD53HuRn/E1m8ASH4jZW/hx3zsV3Hjh370l3EXl2wS+HDmpn4V+H7otWsISIG613IX6G8ZqH0rt34myILmF1Eg6H3sNoLFV4EtaIMx2HEmh38op3/y93EuWH/TB18QAHOe12aYpHathHOuZ3irV3tSx3ld5kMM1IRu13d0N2aYt3hIZIWsd3Za+HmJ5IVXJ2aNNntaJnaNF3lTl/+GmvdzZPh0V2h6gKeEoqR6eyaHrHd5Yph5obeGccdgN1ZlpOeE4ER7qMeFujR4/KVzr/eEsVeHfriIgDhMkNh1UchlcZhjYHiGkueGf7h5oJd1kqiI+yR6kVR4cwh7mCh7n3h6ehdmhZhBm/hNnShzr6hNXWeEYYiEiqSE+qVDjbh3hniLdYaGsKh5tWh2j3iImWiHQ5eKjliMzciHXjeG0kiMq3iJd1eKiKiGooiLbZiMoQiH2SiLzWiMbCiFZBaLHkaNhmiNU0aOlBiOdCiIb4SHh8aJ1XiE86iLb7h1Vpdk6AiP2+iMrjiOAFmOAplJrNiNWzh55/iOB6mOiIj/jAtZjz/HjlCYkBxZYKjojodXhn7njz8Gi/pYdHqYc9r4hf3Yi/+Ij032aOengMbGWCpYk8YHfDl4gPu3gjgohCfYgD35k+xHXR
 2YgUHoagUofEbJcZ2WlAFocUX5g8QnleS3lCgYgNq3gP+nXO7Hg9aXchEIhEHplQNIWE0Jazr4gwkYhGg5hO2XgrQmlxollvBHltFWlzaZflE5ag6YaQb4lBv4gvYXl0MJlnRZVIUpgPuGmOtXlWV5lV3pf2nZgBaYk+JXgvDGgIopmXsJlRRXg5wplEG4lkfpkw4FmvFXlm95lpZpl9XFi574daonkzCpR8NYkBX5kp6okLh5/4pVOJEjuZIlmZubR48QtIyHZJHP2EvM6Uy+KY4fCY4b+ZvVGZCMpkzEuXokmYXYOYp2lJJOx4/xaJLJmZHCaY+kGJx3SJAU6ZLniZwbqZyHyIgsyZvyeZDyeJLqeZ+VWEIPeY99KGDRGWPTeYy56J4lFqD/2Z/pyaBSdqBvZ4bUGXbkOZDmSYvdmYcbuofoWZ8PCkw0SZrnZoM46ZmXRlIPOJhWSYNYaYFaSZR4GYLgR5mhBplByZS8x5aq6ZokeKI6qlU1KoP4RphmWZpDeqIYyJU5GpuJSYQXx5p6iZSV6ZejSaU+CKQm6oGl2aSBuZlMqpY9mppIiqP9h6UCN/9vi6mlIoikr6mkUDqjiumkjGmkjtmXonZXRdqWXBqjN/ilWxmmlzl/cDmnO4qCbnqjMHqle6pSqCmaL7qDkbqBrRmahgqbajqBs5lAMaegtgmfyhmMW7Sb8fmdnUefDWmfDRqNIumdxgmeFwqNFIqFqRqe2PiqHmqLCbqO4gmg7HmRCwqiXiaQtRqfHemNoLh2ogqrH2qhCgqcxEqFwYqQI3qsA9qeBfqN2pmIGqqK+zmtszqJ63mdb5StgbitKIat3Eig10iuwGqu8AqhIiqhfMSulheiq6qLGdquxISvzumRvxpNJQqoLJiiX7miKNWiTjmpbhmkXjqmNFqpMnj/qVb6pJvabYs6g3AKsUoJWRt7pA/bpR8rqJhpgo6qmXUqfSG7XY2KsY+apX36o5iapEKKqCa
 7spnJl3SaVTN7pi+bpjG7poC5s8Hno0DbsSQ7lYl6sp25fy/VmEApp5vastv2pynrmVJqp4VqsxF7sTD4sw6LtTCrfRSbf2+6mmI7mUF7mDgrsWBJm7gYquJJqvOVn6caq7c6rqYIrADbq8IqrcX0t/OJq9DZofvIq4XLt9zKkNsJYxG5rOVqrIirks96nIbbt0hGiOkIuM+puXVXrfTajv1aeQGrrKwauvJKuPypr48LusX6ukfXkskauT7HuuIardnpuN66u9r6/66w60O4C62+amOlO4uEdLydu7i6O7AkentL63AIW6gKC2mC2bBsq7QGa5pNu7JWa6ZEW7ZaS2prW7No6rZ++b2Syqnbu6Rga242qqcqu7UsW74W+5fi+5U+e7Y9mLZkK7TzO5dc67VRab9Vir8APL7j1qYGvKU1G6c3m7GG+W+zJbU8q6lDe7Tgm70j275v+74UrL8Q/LUIHLUN7L8P7LFMW5r8O5YODAHqa8FiSsJZilFyC6r2dZtwZ7efOryYy7iS67eVW56K27qqKrtB7KrKa5C5W7yHq6uJy4zM68TBK3SrG7i+O7my68Oy2rzQiLfFebldTMWNq5EN2YrXOv/EGlrETYzFzhu7vUt409ibU+zGXwzHaAhF6GqttntGXLy3XjyvqnvGd5y5ZXyKfzyFQIySzbqrUsyhUGy5bEy8dizIS1SwlVlsGWxposWTJ8yo2pu1IrzA5NvCefnCJfyYH0xcMYynUxvBj9rK56vKEiyAIYy+mzzBU/rJHNvBoty1zFam62u+bUvLuWzLDDzCBWzK8Suy/4vLAUzKhMrLzpzC0Suj3Uu/RntVMpypVJvBslzM8qvAEDfAUarMKwy3UhrOoZy/9sfMrnyU7OzL7iyb80YBCjABEkABE0AB/tzP/BzQ/izQ/QzQ/zzQBx3QBp3QBY3QAL3QBv3QAo3/0AQ90Att0Qmd0Rpd0Rjd0R0N0Qcd0SHt0CNN0RIN0hNd
 0SL9zxfN0CT90h8N0ynN0S690g0d0y190i+N0hPQ0jQ90xct0R4N1Bqt0zW90zOt0kMd00sd1EUt0z9t1EqN0xQ91S5N1Rkt1U1d0kdt0lwd1Vxt00l9016d0k6N1EN91jw90Vqt1V191W+N1hut1jJN11ht1Xgd10L91mKd02VN1m391Apd1WAN1Xtt1n+N1H2t2FUd2Ig92Fn91XNN2Id91kwt2Jdt1Y5N1ndd2IDd2ZMN2Sid2VK92WP91ZxN2mWt2lv92J8N2XGt14L92nlN1LDt2WyN2pKN15UdKtYbDde2zdqhvdaLDdq8/duF3dqjnduNjdnDXdeJfdem7de33duw3c+BAAA7');
+	background-position: left top;
+	background-repeat: no-repeat;
+	color: #ffffff;
+	padding: 8px;
+	width: 5em;
+	font-weight: bold;
+}
+/*
+Navigation bar styles
+*/
+.bar {
+	background-image: url('data:image/gif;base64,R0lGODlhMgBwAOYAAAAAAP///z1bcT5ccj9dc0NieUBedERjekFfdUtthlZ6lTxbcT1ccjxbcD5dcz1ccTtZbUJieUFhdz9edD5dcjxZbjxabjtYbEZogEVmfkVnfkRlfENjekJieEBfdT9ecz1bbzxZbUZof0VmfURle0NjeUJhd0BfdD1abk5zjEtvh0pthUlrg0hqgURkek1xiUxviExwiEtuhklrglN5k1F2kFB1jk9zjE5xik5yiktthVJ2kFJ3kFF2j05xiVd9mFV6lVR5k1F1jld9l1Z7lVV6lFqAm1l/mVh9mFh+mFqAml2DnluAm1uBm1p/mV2DnWGIo2CGoV+FoF+Fn16Dnl6Enl2CnGKIo2KJo2GHomGIomCFoGCGoGKHomKIomGGoWGHoWOIo2OJozxbb0VofzxbbjtZbEZpgDxabUhrgkJid0Fhdklsg0hrgTxZbE5ziz1abU90jElrgUhqgFN5klB1jVR6k1F2jll/mFqAmVyCm12DnP///wAAAAAAAAAAACH5BAEAAHwALAAAAAAyAHAAAAf/gGYhgmaFgiGIg4OEi4WJiISGkIuNh4mWgheGbpOWipqFnJchoI+ToGZuFhUQrK2trrAQs6+vFbG1rLe5s7quaMDAcCgoaCjDw8EhwcPFx8fMxMbB0c7DZWUg2iBj3Nnb2djb3N7j291j3+bo3wsLDe/wAg0P8A32C/Px+fT2/vz19t0DCI/BAAYPBgx4gPAgg4YLDyZc2PDhw4kME1bEWJEBAQoEHBD46ICCSAciKagcKZKkyZAnR5p82bLlzJMfDBjI+aFnzp0TJvTUuXOnT50fJhT1+bOp0aE7T0iVigDBCQ8IPEjValUr1a5Zp369alXsiapktUqQsMZEWxMm/9aumbtGTdy5buHGZUs3L1y5btu+3Tu3Q4QIJQp0KHF4MWLEHQwjVsw
 4gmPGiR1bnjxZs2MXB0qI5uCiBIcDHEq4cJG6tGjTpU+3fk3adOjXo2OjLrGBhO/evUlsGA5cuG/jwYknN858efLhGTKMGCE9unUN0bFn0DC9uvXt0qlTt969/PftZDCoV3+GjAgMItKvP/N+vnv48u3XX68f/5wWc8zRBoD/EdhCG3IcSOCAAbZgYIAMFgghhAYSyAYbaczAwoYbsqEhCxdiiOGHHHq4YYYcdogiiimamIAOCSQgQ4wzxriCjCvosMKNMtIYYwI89iikj0LWCKQKMcAAg/8KSi6pApNKQtmklE9KueSUUGaJJZM4vJDDl116+cKYOeDgAw5oflkmmWN6qWaYObip5ppijpnCDW/cgOcbceDZp55vBIonoHz6CSihfQo66J6J9mlDHXXcIcQdNlA6KaQ2CKGpEJFOWmmmd0DaKaWWdjrqp5fysAMPrO6wQw871MBqDzz0QKusrb4a66ysqqorrr36CiuuNNBABx1BFEuHHcfSkKyxxx777LLNBiGtssxKe62x2dJQhAJEEAGuuEQUYS4RQABRRLjhjguuueu2K2+87s5r7g9JIJFEEvj2+wO+QwyBhL768mvwv/gW3C+/BSt88L95OCExHng4gUf/xBFffMQRFE9c8cVOZOyxxRFPPDLIESthhBFMNKGEyka43AQTSjDR8sotv7yyzEyw7DLMTfjss84xK9GEHnpYobQVeuxhhdNI77FH004v3fTTTCdttdNVL6301VA/scQSVFDxxBNVVIG22FSovUQVZJuNttpux3122mxTYffca0uxxd9TTOH331xwMQUXfh8OuOB/b1H4FIsP3jjkWwQueeFgRPEFF19kHoXmYIDBReabg7F555+DLvrpnmt+Ouupdw5GF6FnQfvsXWThBRheeNFF7rXf/rvuvINhe+jDG0/78bgTL8YVXlwRxvRePH+FGNVfcX0Y0U/PvfXYd0/9//Pdi/+99s9DoQUU7GOBhRZavM/+
 Fe2v3/778a9vPxTuw2///v3Ln/sGSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTCMoQxnSMMa2vCGOMyhDnfIwx76EIb0AyD+5AcF+vFPiPCTHxLhx74lvo980hsf+rK3PfNRMXxRPF/5snjF2zFveLvrXfKUh7zchZGMzSPjF80YOs1xrnWyG50bTffG2IWOc3X83Bdel0fVSc5yjXsc4irHhcgF0nCGbFzlEuk4Lohtb3hzW9vEBrey3Y1uj7Qk3+IGSUwizf9rYMua1KgGSq5lrZRY89rXTKkHmOUMaEajmc2CNjRYzqyWOxPaK3dmtJJZ7GMYI9nGOvZLkoXMYifzZcWKiTInJGxfC0NYEgI2sHxB82HPPBjD9uUwf/3gW/IiF7zQpS52kUuc5wrnu9RpryIoC1nYqtY7ozWtblkLntyi57aoRQcaqKpXrhoWr2zFA2AFdFe1AuivgpUrgfLgUaeyVKjqkKlNRRRUopIUqTJlKo2iKlR3yhOjDEWoPIk0UI061EgVddJCFapLb2ITmcyEJhzEtE5yolOc5gQmmb4ASVHa0pSaFNQoPYmoVNLSlYzKpBcRyUg3kkGOdvTUHwWpRkb/KhKRgHQhFpXoQyFKw4hSBKIPeVVFGjprWVnwHwo1yEAIUpBbJdRWAVVoQnZ9a4Dyw577xIc/9AGsX/mKgfbshz+FHWx0zPMd7TiWsdcJj3cWKx7xnEcDwUHOb4ij2d80h7OdXU5ohwMa2uimNaxRDW5qIxvV5sY2uHltayWTmcpcBjK0pUxjMNMZ23KmtruNAGAGIxe62IUvfiFMX4jLlsAkt7hmQQtWvMKVq0xFumERC3bNchawaMUpTEFKUKCylKMApbxQAa95P/CRkMikJCdJyUrc65L40vcm9LUJfENiEIhkxCH+lYhC/msR/25EwBTRCAPc8Y95BGQg8mhwZ
 j8EEuEHSzgg4jhHOcABggxrgx3m+PCG17FhaqChGcZARjGAsQxhSOMZcKjGNEyM4mesghe76AUuXOELWuBYF70Ico4VcYpNdOIRmTDyKEphiiSHghGG8IQiHBEJRyC5Ep2osicCAQA7');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	padding: .8em .5em .4em .8em;
+	height: auto; /*height:1.8em;*/
+	font-size: 1em;
+	margin: 0;
+}
+
+.topNav {
+	background-image: url('data:image/gif;base64,R0lGODlhMgBwAOYAAAAAAP///z1bcT5ccj9dc0NieUBedERjekFfdUtthlZ6lTxbcT1ccjxbcD5dcz1ccTtZbUJieUFhdz9edD5dcjxZbjxabjtYbEZogEVmfkVnfkRlfENjekJieEBfdT9ecz1bbzxZbUZof0VmfURle0NjeUJhd0BfdD1abk5zjEtvh0pthUlrg0hqgURkek1xiUxviExwiEtuhklrglN5k1F2kFB1jk9zjE5xik5yiktthVJ2kFJ3kFF2j05xiVd9mFV6lVR5k1F1jld9l1Z7lVV6lFqAm1l/mVh9mFh+mFqAml2DnluAm1uBm1p/mV2DnWGIo2CGoV+FoF+Fn16Dnl6Enl2CnGKIo2KJo2GHomGIomCFoGCGoGKHomKIomGGoWGHoWOIo2OJozxbb0VofzxbbjtZbEZpgDxabUhrgkJid0Fhdklsg0hrgTxZbE5ziz1abU90jElrgUhqgFN5klB1jVR6k1F2jll/mFqAmVyCm12DnP///wAAAAAAAAAAACH5BAEAAHwALAAAAAAyAHAAAAf/gGYhgmaFgiGIg4OEi4WJiISGkIuNh4mWgheGbpOWipqFnJchoI+ToGZuFhUQrK2trrAQs6+vFbG1rLe5s7quaMDAcCgoaCjDw8EhwcPFx8fMxMbB0c7DZWUg2iBj3Nnb2djb3N7j291j3+bo3wsLDe/wAg0P8A32C/Px+fT2/vz19t0DCI/BAAYPBgx4gPAgg4YLDyZc2PDhw4kME1bEWJEBAQoEHBD46ICCSAciKagcKZKkyZAnR5p82bLlzJMfDBjI+aFnzp0TJvTUuXOnT50fJhT1+bOp0aE7T0iVigDBCQ8IPEjValUr1a5Zp369alXsiapktUqQsMZEWxMm/9aumbtGTdy5buHGZUs3L1y5btu+3Tu3Q4QIJQp0KHF4MWLEHQwjVsw
 4gmPGiR1bnjxZs2MXB0qI5uCiBIcDHEq4cJG6tGjTpU+3fk3adOjXo2OjLrGBhO/evUlsGA5cuG/jwYknN858efLhGTKMGCE9unUN0bFn0DC9uvXt0qlTt969/PftZDCoV3+GjAgMItKvP/N+vnv48u3XX68f/5wWc8zRBoD/EdhCG3IcSOCAAbZgYIAMFgghhAYSyAYbaczAwoYbsqEhCxdiiOGHHHq4YYYcdogiiimamIAOCSQgQ4wzxriCjCvosMKNMtIYYwI89iikj0LWCKQKMcAAg/8KSi6pApNKQtmklE9KueSUUGaJJZM4vJDDl116+cKYOeDgAw5oflkmmWN6qWaYObip5ppijpnCDW/cgOcbceDZp55vBIonoHz6CSihfQo66J6J9mlDHXXcIcQdNlA6KaQ2CKGpEJFOWmmmd0DaKaWWdjrqp5fysAMPrO6wQw871MBqDzz0QKusrb4a66ysqqorrr36CiuuNNBABx1BFEuHHcfSkKyxxx777LLNBiGtssxKe62x2dJQhAJEEAGuuEQUYS4RQABRRLjhjguuueu2K2+87s5r7g9JIJFEEvj2+wO+QwyBhL768mvwv/gW3C+/BSt88L95OCExHng4gUf/xBFffMQRFE9c8cVOZOyxxRFPPDLIESthhBFMNKGEyka43AQTSjDR8sotv7yyzEyw7DLMTfjss84xK9GEHnpYobQVeuxhhdNI77FH004v3fTTTCdttdNVL6301VA/scQSVFDxxBNVVIG22FSovUQVZJuNttpux3122mxTYffca0uxxd9TTOH331xwMQUXfh8OuOB/b1H4FIsP3jjkWwQueeFgRPEFF19kHoXmYIDBReabg7F555+DLvrpnmt+Ouupdw5GF6FnQfvsXWThBRheeNFF7rXf/rvuvINhe+jDG0/78bgTL8YVXlwRxvRePH+FGNVfcX0Y0U/PvfXYd0/9//Pdi/+99s9DoQUU7GOBhRZavM/+
 Fe2v3/778a9vPxTuw2///v3Ln/sGSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTCMoQxnSMMa2vCGOMyhDnfIwx76EIb0AyD+5AcF+vFPiPCTHxLhx74lvo980hsf+rK3PfNRMXxRPF/5snjF2zFveLvrXfKUh7zchZGMzSPjF80YOs1xrnWyG50bTffG2IWOc3X83Bdel0fVSc5yjXsc4irHhcgF0nCGbFzlEuk4Lohtb3hzW9vEBrey3Y1uj7Qk3+IGSUwizf9rYMua1KgGSq5lrZRY89rXTKkHmOUMaEajmc2CNjRYzqyWOxPaK3dmtJJZ7GMYI9nGOvZLkoXMYifzZcWKiTInJGxfC0NYEgI2sHxB82HPPBjD9uUwf/3gW/IiF7zQpS52kUuc5wrnu9RpryIoC1nYqtY7ozWtblkLntyi57aoRQcaqKpXrhoWr2zFA2AFdFe1AuivgpUrgfLgUaeyVKjqkKlNRRRUopIUqTJlKo2iKlR3yhOjDEWoPIk0UI061EgVddJCFapLb2ITmcyEJhzEtE5yolOc5gQmmb4ASVHa0pSaFNQoPYmoVNLSlYzKpBcRyUg3kkGOdvTUHwWpRkb/KhKRgHQhFpXoQyFKw4hSBKIPeVVFGjprWVnwHwo1yEAIUpBbJdRWAVVoQnZ9a4Dyw577xIc/9AGsX/mKgfbshz+FHWx0zPMd7TiWsdcJj3cWKx7xnEcDwUHOb4ij2d80h7OdXU5ohwMa2uimNaxRDW5qIxvV5sY2uHltayWTmcpcBjK0pUxjMNMZ23KmtruNAGAGIxe62IUvfiFMX4jLlsAkt7hmQQtWvMKVq0xFumERC3bNchawaMUpTEFKUKCylKMApbxQAa95P/CRkMikJCdJyUrc65L40vcm9LUJfENiEIhkxCH+lYhC/msR/25EwBTRCAPc8Y95BGQg8mhwZ
 j8EEuEHSzgg4jhHOcABggxrgx3m+PCG17FhaqChGcZARjGAsQxhSOMZcKjGNEyM4mesghe76AUuXOELWuBYF70Ico4VcYpNdOIRmTDyKEphiiSHghGG8IQiHBEJRyC5Ep2osicCAQA7');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	float: left;
+	padding: 0;
+	width: 100%;
+	clear: right;
+	height: 2.8em;
+	padding-top: 10px;
+	overflow: hidden;
+}
+
+.bottomNav {
+	margin-top: 10px;
+	background-image: url('data:image/gif;base64,R0lGODlhMgBwAOYAAAAAAP///z1bcT5ccj9dc0NieUBedERjekFfdUtthlZ6lTxbcT1ccjxbcD5dcz1ccTtZbUJieUFhdz9edD5dcjxZbjxabjtYbEZogEVmfkVnfkRlfENjekJieEBfdT9ecz1bbzxZbUZof0VmfURle0NjeUJhd0BfdD1abk5zjEtvh0pthUlrg0hqgURkek1xiUxviExwiEtuhklrglN5k1F2kFB1jk9zjE5xik5yiktthVJ2kFJ3kFF2j05xiVd9mFV6lVR5k1F1jld9l1Z7lVV6lFqAm1l/mVh9mFh+mFqAml2DnluAm1uBm1p/mV2DnWGIo2CGoV+FoF+Fn16Dnl6Enl2CnGKIo2KJo2GHomGIomCFoGCGoGKHomKIomGGoWGHoWOIo2OJozxbb0VofzxbbjtZbEZpgDxabUhrgkJid0Fhdklsg0hrgTxZbE5ziz1abU90jElrgUhqgFN5klB1jVR6k1F2jll/mFqAmVyCm12DnP///wAAAAAAAAAAACH5BAEAAHwALAAAAAAyAHAAAAf/gGYhgmaFgiGIg4OEi4WJiISGkIuNh4mWgheGbpOWipqFnJchoI+ToGZuFhUQrK2trrAQs6+vFbG1rLe5s7quaMDAcCgoaCjDw8EhwcPFx8fMxMbB0c7DZWUg2iBj3Nnb2djb3N7j291j3+bo3wsLDe/wAg0P8A32C/Px+fT2/vz19t0DCI/BAAYPBgx4gPAgg4YLDyZc2PDhw4kME1bEWJEBAQoEHBD46ICCSAciKagcKZKkyZAnR5p82bLlzJMfDBjI+aFnzp0TJvTUuXOnT50fJhT1+bOp0aE7T0iVigDBCQ8IPEjValUr1a5Zp369alXsiapktUqQsMZEWxMm/9aumbtGTdy5buHGZUs3L1y5btu+3Tu3Q4QIJQp0KHF4MWLEHQwjVsw
 4gmPGiR1bnjxZs2MXB0qI5uCiBIcDHEq4cJG6tGjTpU+3fk3adOjXo2OjLrGBhO/evUlsGA5cuG/jwYknN858efLhGTKMGCE9unUN0bFn0DC9uvXt0qlTt969/PftZDCoV3+GjAgMItKvP/N+vnv48u3XX68f/5wWc8zRBoD/EdhCG3IcSOCAAbZgYIAMFgghhAYSyAYbaczAwoYbsqEhCxdiiOGHHHq4YYYcdogiiimamIAOCSQgQ4wzxriCjCvosMKNMtIYYwI89iikj0LWCKQKMcAAg/8KSi6pApNKQtmklE9KueSUUGaJJZM4vJDDl116+cKYOeDgAw5oflkmmWN6qWaYObip5ppijpnCDW/cgOcbceDZp55vBIonoHz6CSihfQo66J6J9mlDHXXcIcQdNlA6KaQ2CKGpEJFOWmmmd0DaKaWWdjrqp5fysAMPrO6wQw871MBqDzz0QKusrb4a66ysqqorrr36CiuuNNBABx1BFEuHHcfSkKyxxx777LLNBiGtssxKe62x2dJQhAJEEAGuuEQUYS4RQABRRLjhjguuueu2K2+87s5r7g9JIJFEEvj2+wO+QwyBhL768mvwv/gW3C+/BSt88L95OCExHng4gUf/xBFffMQRFE9c8cVOZOyxxRFPPDLIESthhBFMNKGEyka43AQTSjDR8sotv7yyzEyw7DLMTfjss84xK9GEHnpYobQVeuxhhdNI77FH004v3fTTTCdttdNVL6301VA/scQSVFDxxBNVVIG22FSovUQVZJuNttpux3122mxTYffca0uxxd9TTOH331xwMQUXfh8OuOB/b1H4FIsP3jjkWwQueeFgRPEFF19kHoXmYIDBReabg7F555+DLvrpnmt+Ouupdw5GF6FnQfvsXWThBRheeNFF7rXf/rvuvINhe+jDG0/78bgTL8YVXlwRxvRePH+FGNVfcX0Y0U/PvfXYd0/9//Pdi/+99s9DoQUU7GOBhRZavM/+
 Fe2v3/778a9vPxTuw2///v3Ln/sGSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTCMoQxnSMMa2vCGOMyhDnfIwx76EIb0AyD+5AcF+vFPiPCTHxLhx74lvo980hsf+rK3PfNRMXxRPF/5snjF2zFveLvrXfKUh7zchZGMzSPjF80YOs1xrnWyG50bTffG2IWOc3X83Bdel0fVSc5yjXsc4irHhcgF0nCGbFzlEuk4Lohtb3hzW9vEBrey3Y1uj7Qk3+IGSUwizf9rYMua1KgGSq5lrZRY89rXTKkHmOUMaEajmc2CNjRYzqyWOxPaK3dmtJJZ7GMYI9nGOvZLkoXMYifzZcWKiTInJGxfC0NYEgI2sHxB82HPPBjD9uUwf/3gW/IiF7zQpS52kUuc5wrnu9RpryIoC1nYqtY7ozWtblkLntyi57aoRQcaqKpXrhoWr2zFA2AFdFe1AuivgpUrgfLgUaeyVKjqkKlNRRRUopIUqTJlKo2iKlR3yhOjDEWoPIk0UI061EgVddJCFapLb2ITmcyEJhzEtE5yolOc5gQmmb4ASVHa0pSaFNQoPYmoVNLSlYzKpBcRyUg3kkGOdvTUHwWpRkb/KhKRgHQhFpXoQyFKw4hSBKIPeVVFGjprWVnwHwo1yEAIUpBbJdRWAVVoQnZ9a4Dyw577xIc/9AGsX/mKgfbshz+FHWx0zPMd7TiWsdcJj3cWKx7xnEcDwUHOb4ij2d80h7OdXU5ohwMa2uimNaxRDW5qIxvV5sY2uHltayWTmcpcBjK0pUxjMNMZ23KmtruNAGAGIxe62IUvfiFMX4jLlsAkt7hmQQtWvMKVq0xFumERC3bNchawaMUpTEFKUKCylKMApbxQAa95P/CRkMikJCdJyUrc65L40vcm9LUJfENiEIhkxCH+lYhC/msR/25EwBTRCAPc8Y95BGQg8mhwZ
 j8EEuEHSzgg4jhHOcABggxrgx3m+PCG17FhaqChGcZARjGAsQxhSOMZcKjGNEyM4mesghe76AUuXOELWuBYF70Ico4VcYpNdOIRmTDyKEphiiSHghGG8IQiHBEJRyC5Ep2osicCAQA7');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	float: left;
+	padding: 0;
+	width: 100%;
+	clear: right;
+	height: 2.8em;
+	padding-top: 10px;
+	overflow: hidden;
+}
+
+.subNav {
+	background-color: #dee3e9;
+	border-bottom: 1px solid #9eadc0;
+	float: left;
+	width: 100%;
+	overflow: hidden;
+}
+
+.subNav div {
+	clear: left;
+	float: left;
+	padding: 0 0 5px 6px;
+}
+
+ul.navList,
+ul.subNavList {
+	float: left;
+	margin: 0 25px 0 0;
+	padding: 0;
+}
+
+ul.navList li {
+	list-style: none;
+	float: left;
+	padding: 3px 6px;
+}
+
+ul.subNavList li {
+	list-style: none;
+	float: left;
+	font-size: 90%;
+}
+
+.topNav a:link,
+.topNav a:active,
+.topNav a:visited,
+.bottomNav a:link,
+.bottomNav a:active,
+.bottomNav a:visited {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+.topNav a:hover,
+.bottomNav a:hover {
+	text-decoration: none;
+	color: #bb7a2a;
+}
+
+.navBarCell1Rev {
+	background-image: url('data:image/gif;base64,R0lGODlhAwAeANUAAAAAAP///9+VNfChOu+gOeKXNr58Kr18Krp6KbZ3KMyGLr9+K7t6Krh4KbZ3KdKKMM+IL8yGL8mELsiDLsWBLcWCLcKALLl4KtKLMd+UNdyRNNmPM9WNMvCgOuqcOOaZN+WYN+KWNtqQNPGhO+yeOuucOeeaOPOiPP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACgALAAAAAADAB4AAAZAwJNwMBoQOgSS0lPymJ4f0CdUCGUEGY12I9pwvpgHBkJWRBQTyaRCqVjei/jBcGAgGI1LI+FI5Pd9f3x+eoJ9QQA7');
+	background-color: #a88834;
+	color: #ffffff;
+	margin: auto 5px;
+	border: 1px solid #c9aa44;
+}
+/*
+Page header and footer styles
+*/
+.header,
+.footer {
+	clear: both;
+	margin: 0 20px;
+	padding: 5px 0 0 0;
+}
+
+.indexHeader {
+	margin: 10px;
+	position: relative;
+}
+
+.indexHeader h1 {
+	font-size: 1.3em;
+}
+
+.title {
+	color: #2c4557;
+	margin: 10px 0;
+}
+
+.subTitle {
+	margin: 5px 0 0 0;
+}
+
+.header ul {
+	margin: 0 0 25px 0;
+	padding: 0;
+}
+
+.footer ul {
+	margin: 20px 0 5px 0;
+}
+
+.header ul li/*,
+.footer ul li*/ {
+	list-style: none;
+	font-size: 1.2em;
+}
+/*
+Heading styles
+*/
+div.details ul.blockList ul.blockList ul.blockList li.blockList h4,
+div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
+	background-color: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	margin: 0 0 6px -8px;
+	padding: 2px 5px;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+	background-color: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	margin: 0 0 6px -8px;
+	padding: 2px 5px;
+}
+
+ul.blockList ul.blockList li.blockList h3 {
+	padding: 0;
+	margin: 15px 0;
+}
+
+ul.blockList li.blockList h2 {
+	padding: 0px 0 20px 0;
+}
+/*
+Page layout container styles
+*/
+.contentContainer,
+.sourceContainer,
+.classUseContainer,
+.serializedFormContainer,
+.constantValuesContainer {
+	clear: both;
+	padding: 10px 20px;
+	position: relative;
+}
+
+.indexContainer {
+	margin: 10px;
+	position: relative;
+	font-size: 1.0em;
+}
+
+.indexContainer h2 {
+	font-size: 1.1em;
+	padding: 0 0 3px 0;
+}
+
+.indexContainer ul {
+	margin: 0;
+	padding: 0;
+}
+
+.indexContainer ul li {
+	list-style: none;
+}
+
+.contentContainer .description dl dt,
+.contentContainer .details dl dt,
+.serializedFormContainer dl dt {
+	font-size: 1.1em;
+	font-weight: bold;
+	margin: 10px 0 0 0;
+	color: #4e4e4e;
+}
+
+.contentContainer .description dl dd,
+.contentContainer .details dl dd,
+.serializedFormContainer dl dd {
+	margin: 10px 0 10px 20px;
+}
+
+.serializedFormContainer dl.nameValue dt {
+	margin-left: 1px;
+	font-size: 1.1em;
+	display: inline;
+	font-weight: bold;
+}
+
+.serializedFormContainer dl.nameValue dd {
+	margin: 0 0 0 1px;
+	font-size: 1.1em;
+	display: inline;
+}
+/*
+List styles
+*/
+ul.horizontal li {
+	display: inline;
+	font-size: 0.9em;
+}
+
+ul.inheritance {
+	margin: 0;
+	padding: 0;
+}
+
+ul.inheritance li {
+	display: inline;
+	list-style: none;
+}
+
+ul.inheritance li ul.inheritance {
+	margin-left: 15px;
+	padding-left: 15px;
+	padding-top: 1px;
+}
+
+ul.blockList,
+ul.blockListLast {
+	margin: 10px 0 10px 0;
+	padding: 0;
+}
+
+ul.blockList li.blockList,
+ul.blockListLast li.blockList {
+	list-style: none;
+	margin-bottom: 25px;
+}
+
+ul.blockList ul.blockList li.blockList,
+ul.blockList ul.blockListLast li.blockList {
+	padding: 0px 20px 5px 10px;
+	border: 1px solid #9eadc0;
+	background-color: #f9f9f9;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList,
+ul.blockList ul.blockList ul.blockListLast li.blockList {
+	padding: 0 0 5px 8px;
+	background-color: #ffffff;
+	border: 1px solid #9eadc0;
+	border-top: none;
+}
+
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
+	margin-left: 0;
+	padding-left: 0;
+	padding-bottom: 15px;
+	border: none;
+	border-bottom: 1px solid #9eadc0;
+}
+
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
+	list-style: none;
+	border-bottom: none;
+	padding-bottom: 0;
+}
+
+table tr td dl,
+table tr td dl dt,
+table tr td dl dd {
+	margin-top: 0;
+	margin-bottom: 1px;
+}
+/*
+Table styles
+*/
+.contentContainer table,
+.classUseContainer table,
+.constantValuesContainer table {
+	border-bottom: 1px solid #9eadc0;
+	width: 100%;
+}
+
+.contentContainer ul li table,
+.classUseContainer ul li table,
+.constantValuesContainer ul li table {
+	width: 100%;
+}
+
+.contentContainer .description table,
+.contentContainer .details table {
+	border-bottom: none;
+}
+
+.contentContainer ul li table th.colOne,
+.contentContainer ul li table th.colFirst,
+.contentContainer ul li table th.colLast,
+.classUseContainer ul li table th,
+.constantValuesContainer ul li table th,
+.contentContainer ul li table td.colOne,
+.contentContainer ul li table td.colFirst,
+.contentContainer ul li table td.colLast,
+.classUseContainer ul li table td,
+.constantValuesContainer ul li table td {
+	vertical-align: top;
+	padding-right: 20px;
+}
+
+.contentContainer ul li table th.colLast,
+.classUseContainer ul li table th.colLast,
+.constantValuesContainer ul li table th.colLast,
+.contentContainer ul li table td.colLast,
+.classUseContainer ul li table td.colLast,
+.constantValuesContainer ul li table td.colLast,
+.contentContainer ul li table th.colOne,
+.classUseContainer ul li table th.colOne,
+.contentContainer ul li table td.colOne,
+.classUseContainer ul li table td.colOne {
+	padding-right: 3px;
+}
+
+.overviewSummary caption,
+.packageSummary caption,
+.contentContainer ul.blockList li.blockList caption,
+.summary caption,
+.classUseContainer caption,
+.constantValuesContainer caption {
+	position: relative;
+	text-align: left;
+	background-repeat: no-repeat;
+	color: #ffffff;
+	font-weight: bold;
+	clear: none;
+	overflow: hidden;
+	padding: 0px;
+	margin: 0px;
+}
+
+caption a:link,
+caption a:hover,
+caption a:active,
+caption a:visited {
+	color: #ffffff;
+}
+
+.overviewSummary caption span,
+.packageSummary caption span,
+.contentContainer ul.blockList li.blockList caption span,
+.summary caption span,
+.classUseContainer caption span,
+.constantValuesContainer caption span {
+	white-space: nowrap;
+	padding-top: 8px;
+	padding-left: 8px;
+	display: block;
+	float: left;
+	background-image: url(resources/titlebar.gif);
+	height: 18px;
+}
+
+.overviewSummary .tabEnd,.packageSummary .tabEnd,
+.contentContainer ul.blockList li.blockList .tabEnd,
+.summary .tabEnd,
+.classUseContainer .tabEnd,
+.constantValuesContainer .tabEnd {
+	width: 10px;
+	background-image: url('data:image/gif;base64,R0lGODlhEwAoAOYAAAAAAP////CgOe6fON+VNfChOu+gOeKXNvGiO+2fOtqOML58Kr17Kr18Krt6Kbp6KbZ2KLZ3KNuPMdqOMdqPMcyFLsyGLsiDLcOALMB+K799K79+K758K7t6Krh3Kbh4KbZ3KdKKMNKLMM+IL8yGL8mELsiDLsiELsaCLcWBLcWCLcJ/LMKALLl4Krh4KtKLMc+JMOWYNuOXNt+UNdyRNNmPM9WNMvCgOuqcOOibOOaYN+aZN+WYN+KWNt2SNdqQNNmQNNWOM/GhO/CgO+2eOuyeOuucOeudOeqcOeeaOPOiPN2VP92XQd+bSOezd+i1evnt4Pvy6v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAFIALAAAAAATACgAAAf/gBQTCoQUChSGgoVNT1EBSpCRkpNDOkxQBQUICEIFnZ6ZnJkFO04GBpk3BqqrpwWqAgUDS0UJtkW4ubUJuLZECjhIR0dGOMXGwcTGSEgUSTlJ0dLS0NE50BM7PNs82jve3NoxPBQ9Mj09B+no6ufq5j0SM/MzBPXz9vj3BBI0PjQAAwb8N5CGghoIa/xQiHBhwxpAgNSgYCOIRRsYM1YMojHIhBcvQogMCTJESZMiTE4YAaPliJcwWcJ4OXMEBQsVSOi0QMICT5w7dZJQYKLEiRMlippQajRpiQsnJKhAQTWFCqtXp6KwuhXFBBYYWIgdOzasWAwrMEzYoCFDhg1wruOyfbvhbQYKDRowYLCgQV+/efnmbcBBQocHDhw8ONyBMeLFDyJT+OD
 iw4cWly1jroz5socJESJAgAAiQmnToUmHBgFicuXMnTdn9gxatOrTp1Wbbk1Z82zZsT+nvr06NW7erzHH7h18Qm/YvjlrFm67NG7jq5H7Xi6d9nDrxUUfd709+m/qo8GjFp+dPPTM3VugJ75eN2v3ys03/74+93hEiEwgSIAACijBIBQEAgA7');
+	background-repeat: no-repeat;
+	background-position: top right;
+	position: relative;
+	float: left;
+}
+
+ul.blockList ul.blockList li.blockList table {
+	margin: 0 0 12px 0px;
+	width: 100%;
+}
+
+.tableSubHeadingColor {
+	background-color: #EEEEFF;
+}
+
+.altColor {
+	background-color: #eeeeef;
+}
+
+.rowColor {
+	background-color: #ffffff;
+}
+
+.overviewSummary td,
+.packageSummary td,
+.contentContainer ul.blockList li.blockList td,
+.summary td,
+.classUseContainer td,.constantValuesContainer td {
+	text-align: left;
+	padding: 3px 3px 3px 7px;
+}
+
+th.colFirst,
+th.colLast,
+th.colOne,
+.constantValuesContainer th {
+	background: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	text-align: left;
+	padding: 3px 3px 3px 7px;
+}
+
+td.colOne a:link,
+td.colOne a:active,
+td.colOne a:visited,
+td.colOne a:hover,
+td.colFirst a:link,
+td.colFirst a:active,
+td.colFirst a:visited,
+td.colFirst a:hover,
+td.colLast a:link,
+td.colLast a:active,
+td.colLast a:visited,
+td.colLast a:hover,
+.constantValuesContainer td a:link,
+.constantValuesContainer td a:active,
+.constantValuesContainer td a:visited,
+.constantValuesContainer td a:hover {
+	font-weight: bold;
+}
+
+td.colFirst,
+th.colFirst {
+	border-left: 1px solid #9eadc0;
+	white-space: nowrap;
+}
+
+td.colLast,
+th.colLast {
+	border-right: 1px solid #9eadc0;
+}
+
+td.colOne,
+th.colOne {
+	border-right: 1px solid #9eadc0;
+	border-left: 1px solid #9eadc0;
+}
+
+table.overviewSummary {
+	padding: 0px;
+	margin-left: 0px;
+}
+
+table.overviewSummary td.colFirst,
+table.overviewSummary th.colFirst,
+table.overviewSummary td.colOne,
+table.overviewSummary th.colOne {
+	width: 25%;
+	vertical-align: middle;
+}
+
+table.packageSummary td.colFirst,
+table.overviewSummary th.colFirst {
+	width: 25%;
+	vertical-align: middle;
+}
+/*
+Content styles
+*/
+.description pre {
+	margin-top: 0;
+}
+
+.deprecatedContent {
+	margin: 0;
+	padding: 10px 0;
+}
+
+.docSummary {
+	padding: 0;
+}
+
+/*
+Formatting effect styles
+*/
+.sourceLineNo {
+	color: green;
+	padding: 0 30px 0 0;
+}
+
+h1.hidden {
+	visibility: hidden;
+	overflow: hidden;
+	font-size: .9em;
+}
+
+.block {
+	display: block;
+	margin: 0px;
+}
+
+.strong {
+	font-weight: bold;
+}
+
+/*--- Juno-specific styles --------------------------------------------------*/
+
+property {
+	font-size: 9pt;
+	font-family: monospace;
+	font-weight: bold;
+}
+
+/*--- Bordered code ---*/
+p.bcode {
+	font-size: 9pt;
+	white-space: pre;
+	border: 1px solid black;
+	margin: 0px 20px;
+	border-radius: 10px;
+	overflow: hidden;
+	font-family: monospace;
+	background-color: #f8f8f8;
+	border-color: #cccccc;
+	-moz-tab-size: 3;
+	tab-size: 3;
+	-o-tab-size: 3;
+}
+
+.fixedWidth {
+	max-width: 800px;
+}
+
+/* Override padding bottom in javadoc comments. */
+.blockList p.bcode {
+	padding-bottom: 0px !important;
+}
+
+/*--- Unbordered code ---*/
+p.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+	padding-bottom: 15px;
+	margin: -15px;
+}
+
+td.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+table.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+/*--- Java code effects ---*/
+jc,jd,jt,jk,js,jf,jsf,jsm,ja {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+/* Comment */
+jc {
+	color: green;
+}
+/* Javadoc comment */
+jd {
+	color: #3f5fbf;
+}
+/* Javadoc tag */
+jt {
+	color: #7f9fbf;
+	font-weight: bold;
+}
+/* Primitive */
+jk {
+	color: #7f0055;
+	font-weight: bold;
+}
+/* String */
+js {
+	color: blue;
+}
+/* Field */
+jf {
+	color: blue;
+}
+/* Static field */
+jsf {
+	color: blue;
+	font-style: italic;
+}
+/* Static method */
+jsm {
+	font-style: italic;
+}
+/* Annotation */
+ja {
+	color: grey;
+}
+
+/*--- XML code effects ---*/
+xt,xa,xc,xs {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+xt {
+	color: DarkCyan;
+}
+
+xa {
+	color: purple;
+}
+
+xc {
+	color: mediumblue;
+}
+
+xs {
+	color: blue;
+	font-style: italic;
+}
+
+/*--- Override formatting on <table class='styled'> ---*/
+table.styled,.contentContainer .description table.styled,.contentContainer ul li table.styled,ul.blockList ul.blockList li.blockList table.styled
+	{
+	padding: 0px;
+	position: relative;
+	font-size: 1.1em;
+	width: auto;
+	border: 1px solid #9eadc0;
+	margin-left: 20px;
+	margin-right: 20px;
+	border-collapse: collapse;
+}
+
+table.styled th {
+	background-color: #dee3e9;
+	border: 1px solid #9eadc0;
+	padding: 3px 10px 3px 10px;
+}
+
+table.styled td {
+	padding: 3px;
+}
+
+table.styled ul {
+	padding: 0px 10px;
+}
+
+table.styled tr:nth-child(1) {
+	background-color: #dee3e9;
+}
+
+table.styled tr:nth-child(2n+2) {
+	background-color: #eeeeef;
+}
+
+table.styled tr:nth-child(2n+3) {
+	background-color: white;
+}
+
+/* Same as r1 except with a border on the bottom */
+table.styled tr.bb {
+	border-bottom: 1px solid #9eadc0
+}
+
+table.styled tr.light {
+	background-color: white !important;
+}
+
+table.styled tr.dark {
+	background-color: #eeeeef !important;
+}
+
+/*--- Juno topic headers ---*/
+h2.topic,
+h3.topic,
+h4.topic {
+	margin-bottom: 20px;
+	margin-top: 25px;
+	padding-top: 3px;
+	padding-left: 25px;
+	color: #2c4557;
+	border-top: 2px groove #9eadc0;
+	background-image: url('data:image/gif;base64,R0lGODlhEAAQAIQfACZJcSdKcjFTejVWfT5fhUFih0ZnjEhojUxskFFwk1Z0l1d1mFp4ml98nmaComiEpGuHpnKNq3SOrHiRroGZtYeeuJGmv5erwp+yx6O1yqm6zrDA0sTQ3s3X4+Dn7v///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAB8ALAAAAAAQABAAAAVk4CeOZGmWgmEQG/k0MHw4UY0gY1PvfG3kvaBhUqk4IMgkcuGrdJ7QaCfDiBgunKx2m1VYP5KNeEze0H4VjHrNVh9+HodlTq9bEr9PhMLv+ykOAyIaNEE8ACMFiouMigEnkJGQIQA7');
+	background-repeat: no-repeat;
+	background-position: left center;
+}
+
+h2.closed,
+h3.closed,
+h4.closed {
+	background-image: url('data:image/gif;base64,R0lGODlhEAAQAIQYADNVfDhagUNkiUZnjEhojUxskE9vklFwlFd1mF17nWJ/oGaCo2+KqXKNq3aQrX2WsoGZtYObtoeeuJKowJ2wxqm6zrbF1sTQ3v///////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAB8ALAAAAAAQABAAAAVi4CeOZGmST6EGpLK8cNHMi6GI8qzvcyEikqBwGByIIJekcpmEiByWqHQadYgYlax2m2WIFpSweBxeiBKTtHqdTvwi8LgcjhAdHPi8Hn8QERiAgYKABCIAAoiJiogAJ46PjiEAOw==') !important;
+}
+
+div.topic {
+	margin-left: 10px;
+}
+
+h5.topic,
+h6.topic {
+	margin-bottom: 10px;
+	margin-top: 20px;
+	color: #2c4557;
+	text-decoration: underline;
+}
+
+h6 {
+	margin: 10px 0px;
+}
+
+h6.figure {
+	color: #2c4557;
+	margin-left: 30px;
+	margin-right: 30px;
+	margin-top: 10px;
+	margin-bottom: 0px;
+	font-style: italic;
+}
+
+/*--- Override how Javadoc handles unordered lists inside .footer ---*/
+ul.normal {
+	margin-top: 0px;
+}
+
+ul.normal li {
+	font-size: 100%;
+	list-style: disc;
+}
+
+/*--- Bordered images ---*/
+.bordered {
+	border: 1px solid #cccccc;
+	margin: 0px 20px;
+	border-radius: 10px;
+}
+
+.padded {
+	padding-left: 20px;
+	padding-right: 20px;
+}
+
+/*--- Rows with bottom borders ---*/
+tr.borderbottom td {
+	border-bottom: 1px solid #9eadc0
+}
+
+/* Article links */
+a.doclink {
+	font-weight: bold;
+}
+
+.nomargin {
+	margin: 0px;
+}
+
+ol.toc,
+ul.toc,
+.toc ol,
+.toc ul {
+	background: #dee3e9;
+	margin: 0px;
+	padding: 0px;
+}
+
+ul.toc,
+.toc ul {
+	list-style: disc;
+}
+
+ol.toc p,
+ul.toc p,
+.toc ol p,
+.toc ul p,
+ol.toc div,
+ul.toc div,
+.toc ol div,
+.toc ul div {
+	color: #353833;
+	font: normal 1em Arial, Helvetica, sans-serif;
+	font-size: 1em;
+	padding-bottom: 5px;
+	margin: 0px;
+}
+
+.toc li {
+	background: #FFFFFF;
+	margin-left: 30px;
+	padding-left: 5px;
+}
+
+/* Linear gradients */
+
+/* Light-colored background headers */
+h5.toc,
+h6.toc, 
+h2.title,
+div.docSummary > div.block,
+div.contentContainer > div.block > p:first-child {
+	background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
+	background: -moz-linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
+	background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9) );
+}
+
+/* Dark-colored background headers */
+div.header > div.subTitle > div.block,
+div.footer > div.subTitle > div.block > p:first-child, 
+h1.title,
+div.contentContainer > h2:first-of-type,
+body > p:first-child {
+	background: linear-gradient(to bottom, #3B596D, #6289A3) repeat scroll 0% 0% transparent;
+	background: -moz-linear-gradient(to bottom, #3B596D, #6289A3) repeat scroll 0% 0% transparent;
+	background: -webkit-gradient(linear, left top, left bottom, from(#3B596D), to(#6289A3) );
+}
+
+/* Header styles */
+
+h5.toc,
+h6.toc {
+	color: #2C4557;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px 15px 15px 0px;
+	text-decoration: none;
+}
+
+/* Light-colored title on package summary pages */
+div.docSummary > div.block,
+div.contentContainer > div.block > p:first-child {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: #2C4557;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 0px 0px 15px 15px;
+	text-decoration: none;
+}
+
+/* Dark-colored title on overview page */
+div.header > div.subTitle > div.block,
+div.footer > div.subTitle > div.block > p:first-child,
+body > p:first-child {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: white;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px;
+	text-decoration: none;
+}
+
+/* Dark-colored package title on package summary pages */
+h1.title,
+div.contentContainer > h2:first-of-type {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: white;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px 15px 0px 0px;
+	text-decoration: none;
+}
+
+/* Class titles */
+h2.title {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: #2C4557;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px;
+	text-decoration: none;
+}
+
+
+.spaced-list li { padding:5px; }
+.footer .spaced-list ul { margin:0 }


[26/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.java
new file mode 100755
index 0000000..a52a9ca
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Feed.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.URI;
+import java.util.*;
+
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Top-level ATOM feed object.
+ * <p>
+ *  	Represents an <code>atomFeed</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomFeed =
+ * 		element atom:feed {
+ * 			atomCommonAttributes,
+ * 			(atomAuthor*
+ * 			 & atomCategory*
+ * 			 & atomContributor*
+ * 			 & atomGenerator?
+ * 			 & atomIcon?
+ * 			 & atomId
+ * 			 & atomLink*
+ * 			 & atomLogo?
+ * 			 & atomRights?
+ * 			 & atomSubtitle?
+ * 			 & atomTitle
+ * 			 & atomUpdated
+ * 			 & extensionElement*),
+ * 			atomEntry*
+ * 		}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="feed")
+@SuppressWarnings("hiding")
+public class Feed extends CommonEntry {
+
+	private Generator generator;  // atomGenerator?
+	private Icon icon;            // atomIcon?
+	private Logo logo;            // atomLogo?
+	private Text subtitle;        // atomSubtitle?
+	private List<Entry> entries;  // atomEntry*
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param id The feed identifier.
+	 * @param title The feed title.
+	 * @param updated The feed updated timestamp.
+	 */
+	public Feed(Id id, Text title, Calendar updated) {
+		super(id, title, updated);
+	}
+
+	/** Bean constructor. */
+	public Feed() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns generator information on this feed.
+	 *
+	 * @return The generator information on this feed.
+	 */
+	public Generator getGenerator() {
+		return generator;
+	}
+
+	/**
+	 * Sets the generator information on this feed.
+	 *
+	 * @param generator The generator information on this feed.
+	 * @return This object (for method chaining).
+	 */
+	public Feed setGenerator(Generator generator) {
+		this.generator = generator;
+		return this;
+	}
+
+	/**
+	 * Returns the feed icon.
+	 *
+	 * @return The feed icon.
+	 */
+	public Icon getIcon() {
+		return icon;
+	}
+
+	/**
+	 * Sets the feed icon.
+	 *
+	 * @param icon The feed icon.
+	 * @return This object (for method chaining).
+	 */
+	public Feed setIcon(Icon icon) {
+		this.icon = icon;
+		return this;
+	}
+
+	/**
+	 * Returns the feed logo.
+	 *
+	 * @return The feed logo.
+	 */
+	public Logo getLogo() {
+		return logo;
+	}
+
+	/**
+	 * Sets the feed logo.
+	 *
+	 * @param logo The feed logo.
+	 * @return This object (for method chaining).
+	 */
+	public Feed setLogo(Logo logo) {
+		this.logo = logo;
+		return this;
+	}
+
+	/**
+	 * Returns the feed subtitle.
+	 *
+	 * @return The feed subtitle.
+	 */
+	@BeanProperty(name="subtitle")
+	public Text getSubTitle() {
+		return subtitle;
+	}
+
+	/**
+	 * Sets the feed subtitle.
+	 *
+	 * @param subtitle The feed subtitle.
+	 * @return This object (for method chaining).
+	 */
+	@BeanProperty(name="subtitle")
+	public Feed setSubTitle(Text subtitle) {
+		this.subtitle = subtitle;
+		return this;
+	}
+
+	/**
+	 * Returns the entries in the feed.
+	 *
+	 * @return The entries in the feed.
+	 */
+	@Xml(format=COLLAPSED)
+	public List<Entry> getEntries() {
+		return entries;
+	}
+
+	/**
+	 * Sets the entries in the feed.
+	 *
+	 * @param entries The entries in the feed.
+	 * @return This object (for method chaining).
+	 */
+	public Feed setEntries(List<Entry> entries) {
+		this.entries = entries;
+		return this;
+	}
+
+	/**
+	 * Adds an entry to the list of entries in the feed.
+	 *
+	 * @param entries The entries to add to the list of entries in the feed.s
+	 * @return This object (for method chaining).
+	 */
+	public Feed addEntries(Entry...entries) {
+		if (this.entries == null)
+			this.entries = new LinkedList<Entry>();
+		this.entries.addAll(Arrays.asList(entries));
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* CommonEntry */
+	public Feed setAuthors(List<Person> authors) {
+		super.setAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed addAuthors(Person...authors) {
+		super.addAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setCategories(List<Category> categories) {
+		super.setCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed addCategories(Category...categories) {
+		super.addCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setContributors(List<Person> contributors) {
+		super.setContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed addContributors(Person...contributors) {
+		super.addContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setId(Id id) {
+		super.setId(id);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setLinks(List<Link> links) {
+		super.setLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed addLinks(Link...links) {
+		super.addLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setRights(Text rights) {
+		super.setRights(rights);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setTitle(Text title) {
+		super.setTitle(title);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Feed setUpdated(Calendar updated) {
+		super.setUpdated(updated);
+		return this;
+	}
+
+	@Override /* Common */
+	public Feed setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Feed setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.class
new file mode 100755
index 0000000..ef7ebcd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.java
new file mode 100755
index 0000000..cffc6cf
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Generator.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomGenerator</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomGenerator = element atom:generator {
+ * 		atomCommonAttributes,
+ * 		attribute uri { atomUri }?,
+ * 		attribute version { text }?,
+ * 		text
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="generator")
+public class Generator extends Common {
+
+	private URI uri;
+	private String version;
+	private String text;
+
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param text The generator statement content.
+	 */
+	public Generator(String text) {
+		this.text = text;
+	}
+
+	/** Bean constructor. */
+	public Generator() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the URI of this generator statement.
+	 *
+	 * @return The URI of this generator statement.
+	 */
+	@Xml(format=ATTR)
+	public URI getUri() {
+		return uri;
+	}
+
+	/**
+	 * Sets the URI of this generator statement.
+	 *
+	 * @param uri The URI of this generator statement.
+	 * @return This object (for method chaining).
+	 */
+	public Generator setUri(URI uri) {
+		this.uri = uri;
+		return this;
+	}
+
+	/**
+	 * Returns the version of this generator statement.
+	 *
+	 * @return The version of this generator statement.
+	 */
+	@Xml(format=ATTR)
+	public String getVersion() {
+		return version;
+	}
+
+	/**
+	 * Sets the version of this generator statement.
+	 *
+	 * @param version The version of this generator statement.
+	 * @return This object (for method chaining).
+	 */
+	public Generator setVersion(String version) {
+		this.version = version;
+		return this;
+	}
+
+	/**
+	 * Returns the content of this generator statement.
+	 *
+	 * @return The content of this generator statement.
+	 */
+	@Xml(format=CONTENT)
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * Sets the content of this generator statement.
+	 *
+	 * @param text The content of this generator statement.
+	 * @return This object (for method chaining).
+	 */
+	public Generator setText(String text) {
+		this.text = text;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Generator setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Generator setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.class
new file mode 100755
index 0000000..af14484
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.java
new file mode 100755
index 0000000..abca1fb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Icon.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomIcon</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomIcon = element atom:icon {
+ * 		atomCommonAttributes,
+ * 		(atomUri)
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="icon")
+public class Icon extends Common {
+
+	private URI uri;
+
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param uri The URI of the icon.
+	 */
+	public Icon(URI uri) {
+		this.uri = uri;
+	}
+
+	/** Bean constructor. */
+	public Icon() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the URI of this icon.
+	 *
+	 * @return The URI of this icon.
+	 */
+	@Xml(format=CONTENT)
+	public URI getUri() {
+		return uri;
+	}
+
+	/**
+	 * Sets the URI of this icon.
+	 *
+	 * @param uri The URI of this icon.
+	 * @return This object (for method chaining).
+	 */
+	public Icon setUri(URI uri) {
+		this.uri = uri;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Icon setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Icon setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.class
new file mode 100755
index 0000000..5267792
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.java
new file mode 100755
index 0000000..fc678c8
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Id.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomId</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomId = element atom:id {
+ * 		atomCommonAttributes,
+ * 		(atomUri)
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="id")
+public class Id extends Common {
+
+	private String text;
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param text The id element contents.
+	 */
+	public Id(String text) {
+		this.text = text;
+	}
+
+	/** Bean constructor. */
+	public Id() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the content of this identifier.
+	 *
+	 * @return The content of this identifier.
+	 */
+	@Xml(format=CONTENT)
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * Sets the content of this identifier.
+	 *
+	 * @param text The content of this identifier.
+	 * @return This object (for method chaining).
+	 */
+	public Id setText(String text) {
+		this.text = text;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Id setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Id setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.class
new file mode 100755
index 0000000..403e056
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.java
new file mode 100755
index 0000000..fce86f5
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Link.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomLink</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomLink =
+ * 		element atom:link {
+ * 			atomCommonAttributes,
+ * 			attribute href { atomUri },
+ * 			attribute rel { atomNCName | atomUri }?,
+ * 			attribute type { atomMediaType }?,
+ * 			attribute hreflang { atomLanguageTag }?,
+ * 			attribute title { text }?,
+ * 			attribute length { text }?,
+ * 			undefinedContent
+ * 		}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="link")
+public class Link extends Common {
+
+	private String href;
+	private String rel;
+	private String type;
+	private String hreflang;
+	private String title;
+	private Integer length;
+
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param rel The rel of the link.
+	 * @param type The type of the link.
+	 * @param href The URI of the link.
+	 */
+	public Link(String rel, String type, String href) {
+		this.rel = rel;
+		this.type = type;
+		this.href = href;
+	}
+
+	/** Bean constructor. */
+	public Link() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the href of the target of this link.
+	 *
+	 * @return The href of the target of this link.
+	 */
+	@Xml(format=ATTR)
+	public String getHref() {
+		return href;
+	}
+
+	/**
+	 * Sets the href of the target of this link.
+	 *
+	 * @param href The href of the target of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setHref(String href) {
+		this.href = href;
+		return this;
+	}
+
+	/**
+	 * Returns the rel of this link.
+	 *
+	 * @return The rel of this link.
+	 */
+	@Xml(format=ATTR)
+	public String getRel() {
+		return rel;
+	}
+
+	/**
+	 * Sets the rel of this link.
+	 *
+	 * @param rel The rell of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setRel(String rel) {
+		this.rel = rel;
+		return this;
+	}
+
+	/**
+	 * Returns the content type of the target of this link.
+	 *
+	 * @return The content type of the target of this link.
+	 */
+	@Xml(format=ATTR)
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Sets the content type of the target of this link.
+	 * <p>
+	 * 	Must be one of the following:
+	 * <ul>
+	 * 	<li><js>"text"</js>
+	 * 	<li><js>"html"</js>
+	 * 	<li><js>"xhtml"</js>
+	 * 	<li><jk>null</jk> (defaults to <js>"text"</js>)
+	 * </ul>
+	 *
+	 * @param type The content type of the target of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setType(String type) {
+		this.type = type;
+		return this;
+	}
+
+	/**
+	 * Returns the language of the target of this link.
+	 *
+	 * @return The language of the target of this link.
+	 */
+	@Xml(format=ATTR)
+	public String getHreflang() {
+		return hreflang;
+	}
+
+	/**
+	 * Sets the language of the target of this link.
+	 *
+	 * @param hreflang The language of the target of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setHreflang(String hreflang) {
+		this.hreflang = hreflang;
+		return this;
+	}
+
+	/**
+	 * Returns the title of the target of this link.
+	 *
+	 * @return The title of the target of this link.
+	 */
+	@Xml(format=ATTR)
+	public String getTitle() {
+		return title;
+	}
+
+	/**
+	 * Sets the title of the target of this link.
+	 *
+	 * @param title The title of the target of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setTitle(String title) {
+		this.title = title;
+		return this;
+	}
+
+	/**
+	 * Returns the length of the contents of the target of this link.
+	 *
+	 * @return The length of the contents of the target of this link.
+	 */
+	@Xml(format=ATTR)
+	public Integer getLength() {
+		return length;
+	}
+
+	/**
+	 * Sets the length of the contents of the target of this link.
+	 *
+	 * @param length The length of the contents of the target of this link.
+	 * @return This object (for method chaining).
+	 */
+	public Link setLength(Integer length) {
+		this.length = length;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Link setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Link setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.class
new file mode 100755
index 0000000..1237f35
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.java
new file mode 100755
index 0000000..8e67d16
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Logo.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomLogo</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomLogo = element atom:logo {
+ * 		atomCommonAttributes,
+ * 		(atomUri)
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="logo")
+public class Logo extends Common {
+
+	private URI uri;
+
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param uri The URI of the logo.
+	 */
+	public Logo(URI uri) {
+		this.uri = uri;
+	}
+
+	/** Bean constructor. */
+	public Logo() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the URI of the logo.
+	 *
+	 * @return The URI of the logo.
+	 */
+	@Xml(format=CONTENT)
+	public URI getUri() {
+		return uri;
+	}
+
+	/**
+	 * Sets the URI of the logo.
+	 *
+	 * @param uri The URI of the logo.
+	 * @return This object (for method chaining).
+	 */
+	public Logo setUri(URI uri) {
+		this.uri = uri;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Logo setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Logo setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.class
new file mode 100755
index 0000000..65f7c15
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.java
new file mode 100755
index 0000000..e0aecaf
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Person.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import java.net.*;
+
+/**
+ * Represents an <code>atomPersonConstruct</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomPersonConstruct =
+ * 		atomCommonAttributes,
+ * 		(element atom:name { text }
+ * 		& element atom:uri { atomUri }?
+ * 		& element atom:email { atomEmailAddress }?
+ * 		& extensionElement*)
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class Person extends Common {
+
+	private String name;
+	private URI uri;
+	private String email;
+
+
+	/**
+	 * Normal constructor.
+	 *
+	 * @param name The name of the person.
+	 */
+	public Person(String name) {
+		this.name = name;
+	}
+
+	/** Bean constructor. */
+	public Person() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the name of the person.
+	 *
+	 * @return The name of the person.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Sets the name of the person.
+	 *
+	 * @param name The name of the person.
+	 * @return This object (for method chaining).
+	 */
+	public Person setName(String name) {
+		this.name = name;
+		return this;
+	}
+
+	/**
+	 * Returns the URI of the person.
+	 *
+	 * @return The URI of the person.
+	 */
+	public URI getUri() {
+		return uri;
+	}
+
+	/**
+	 * Sets the URI of the person.
+	 *
+	 * @param uri The URI of the person.
+	 * @return This object (for method chaining).
+	 */
+	public Person setUri(URI uri) {
+		this.uri = uri;
+		return this;
+	}
+
+	/**
+	 * Returns the email address of the person.
+	 *
+	 * @return The email address of the person.
+	 */
+	public String getEmail() {
+		return email;
+	}
+
+	/**
+	 * Sets the email address of the person.
+	 *
+	 * @param email The email address of the person.
+	 * @return This object (for method chaining).
+	 */
+	public Person setEmail(String email) {
+		this.email = email;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Person setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Person setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.class
new file mode 100755
index 0000000..0d8885b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.java
new file mode 100755
index 0000000..973e1cb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Source.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import java.net.*;
+import java.util.*;
+
+/**
+ * Represents an <code>atomSource</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomSource =
+ * 		element atom:source {
+ * 			atomCommonAttributes,
+ * 			(atomAuthor*
+ * 			& atomCategory*
+ * 			& atomContributor*
+ * 			& atomGenerator?
+ * 			& atomIcon?
+ * 			& atomId?
+ * 			& atomLink*
+ * 			& atomLogo?
+ * 			& atomRights?
+ * 			& atomSubtitle?
+ * 			& atomTitle?
+ * 			& atomUpdated?
+ * 			& extensionElement*)
+ * 		}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class Source extends CommonEntry {
+
+	private Generator generator;
+	private Icon icon;
+	private Logo logo;
+	private Text subtitle;
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the generator info of this source.
+	 *
+	 * @return The generator info of this source.
+	 */
+	public Generator getGenerator() {
+		return generator;
+	}
+
+	/**
+	 * Sets the generator info of this source.
+	 *
+	 * @param generator The generator info of this source.
+	 * @return This object (for method chaining).
+	 */
+	public Source setGenerator(Generator generator) {
+		this.generator = generator;
+		return this;
+	}
+
+	/**
+	 * Returns the icon of this source.
+	 *
+	 * @return The icon of this source.
+	 */
+	public Icon getIcon() {
+		return icon;
+	}
+
+	/**
+	 * Sets the icon of this source.
+	 *
+	 * @param icon The icon of this source.
+	 * @return This object (for method chaining).
+	 */
+	public Source setIcon(Icon icon) {
+		this.icon = icon;
+		return this;
+	}
+
+	/**
+	 * Returns the logo of this source.
+	 *
+	 * @return The logo of this source.
+	 */
+	public Logo getLogo() {
+		return logo;
+	}
+
+	/**
+	 * Sets the logo of this source.
+	 *
+	 * @param logo The logo of this source.
+	 * @return This object (for method chaining).
+	 */
+	public Source setLogo(Logo logo) {
+		this.logo = logo;
+		return this;
+	}
+
+	/**
+	 * Returns the subtitle of this source.
+	 *
+	 * @return The subtitle of this source.
+	 */
+	public Text getSubtitle() {
+		return subtitle;
+	}
+
+	/**
+	 * Sets the subtitle of this source.
+	 *
+	 * @param subtitle The subtitle of this source.
+	 * @return This object (for method chaining).
+	 */
+	public Source setSubtitle(Text subtitle) {
+		this.subtitle = subtitle;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* CommonEntry */
+	public Source setAuthors(List<Person> authors) {
+		super.setAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source addAuthors(Person...authors) {
+		super.addAuthors(authors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setCategories(List<Category> categories) {
+		super.setCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source addCategories(Category...categories) {
+		super.addCategories(categories);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setContributors(List<Person> contributors) {
+		super.setContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source addContributors(Person...contributors) {
+		super.addContributors(contributors);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setId(Id id) {
+		super.setId(id);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setLinks(List<Link> links) {
+		super.setLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source addLinks(Link...links) {
+		super.addLinks(links);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setRights(Text rights) {
+		super.setRights(rights);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setTitle(Text title) {
+		super.setTitle(title);
+		return this;
+	}
+
+	@Override /* CommonEntry */
+	public Source setUpdated(Calendar updated) {
+		super.setUpdated(updated);
+		return this;
+	}
+
+	@Override /* Common */
+	public Source setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Source setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text$TextContentHandler.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text$TextContentHandler.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text$TextContentHandler.class
new file mode 100755
index 0000000..2f9f6d1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text$TextContentHandler.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.class
new file mode 100755
index 0000000..1b067db
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.java
new file mode 100755
index 0000000..c884890
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/Text.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.atom;
+
+import static com.ibm.juno.core.xml.XmlUtils.*;
+import static com.ibm.juno.core.xml.annotation.XmlFormat.*;
+
+import java.net.*;
+
+import javax.xml.stream.*;
+
+import com.ibm.juno.core.xml.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents an <code>atomTextConstruct</code> construct in the RFC4287 specification.
+ * <p>
+ * <h6 class='figure'>Schema</h6>
+ * <p class='bcode'>
+ * 	atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct
+ *
+ * 	atomPlainTextConstruct =
+ * 		atomCommonAttributes,
+ * 		attribute type { "text" | "html" }?,
+ * 		text
+ *
+ * 	atomXHTMLTextConstruct =
+ * 		atomCommonAttributes,
+ * 		attribute type { "xhtml" },
+ * 		xhtmlDiv
+ *
+ * 	xhtmlDiv = element xhtml:div {
+ * 		(attribute * { text }
+ * 		| text
+ * 		| anyXHTML)*
+ * 	}
+ * </p>
+ * <p>
+ * 	Refer to {@link com.ibm.juno.core.dto.atom} for further information about ATOM support.
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class Text extends Common {
+
+	private String type;
+	String text;
+
+
+	/**
+	 * Normal content.
+	 *
+	 * @param type The content type of this content.
+	 * @param text The text of this content.
+	 */
+	public Text(String type, String text) {
+		this.type = type;
+		this.text = text;
+	}
+
+	/**
+	 * Normal content.
+	 *
+	 * @param text The text of this content.
+	 */
+	public Text(String text) {
+		this.text = text;
+	}
+
+	/** Bean constructor. */
+	public Text() {}
+
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Returns the content type of this content.
+	 *
+	 * @return The content type of this content.
+	 */
+	@Xml(format=ATTR)
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Sets the content type of this content.
+	 * <p>
+	 * 	Must be one of the following:
+	 * <ul>
+	 * 	<li><js>"text"</js>
+	 * 	<li><js>"html"</js>
+	 * 	<li><js>"xhtml"</js>
+	 * 	<li><jk>null</jk> (defaults to <js>"text"</js>)
+	 * </ul>
+	 *
+	 * @param type The content type of this content.
+	 * @return This object (for method chaining).
+	 */
+	public Text setType(String type) {
+		this.type = type;
+		return this;
+	}
+
+	/**
+	 * Returns the content of this content.
+	 *
+	 * @return The content of this content.
+	 */
+	@Xml(format=CONTENT, contentHandler=TextContentHandler.class)
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * Sets the content of this content.
+	 *
+	 * @param text The content of this content.
+	 * @return This object (for method chaining).
+	 */
+	public Text setText(String text) {
+		this.text = text;
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden setters (to simplify method chaining)
+	//--------------------------------------------------------------------------------
+
+	@Override /* Common */
+	public Text setBase(URI base) {
+		super.setBase(base);
+		return this;
+	}
+
+	@Override /* Common */
+	public Text setLang(String lang) {
+		super.setLang(lang);
+		return this;
+	}
+
+	/**
+	 * Specialized content handler for correctly handling XML element content based
+	 * 	on the <code>type</code> attribute of the element.
+	 * <p>
+	 * 	If the <code>type</code> attribute is <js>"xhtml"</js> the content is treated
+	 * 	as XML.  Otherwise, it's treated as plain text.
+	 */
+	public static class TextContentHandler implements XmlContentHandler<Text> {
+
+		@Override /* XmlContentHandler */
+		public void parse(XMLStreamReader r, Text text) throws Exception {
+			String type = text.type;
+			if (type != null && type.equals("xhtml"))
+				text.text = decode(readXmlContents(r).trim());
+			else
+				text.text = decode(r.getElementText().trim());
+		}
+
+		@Override /* XmlContentHandler */
+		public void serialize(XmlSerializerWriter w, Text text) throws Exception {
+			String type = text.type;
+			String content = text.text;
+			if (type != null && type.equals("xhtml"))
+				w.encodeTextInvalidChars(content);
+			else
+				w.encodeText(content);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/doc-files/Example_HTML.png b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/doc-files/Example_HTML.png
new file mode 100755
index 0000000..18b3d52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.class
new file mode 100755
index 0000000..9fcd679
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.java
new file mode 100755
index 0000000..6724ec3
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package-info.java
@@ -0,0 +1,19 @@
+/* *****************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014. All Rights Reserved.
+ *
+ * Note to U.S. Government Users Restricted Rights:  Use,
+ * duplication or disclosure restricted by GSA ADP Schedule
+ * Contract with IBM Corp.
+ *******************************************************************************/
+@XmlSchema(
+	prefix="atom",
+	xmlNs={
+		@XmlNs(prefix="atom", namespaceURI="http://www.w3.org/2005/Atom/"),
+		@XmlNs(prefix="xml", namespaceURI="http://www.w3.org/XML/1998/namespace")
+	}
+)
+package com.ibm.juno.core.dto.atom;
+
+import com.ibm.juno.core.xml.annotation.*;
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package.html
new file mode 100755
index 0000000..9d67101
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/atom/package.html
@@ -0,0 +1,578 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>ATOM Data Transfer Objects</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>Overview</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#Serialize'>Serializing ATOM feeds</a></p>
+		<ol>
+			<li><p><a class='doclink' href='#AtomJson'>ATOM/JSON</a></p>
+			<li><p><a class='doclink' href='#AtomRdfXml'>ATOM/RDF/XML</a></p>
+			<li><p><a class='doclink' href='#AtomHtml'>ATOM/HTML</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#Parse'>Parsing ATOM feeds</a></p>
+	</ol>
+</ol>
+
+
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports generation and consumption of ATOM feeds through the use of DTOs (Data Transfer Objects).<br>
+		It uses existing support for serializing and parsing POJOs to and from XML to define these ATOM objects. 
+	</p>
+	<p>
+		The examples shown here are pulled from the <code>AtomFeedResource</code> class in the <code>com.ibm.juno.sample.war</code> project.
+	</p>
+	
+	
+	<!-- ======================================================================================================== -->
+	<a id="Serialize"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - Serializing ATOM feeds</h3>
+	<div class='topic'>
+		<p>
+			The Juno ATOM feed DTOs are simply beans with fluent-style setters.<br>
+			The following code shows a feed being created programmatically: 
+		</p>
+		<p class='bcode'>
+	Feed feed = <jk>new</jk> Feed()
+		.setTitle(<jk>new</jk> Text(<js>"text"</js>, <js>"Juno ATOM specification"</js>))
+		.setSubTitle(<jk>new</jk> Text(<js>"html"</js>, <js>"A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless"</js>))
+		.setUpdated(<jsm>parseDateTime</jsm>(<js>"2013-05-08T12:29:29Z"</js>))
+		.setId(<jk>new</jk> Id(<js>"tag:juno.sample.com,2013:1"</js>))
+		.addLinks(
+			<jk>new</jk> Link(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://www.sample.com/"</js>).setHreflang(<js>"en"</js>),
+			<jk>new</jk> Link(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://www.sample.com/feed.atom"</js>)
+		)
+		.setRights(<jk>new</jk> Text(<js>"Copyright (c) 2013, IBM"</js>))
+		.setGenerator(<jk>new</jk> Generator(<js>"Juno"</js>).setUri(<jk>new</jk> URI(<js>"http://juno.ibm..com/"</js>)).setVersion(<js>"1.0"</js>))
+		.addEntries(
+			<jk>new</jk> Entry()
+				.setTitle(<jk>new</jk> Text(<js>"Juno ATOM specification snapshot"</js>))
+				.addLinks(
+					<jk>new</jk> Link(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://www.sample.com/2012/05/08/juno.atom"</js>),
+					<jk>new</jk> Link(<js>"enclosure"</js>, <js>"audio/mpeg"</js>, <js>""http://www.sample.com/audio/juno_podcast.mp3"</js>).setLength(12345)
+				)
+				.setId(<jk>new</jk> Id(<js>"tag:juno.sample.com,2013:1.2345"</js>))
+				.setUpdated(<jsm>parseDateTime</jsm>(<js>"2013-05-08T12:29:29Z"</js>))
+				.setPublished(<jsm>parseDateTime</jsm>(<js>"2013-05-08T12:29:29Z"</js>))
+				.addAuthors(<jk>new</jk> Person(<js>"James Bognar"</js>).setUri(<jk>new</jk> URI(<js>"http://www.sample.com/"</js>)).setEmail(<js>"jbognar@us.ibm.com"</js>))
+				.addContributors(
+					<jk>new</jk> Person(<js>"Barry M. Caceres"</js>)
+				)
+				.setContent(
+					<jk>new</jk> Content()
+						.setLang(<js>"en"</js>)
+						.setBase(<jk>new</jk> URI(<js>"http://www.ibm.com/"</js>))
+						.setType(<js>"xhtml"</js>)
+						.setText(<js>"&lt;div xmlns=\"http://www.w3.org/1999/xhtml\"&gt;&lt;p&gt;*lt;i&gt;[Update: Juno supports ATOM.]&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;"</js>)
+				)
+		)
+	;
+		</p>
+		<p>
+			To serialize this to ATOM, use the {@link com.ibm.juno.core.xml.XmlSerializer} class:
+		</p>
+		
+		<h6 class='figure'>Example with no namespaces</h6>
+		<p class='bcode'>
+	<jc>// Create a serializer with readable output, no namespaces yet.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer.SqReadable().setProperty(XmlSerializerProperties.<jsf>XML_enableNamespaces</jsf>, <jk>false</jk>);
+
+	<jc>// Serialize to ATOM/XML</jc>
+	String atomXml = s.serialize(feed);
+		</p>
+		
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	<xt>&lt;feed&gt;</xt>
+		<xt>&lt;id&gt;</xt>
+			tag:juno.sample.com,2013:1
+		<xt>&lt;/id&gt;</xt>
+		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs> <xa>hreflang</xa>=<xs>'en'</xs>/<xt>&gt;</xt>
+		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/feed.atom'</xs> <xa>rel</xa>=<xs>'self'</xs> <xa>type</xa>=<xs>'application/atom+xml'</xs>/<xt>&gt;</xt>
+		<xt>&lt;rights&gt;</xt>
+			Copyright (c) 2013, IBM
+		<xt>&lt;/rights&gt;</xt>
+		<xt>&lt;title</xt> <xa>type</xa>=<xs>'text'</xs>&gt;</xt>
+			Juno ATOM specification
+		<xt>&lt;/title&gt;</xt>
+		<xt>&lt;updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/updated&gt;</xt>
+		<xt>&lt;generator</xt> <xa>uri</xa>=<xs>'http://juno.ibm.com/'</xs> <xa>version</xa>=<xs>'1.0'</xs><xt>&gt;</xt>
+			Juno
+		<xt>&lt;/generator&gt;</xt>
+		<xt>&lt;subtitle</xt> <xa>type</xa>=<xs>'html'</xs><xt>&gt;</xt>
+			A &amp;lt;em&amp;gt;lot&amp;lt;/em&amp;gt; of effort went into making this effortless
+		<xt>&lt;/subtitle&gt;</xt>
+		<xt>&lt;entry&gt;</xt>
+			<xt>&lt;author&gt;</xt>
+				<xt>&lt;name&gt;</xt>James Bognar<xt>&lt;/name&gt;</xt>
+				<xt>&lt;uri&gt;</xt>http://www.sample.com/<xt>&lt;/uri&gt;</xt>
+				<xt>&lt;email&gt;</xt>jbognar@us.ibm.com<xt>&lt;/email&gt;</xt>
+			<xt>&lt;/author&gt;</xt>
+			<xt>&lt;contributor&gt;</xt>
+				<xt>&lt;name&gt;</xt>Barry M. Caceres<xt>&lt;/name&gt;</xt>
+			<xt>&lt;/contributor&gt;</xt>
+			<xt>&lt;id&gt;</xt>
+				tag:juno.sample.com,2013:1.2345
+			<xt>&lt;/id&gt;</xt>
+			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/2012/05/08/juno.atom'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs>/<xt>&gt;</xt>
+			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/audio/juno_podcast.mp3'</xs> <xa>rel</xa>=<xs>'enclosure'</xs> <xa>type</xa>=<xs>'audio/mpeg'</xs> <xa>length</xa>=<xs>'12345'</xs>/<xt>&gt;</xt>
+			<xt>&lt;title&gt;</xt>
+				Juno ATOM specification snapshot
+			<xt>&lt;/title&gt;</xt>
+			<xt>&lt;updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/updated&gt;</xt>
+			<xt>&lt;content</xt> <xa>base</xa>=<xs>'http://www.ibm.com/'</xs> <xa>lang</xa>=<xs>'en'</xs> <xa>type</xa>=<xs>'xhtml'</xs><xt>&gt;</xt>
+				<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs><xt>&gt;&lt;p&gt;&lt;i&gt;</xt>[Update: Juno supports ATOM.]<xt>&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;</xt>
+			<xt>&lt;/content&gt;</xt>
+			<xt>&lt;published&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/published&gt;</xt>
+		<xt>&lt;/entry&gt;</xt>
+	<xt>&lt;/feed&gt;</xt>		
+		</p>
+		
+		<p>
+			The following is the same, except with XML namespaces enabled:
+		</p>
+	
+		<h6 class='figure'>Example with namespaces</h6>
+		<p class='bcode'>
+	<jc>// Create a serializer with readable output with namespaces.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer.SqReadable();
+
+	<jc>// Serialize to ATOM/XML</jc>
+	String atomXml = s.serialize(feed);
+		</p>
+		
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	<xt>&lt;atom:feed</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.ibm.com/2013/Juno'</xs> 
+			<xa>xmlns:atom</xa>=<xs>'http://www.w3.org/2005/Atom/'</xs> 
+			<xa>xmlns:xml</xa>=<xs>'http://www.w3.org/XML/1998/namespace'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs><xt>&gt;</xt>
+		<xt>&lt;atom:id&gt;</xt>
+			tag:juno.sample.com,2013:1
+		<xt>&lt;/atom:id&gt;</xt>
+		<xt>&lt;atom:link</xt> <xa>href</xa>=<xs>'http://www.sample.com/'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs> <xa>hreflang</xa>=<xs>'en'</xs><xt>/&gt;</xt>
+		<xt>&lt;atom:link</xt> <xa>href</xa>=<xs>'http://www.sample.com/feed.atom'</xs> <xa>rel</xa>=<xs>'self'</xs> <xa>type</xa>=<xs>'application/atom+xml'</xs><xt>/&gt;</xt>
+		<xt>&lt;atom:rights&gt;</xt>
+			Copyright (c) 2013, IBM
+		<xt>&lt;/atom:rights&gt;</xt>
+		<xt>&lt;atom:title</xt> <xa>type</xa>=<xs>'text'</xs><xt>&gt;</xt>
+			Juno ATOM specification
+		<xt>&lt;/atom:title&gt;</xt>
+		<xt>&lt;atom:updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:updated&gt;</xt>
+		<xt>&lt;atom:generator</xt> <xa>uri</xa>=<xs>'http://juno.ibm.com/'</xs> <xa>version</xa>=<xs>'1.0'</xs><xt>&gt;</xt>
+			Juno
+		<xt>&lt;/atom:generator&gt;</xt>
+		<xt>&lt;atom:subtitle</xt> <xa>type</xa>=<xs>'html'</xs><xt>&gt;</xt>
+			A &amp;lt;em&amp;gt;lot&amp;lt;/em&amp;gt; of effort went into making this effortless
+		<xt>&lt;/atom:subtitle&gt;</xt>
+		<xt>&lt;atom:entry&gt;</xt>
+			<xt>&lt;atom:author&gt;</xt>
+				<xt>&lt;atom:name&gt;</xt>James Bognar<xt>&lt;/atom:name&gt;</xt>
+				<xt>&lt;atom:uri&gt;</xt>http://www.sample.com/<xt>&lt;/atom:uri&gt;</xt>
+				<xt>&lt;atom:email&gt;</xt>jbognar@us.ibm.com<xt>&lt;/atom:email&gt;</xt>
+			<xt>&lt;/atom:author&gt;</xt>
+			<xt>&lt;atom:contributor&gt;</xt>
+				<xt>&lt;atom:name&gt;</xt>Barry M. Caceres<xt>&lt;/atom:name&gt;</xt>
+			<xt>&lt;/atom:contributor&gt;</xt>
+			<xt>&lt;atom:id&gt;</xt>
+				tag:juno.sample.com,2013:1.2345
+			<xt>&lt;/atom:id&gt;</xt>
+			<xt>&lt;atom:link</xt> <xa>href</xa>=<xs>'http://www.sample.com/2012/05/08/juno.atom'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs><xt>/&gt;</xt>
+			<xt>&lt;atom:link</xt> <xa>href</xa>=<xs>'http://www.sample.com/audio/juno_podcast.mp3'</xs> <xa>rel</xa>=<xs>'enclosure'</xs> <xa>type</xa>=<xs>'audio/mpeg'</xs> <xa>length</xa>=<xs>'12345'</xs><xt>/&gt;</xt>
+			<xt>&lt;atom:title&gt;</xt>
+				Juno ATOM specification snapshot
+			<xt>&lt;/atom:title&gt;</xt>
+			<xt>&lt;atom:updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:updated&gt;</xt>
+			<xt>&lt;atom:content</xt> <xa>xml:base</xa>=<xs>'http://www.ibm.com/'</xs> <xa>xml:lang</xa>=<xs>'en'</xs> <xa>type</xa>=<xs>'xhtml'</xs><xt>&gt;</xt>
+				<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs><xt>&gt;</xt><xt>&lt;p&gt;</xt><xt>&lt;i&gt;</xt>[Update: Juno supports ATOM.]<xt>&lt;/i&gt;</xt><xt>&lt;/p&gt;</xt><xt>&lt;/div&gt;</xt>
+			<xt>&lt;/atom:content&gt;</xt>
+			<xt>&lt;atom:published&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:published&gt;</xt>
+		<xt>&lt;/atom:entry&gt;</xt>
+	<xt>&lt;/atom:feed&gt;</xt>
+		</p>
+	
+		<p>
+			The following is the same, except with XML namespaces enabled and the ATOM namespace as the default namespace:
+		</p>
+
+		<h6 class='figure'>Example with namespaces with ATOM as the default namespace</h6>
+		<p class='bcode'>
+	<jc>// Create a serializer with readable output with namespaces.</jc>
+	XmlSerializer s = <jk>new</jk> XmlSerializer.SqReadable().setProperty(XmlSerializerProperties.<jsf>XML_defaultNamespaceUri</jsf>, <js>"atom"</js>);
+
+	<jc>// Serialize to ATOM/XML</jc>
+	String atomXml = s.serialize(feed);
+		</p>
+		
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	<xt>&lt;feed</xt> 
+			<xa>xmlns</xa>=<xs>'http://www.w3.org/2005/Atom/'</xs> 
+			<xa>xmlns:xml</xa>=<xs>'http://www.w3.org/XML/1998/namespace'</xs> 
+			<xa>xmlns:xsi</xa>=<xs>'http://www.w3.org/2001/XMLSchema-instance'</xs><xt>&gt;</xt>
+		<xt>&lt;id&gt;</xt>
+			tag:juno.sample.com,2013:1
+		<xt>&lt;/id&gt;</xt>
+		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs> <xa>hreflang</xa>=<xs>'en'</xs><xt>/&gt;</xt>
+		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/feed.atom'</xs> <xa>rel</xa>=<xs>'self'</xs> <xa>type</xa>=<xs>'application/atom+xml'</xs><xt>/&gt;</xt>
+		<xt>&lt;rights&gt;</xt>
+			Copyright (c) 2013, IBM
+		<xt>&lt;/rights&gt;</xt>
+		<xt>&lt;title</xt> <xa>type</xa>=<xs>'text'</xs><xt>&gt;</xt>
+			Juno ATOM specification
+		<xt>&lt;/title&gt;</xt>
+		<xt>&lt;updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/updated&gt;</xt>
+		<xt>&lt;generator</xt> <xa>uri</xa>=<xs>'http://juno.ibm.com/'</xs> <xa>version</xa>=<xs>'1.0'</xs><xt>&gt;</xt>
+			Juno
+		<xt>&lt;/generator&gt;</xt>
+		<xt>&lt;subtitle</xt> <xa>type</xa>=<xs>'html'</xs><xt>&gt;</xt>
+			A &amp;lt;em&amp;gt;lot&amp;lt;/em&amp;gt; of effort went into making this effortless
+		<xt>&lt;/subtitle&gt;</xt>
+		<xt>&lt;entry&gt;</xt>
+			<xt>&lt;author&gt;</xt>
+				<xt>&lt;name&gt;</xt>James Bognar<xt>&lt;/name&gt;</xt>
+				<xt>&lt;uri&gt;</xt>http://www.sample.com/<xt>&lt;/uri&gt;</xt>
+				<xt>&lt;email&gt;</xt>jbognar@us.ibm.com<xt>&lt;/email&gt;</xt>
+			<xt>&lt;/author&gt;</xt>
+			<xt>&lt;contributor&gt;</xt>
+				<xt>&lt;name&gt;</xt>Barry M. Caceres<xt>&lt;/name&gt;</xt>
+			<xt>&lt;/contributor&gt;</xt>
+			<xt>&lt;id&gt;</xt>
+				tag:juno.sample.com,2013:1.2345
+			<xt>&lt;/id&gt;</xt>
+			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/2012/05/08/juno.atom'</xs> <xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs><xt>/&gt;</xt>
+			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://www.sample.com/audio/juno_podcast.mp3'</xs> <xa>rel</xa>=<xs>'enclosure'</xs> <xa>type</xa>=<xs>'audio/mpeg'</xs> <xa>length</xa>=<xs>'12345'</xs><xt>/&gt;</xt>
+			<xt>&lt;title&gt;</xt>
+				Juno ATOM specification snapshot
+			<xt>&lt;/title&gt;</xt>
+			<xt>&lt;updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/updated&gt;</xt>
+			<xt>&lt;content</xt> <xa>xml:base</xa>=<xs>'http://www.ibm.com/'</xs> <xa>xml:lang</xa>=<xs>'en'</xs> <xa>type</xa>=<xs>'xhtml'</xs><xt>&gt;</xt>
+				<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs><xt>&gt;</xt><xt>&lt;p&gt;</xt><xt>&lt;i&gt;</xt>[Update: Juno supports ATOM.]<xt>&lt;/i&gt;</xt><xt>&lt;/p&gt;</xt><xt>&lt;/div&gt;</xt>
+			<xt>&lt;/content&gt;</xt>
+			<xt>&lt;published&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/published&gt;</xt>
+		<xt>&lt;/entry&gt;</xt>
+	<xt>&lt;/feed&gt;</xt>
+		</p>		
+	
+	
+		<!-- ======================================================================================================== -->
+		<a id="AtomJson"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.1 - ATOM/JSON</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.json.JsonSerializer} class can also be used to produce ATOM in JSON format.
+			</p>
+
+			<h6 class='figure'>ATOM/JSON example</h6>
+			<p class='bcode'>
+	<jc>// Get JSON serializer with readable output.</jc>
+	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>;
+
+	<jc>// Serialize to ATOM/JSON</jc>
+	String atomJson = s.serialize(feed);
+			</p>
+		
+			<h6 class='figure'>Results</h6>
+			<p class='bcode'>
+	{
+		id: {
+			text: <js>'tag:juno.sample.com,2013:1'</js>
+		}, 
+		links: [
+			{
+				href: <js>'http://www.sample.com/'</js>, 
+				rel: <js>'alternate'</js>, 
+				type: <js>'text/html'</js>, 
+				hreflang: <js>'en'</js>
+			}, 
+			{
+				href: <js>'http://www.sample.com/feed.atom'</js>, 
+				rel: <js>'self'</js>, 
+				type: <js>'application/atom+xml'</js>
+			}
+		], 
+		rights: {
+			text: <js>'Copyright (c) 2013, IBM'</js>
+		}, 
+		title: {
+			type: <js>'text'</js>, 
+			text: <js>'Juno ATOM specification'</js>
+		}, 
+		updated: <js>'2013-05-08T12:29:29Z'</js>, 
+		generator: {
+			uri: <js>'http://juno.ibm.com/'</js>, 
+			version: <js>'1.0'</js>, 
+			text: <js>'Juno'</js>
+		}, 
+		subtitle: {
+			type: <js>'html'</js>, 
+			text: <js>'A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless'</js>
+		}, 
+		entries: [
+			{
+				authors: [
+					{
+						name: <js>'James Bognar'</js>, 
+						uri: <js>'http://www.sample.com/'</js>, 
+						email: <js>'jbognar@us.ibm.com'</js>
+					}
+				], 
+				contributors: [
+					{
+						name: <js>'Barry M. Caceres'</js>
+					}
+				], 
+				id: {
+					text: <js>'tag:juno.sample.com,2013:1.2345'</js>
+				}, 
+				links: [
+					{
+						href: <js>'http://www.sample.com/2012/05/08/juno.atom'</js>, 
+						rel: <js>'alternate'</js>, 
+						type: <js>'text/html'</js>
+					}, 
+					{
+						href: <js>'http://www.sample.com/audio/juno_podcast.mp3'</js>, 
+						rel: <js>'enclosure'</js>, 
+						type: <js>'audio/mpeg'</js>, 
+						length: <jk>12345</jk>
+					}
+				], 
+				title: {
+					text: <js>'Juno ATOM specification snapshot'</js>
+				}, 
+				updated: <js>'2013-05-08T12:29:29Z'</js>, 
+				content: {
+					base: <js>'http://www.ibm.com/'</js>, 
+					lang: <js>'en'</js>, 
+					type: <js>'xhtml'</js>, 
+					text: <js>'&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;i&gt;[Update: Juno supports ATOM.]&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;'</js>
+				}, 
+				published: <js>'2013-05-08T12:29:29Z'</js>
+			}
+		]
+	}
+			</p>
+		</div>	
+		
+
+		<!-- ======================================================================================================== -->
+		<a id="AtomRdfXml"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.2 - ATOM/RDF/XML</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.jena.RdfSerializer} class and subclasses can also be used to produce ATOM in various RDF formats.
+			</p>
+
+			<h6 class='figure'>ATOM/RDF/XML example</h6>
+			<p class='bcode'>
+	<jc>// Get RDF/XML serializer with readable output.</jc>
+	RdfSerializer s = <jk>new</jk> RdfSerializer.XmlAbbrev()
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+		.setProperty(SerializerProperties.<jsf>SERIALIZER_quoteChar</jsf>, <js>'\''</js>)
+		.setProperty(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
+
+	<jc>// Serialize to ATOM/RDF/XML</jc>
+	String atomRdfXml = s.serialize(feed);
+			</p>
+			
+			<h6 class='figure'>Results</h6>
+			<p class='bcode'>
+	<xt>&lt;rdf:RDF</xt>
+	    <xa>xmlns:rdf</xa>=<xs>'http://www.w3.org/1999/02/22-rdf-syntax-ns#'</xs>
+	    <xa>xmlns:j</xa>=<xs>'http://www.ibm.com/juno/'</xs>
+	    <xa>xmlns:jp</xa>=<xs>'http://www.ibm.com/junobp/'</xs>
+	    <xa>xmlns:atom</xa>=<xs>'http://www.w3.org/2005/Atom/'</xs>
+	    <xa>xmlns:j.0</xa>=<xs>'http://www.w3.org/XML/1998/'</xs><xt>&gt;</xt>
+	   <xt>&lt;rdf:Description&gt;</xt>
+	      <xt>&lt;atom:id</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	         <xt>&lt;atom:text&gt;</xt>tag:juno.sample.com,2013:1<xt>&lt;/atom:text&gt;</xt>
+	      <xt>&lt;/atom:id&gt;</xt>
+	      <xt>&lt;atom:links&gt;</xt>
+	         <xt>&lt;rdf:Seq&gt;</xt>
+	            <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	               <xt>&lt;atom:href&gt;</xt>http://www.sample.com/<xt>&lt;/atom:href&gt;</xt>
+	               <xt>&lt;atom:rel&gt;</xt>alternate<xt>&lt;/atom:rel&gt;</xt>
+	               <xt>&lt;atom:type&gt;</xt>text/html<xt>&lt;/atom:type&gt;</xt>
+	               <xt>&lt;atom:hreflang&gt;</xt>en<xt>&lt;/atom:hreflang&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	            <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	               <xt>&lt;atom:href&gt;</xt>http://www.sample.com/feed.atom<xt>&lt;/atom:href&gt;</xt>
+	               <xt>&lt;atom:rel&gt;</xt>self<xt>&lt;/atom:rel&gt;</xt>
+	               <xt>&lt;atom:type&gt;</xt>application/atom+xml<xt>&lt;/atom:type&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	         <xt>&lt;/rdf:Seq&gt;</xt>
+	      <xt>&lt;/atom:links&gt;</xt>
+	      <xt>&lt;atom:rights</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	         <xt>&lt;atom:text&gt;</xt>Copyright (c) 2013, IBM<xt>&lt;/atom:text&gt;</xt>
+	      <xt>&lt;/atom:rights&gt;</xt>
+	      <xt>&lt;atom:title</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	         <xt>&lt;atom:type&gt;</xt>text<xt>&lt;/atom:type&gt;</xt>
+	         <xt>&lt;atom:text&gt;</xt>Juno ATOM specification<xt>&lt;/atom:text&gt;</xt>
+	      <xt>&lt;/atom:title&gt;</xt>
+	      <xt>&lt;atom:updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:updated&gt;</xt>
+	      <xt>&lt;atom:generator</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	         <xt>&lt;atom:uri</xt> <xa>rdf:resource</xa>=<xs>'http://juno.ibm.com/'</xs><xt>/&gt;</xt>
+	         <xt>&lt;atom:version&gt;</xt>1.0<xt>&lt;/atom:version&gt;</xt>
+	         <xt>&lt;atom:text&gt;</xt>Juno<xt>&lt;/atom:text&gt;</xt>
+	      <xt>&lt;/atom:generator&gt;</xt>
+	      <xt>&lt;atom:subtitle</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	         <xt>&lt;atom:type&gt;</xt>html<xt>&lt;/atom:type&gt;</xt>
+	         <xt>&lt;atom:text&gt;</xt>A &amp;lt;em&amp;gt;lot&amp;lt;/em&amp;gt; of effort went into making this effortless<xt>&lt;/atom:text&gt;</xt>
+	      <xt>&lt;/atom:subtitle&gt;</xt>
+	      <xt>&lt;atom:entries&gt;</xt>
+	         <xt>&lt;rdf:Seq&gt;</xt>
+	            <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	               <xt>&lt;atom:authors&gt;</xt>
+	                  <xt>&lt;rdf:Seq&gt;</xt>
+	                     <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                        <xt>&lt;atom:name&gt;</xt>James Bognar<xt>&lt;/atom:name&gt;</xt>
+	                        <xt>&lt;atom:uri</xt> <xa>rdf:resource</xa>=<xs>'http://www.sample.com/'</xs><xt>/&gt;</xt>
+	                        <xt>&lt;atom:email&gt;</xt>jbognar@us.ibm.com<xt>&lt;/atom:email&gt;</xt>
+	                     <xt>&lt;/rdf:li&gt;</xt>
+	                  <xt>&lt;/rdf:Seq&gt;</xt>
+	               <xt>&lt;/atom:authors&gt;</xt>
+	               <xt>&lt;atom:contributors&gt;</xt>
+	                  <xt>&lt;rdf:Seq&gt;</xt>
+	                     <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                        <xt>&lt;atom:name&gt;</xt>Barry M. Caceres<xt>&lt;/atom:name&gt;</xt>
+	                     <xt>&lt;/rdf:li&gt;</xt>
+	                  <xt>&lt;/rdf:Seq&gt;</xt>
+	               <xt>&lt;/atom:contributors&gt;</xt>
+	               <xt>&lt;atom:id</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                  <xt>&lt;atom:text&gt;</xt>tag:juno.sample.com,2013:1.2345<xt>&lt;/atom:text&gt;</xt>
+	               <xt>&lt;/atom:id&gt;</xt>
+	               <xt>&lt;atom:links&gt;</xt>
+	                  <xt>&lt;rdf:Seq&gt;</xt>
+	                     <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                        <xt>&lt;atom:href&gt;</xt>http://www.sample.com/2012/05/08/juno.atom<xt>&lt;/atom:href&gt;</xt>
+	                        <xt>&lt;atom:rel&gt;</xt>alternate<xt>&lt;/atom:rel&gt;</xt>
+	                        <xt>&lt;atom:type&gt;</xt>text/html<xt>&lt;/atom:type&gt;</xt>
+	                     <xt>&lt;/rdf:li&gt;</xt>
+	                     <xt>&lt;rdf:li</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                        <xt>&lt;atom:href&gt;</xt>http://www.sample.com/audio/juno_podcast.mp3<xt>&lt;/atom:href&gt;</xt>
+	                        <xt>&lt;atom:rel&gt;</xt>enclosure<xt>&lt;/atom:rel&gt;</xt>
+	                        <xt>&lt;atom:type&gt;</xt>audio/mpeg<xt>&lt;/atom:type&gt;</xt>
+	                        <xt>&lt;atom:length&gt;</xt>12345<xt>&lt;/atom:length&gt;</xt>
+	                     <xt>&lt;/rdf:li&gt;</xt>
+	                  <xt>&lt;/rdf:Seq&gt;</xt>
+	               <xt>&lt;/atom:links&gt;</xt>
+	               <xt>&lt;atom:title</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                  <xt>&lt;atom:text&gt;</xt>Juno ATOM specification snapshot<xt>&lt;/atom:text&gt;</xt>
+	               <xt>&lt;/atom:title&gt;</xt>
+	               <xt>&lt;atom:updated&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:updated&gt;</xt>
+	               <xt>&lt;atom:content</xt> <xa>rdf:parseType</xa>=<xs>'Resource'</xs><xt>&gt;</xt>
+	                  <xt>&lt;j.0:namespacebase</xt> <xa>rdf:resource</xa>=<xs>'http://www.ibm.com/'</xs><xt>/&gt;</xt>
+	                  <xt>&lt;j.0:namespacelang&gt;</xt>en<xt>&lt;/j.0:namespacelang&gt;</xt>
+	                  <xt>&lt;atom:type&gt;</xt>xhtml<xt>&lt;/atom:type&gt;</xt>
+	                  <xt>&lt;atom:text&gt;</xt>&amp;lt;div xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&amp;lt;p&amp;gt;&amp;lt;i&amp;gt;[Update: Juno supports ATOM.]&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;<xt>&lt;/atom:text&gt;</xt>
+	               <xt>&lt;/atom:content&gt;</xt>
+	               <xt>&lt;atom:published&gt;</xt>2013-05-08T12:29:29Z<xt>&lt;/atom:published&gt;</xt>
+	            <xt>&lt;/rdf:li&gt;</xt>
+	         <xt>&lt;/rdf:Seq&gt;</xt>
+	      <xt>&lt;/atom:entries&gt;</xt>
+	   <xt>&lt;/rdf:Description&gt;</xt>
+	<xt>&lt;/rdf:RDF&gt;</xt>
+			</p>
+		</div>
+		
+		
+		<!-- ======================================================================================================== -->
+		<a id="AtomHtml"></a>
+		<h4 class='topic' onclick='toggle(this)'>1.1.3 - ATOM/HTML</h4>
+		<div class='topic'>
+			<p>
+				The {@link com.ibm.juno.core.html.HtmlSerializer} class can be used to produce ATOM in HTML format.
+			</p>
+			<p>
+				The following is the output produced by the <code>AtomFeedResource</code> in the <code>com.ibm.juno.sample.war</code> project:
+			</p>
+			
+			<h6 class='figure'>Example ATOM/HTML results</h6>
+			<img class='bordered' src='doc-files/Example_HTML.png'>	
+		</div>
+	</div>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="Parse"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.2 - Parsing ATOM feeds</h3>
+	<div class='topic'>
+		<p>
+			Use the {@link com.ibm.juno.core.xml.XmlParser} to convert ATOM/XML feeds back into their original POJOs:
+		</p>
+		<p class='bcode'>
+			<jc>// Create a serializer with readable output with namespaces</jc>
+			XmlSerializer s = XmlSerializer.<jsf>DEFAULT_SQ_READABLE</jsf>;
+
+			<jc>// Serialize to ATOM/XML</jc>
+			String atomXml = s.serialize(feed);
+
+			<jc>// Get an XML parser to convert it back into a POJO</jc>
+			XmlParser p = XmlParser.<jsf>DEFAULT</jsf>;
+			
+			<jc>// Convert the XML back into a POJO</jc>
+			Feed feed2 = p.parse(atomXml, Feed.<jk>class</jk>);
+		</p>
+		<p>
+			ATOM Feed objects can also be constructed from the other media types using the appropriate parsers.
+		</p>
+	</div>
+
+</div>
+<p align="center"><i><b>*** f�n ***</b></i></p>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.class
new file mode 100755
index 0000000..a9f814f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.java
new file mode 100755
index 0000000..aca9e6a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/Column.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.dto.cognos;
+
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.xml.annotation.*;
+
+/**
+ * Represents a meta-data column in a Cognos dataset.
+ * <p>
+ * 	When serialized to XML, creates the following construct:
+ * <p class='bcode'>
+ * 	<xt>&lt;item</xt> <xa>name</xa>=<xs>'name'</xs> <xa>type</xa>=<xs>'xs:String'</xs> <xa>length</xa>=<xs>'255'</xs>/&gt;
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Xml(name="item")
+@SuppressWarnings({"rawtypes","hiding"})
+public class Column {
+
+	private String name, type;
+	private Integer length;
+	PojoFilter filter;
+
+	/** Bean constructor. */
+	public Column() {}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The column name.
+	 * @param type The column type (e.g. <js>"xs:String"</js>).
+	 */
+	public Column(String name, String type) {
+		this(name, type, null);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The column name.
+	 * @param type The column type (e.g. <js>"xs:String"</js>).
+	 * @param length The column length (e.g. <code>255</code>).
+	 */
+	public Column(String name, String type, Integer length) {
+		this.name = name;
+		this.type = type;
+		this.length = length;
+	}
+
+	/**
+	 * Associates a POJO filter with this column.
+	 * <p>
+	 * 	Typically used to define columns that don't exist on the underlying beans being serialized.
+	 * <p>
+	 * 	For example, the <code>AddressBookResource</code> sample defined the following filter
+	 * 		to define an additional <js>"numAddresses"</js> column even though no such property exists
+	 * 		on the serialized beans.
+	 * <p class='bcode'>
+	 * 	Column c = <jk>new</jk> Column(<js>"numAddresses"</js>, <js>"xs:int"</js>)
+	 * 		.addFilter(
+	 * 			<jk>new</jk> PojoFilter<Person,Integer>() {
+	 * 				<ja>@Override</ja>
+	 * 				<jk>public</jk> Integer filter(Person p) {
+	 * 					<jk>return</jk> p.<jf>addresses</jf>.size();
+	 * 				}
+	 * 			}
+	 * 		);
+	 * </p>
+	 *
+	 * @param filter The filter to associate with the column.
+	 * @return This object (for method chaining).
+	 */
+	public Column addFilter(PojoFilter filter) {
+		this.filter = filter;
+		return this;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Bean properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Bean property getter:  <property>name</property>.
+	 *
+	 * @return The value of the <property>name</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@Xml(format=XmlFormat.ATTR)
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Bean property setter:  <property>name</property>.
+	 *
+	 * @param name The new value for the <property>name</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Column setName(String name) {
+		this.name = name;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>type</property>.
+	 *
+	 * @return The value of the <property>type</property> property on this bean, or <jk>null</jk> if it is not set.
+	 */
+	@Xml(format=XmlFormat.ATTR)
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Bean property setter:  <property>type</property>.
+	 *
+	 * @param type The new value for the <property>type</property> property on this bean.
+	 * @return This object (for method chaining).
+	 */
+	public Column setType(String type) {
+		this.type = type;
+		return this;
+	}
+
+	/**
+	 * Bean property getter:  <property>length</property>.
+	 *
+	 * @return The value of the <property>length</property> property on this bean, or <jk>null</jk> if length is not applicable for the specified type.
+	 */
+	@Xml(format=XmlFormat.ATTR)
+	public Integer getLength() {
+		return length;
+	}
+
+	/**
+	 * Bean property setter:  <property>length</property>.
+	 *
+	 * @param length The new value for the <property>length</property> property on this bean.
+	 * Can be <jk>null</jk> if length is not applicable for the specified type.
+	 * @return This object (for method chaining).
+	 */
+	public Column setLength(Integer length) {
+		this.length = length;
+		return this;
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet$Row.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet$Row.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet$Row.class
new file mode 100755
index 0000000..e248dbe
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet$Row.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.class
new file mode 100755
index 0000000..521dc16
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/dto/cognos/DataSet.class differ


[10/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.java
new file mode 100755
index 0000000..621164e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonParserReader.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import java.io.*;
+
+import com.ibm.juno.core.parser.*;
+
+/**
+ * Same functionality as {@link ParserReader} except automatically decoded <code>%xx</code> escape sequences.
+ * <p>
+ * Escape sequences are assumed to be encoded UTF-8.  Extended Unicode (&gt;\u10000) is supported.
+ * <p>
+ * If decoding is enabled, the following character replacements occur so that boundaries are not lost:
+ * <ul>
+ * 	<li><js>'&'</js> -&gt; <js>'\u0001'</js>
+ * 	<li><js>'='</js> -&gt; <js>'\u0002'</js>
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class UonParserReader extends ParserReader {
+
+	private final boolean decodeChars;
+	private final char[] buff;
+	private int iCurrent, iEnd;
+
+	/**
+	 * Constructor for input from a {@link CharSequence}.
+	 *
+	 * @param in The character sequence being read from.
+	 * @param decodeChars If <jk>true</jk>, decode <code>%xx</code> escape sequences.
+	 */
+	public UonParserReader(CharSequence in, boolean decodeChars) {
+		super(in);
+		this.decodeChars = decodeChars;
+		if (in == null || ! decodeChars)
+			this.buff = new char[0];
+		else
+			this.buff = new char[in.length() < 1024 ? in.length() : 1024];
+	}
+
+	/**
+	 * Constructor for input from a {@link Reader}).
+	 *
+	 * @param r The Reader being wrapped.
+	 * @param buffSize Buffer size.
+	 * @param decodeChars If <jk>true</jk>, decode <code>%xx</code> escape sequences.
+	 */
+	public UonParserReader(Reader r, int buffSize, boolean decodeChars) {
+		super(r, buffSize);
+		this.decodeChars = decodeChars;
+		buffSize = decodeChars ? (buffSize <= 0 ? 1024 : Math.max(buffSize, 20)) : 0;
+		this.buff = new char[buffSize];
+	}
+
+	@Override /* Reader */
+	public final int read(char[] cbuf, int off, int len) throws IOException {
+
+		if (! decodeChars)
+			return super.read(cbuf, off, len);
+
+		// Copy any remainder to the beginning of the buffer.
+		int remainder = iEnd - iCurrent;
+		if (remainder > 0)
+			System.arraycopy(buff, iCurrent, buff, 0, remainder);
+		iCurrent = 0;
+
+		int expected = buff.length - remainder;
+
+		int x = super.read(buff, remainder, expected);
+		if (x == -1 && remainder == 0)
+			return -1;
+
+		iEnd = remainder + (x == -1 ? 0 : x);
+
+		int i = 0;
+		while (i < len) {
+			if (iCurrent >= iEnd)
+				return i;
+			char c = buff[iCurrent++];
+			if (c == '+') {
+				cbuf[off + i++] = ' ';
+			} else if (c == '&') {
+				cbuf[off + i++] = '\u0001';
+			} else if (c == '=') {
+				cbuf[off + i++] = '\u0002';
+			} else if (c != '%') {
+				cbuf[off + i++] = c;
+			} else {
+				int iMark = iCurrent-1;  // Keep track of current position.
+
+				// Stop if there aren't at least two more characters following '%' in the buffer,
+				// or there aren't at least two more positions open in cbuf to handle double-char chars.
+				if (iMark+2 >= iEnd || i+2 > len) {
+					iCurrent--;
+					return i;
+				}
+
+				int b0 = readEncodedByte();
+				int cx;
+
+				// 0xxxxxxx
+				if (b0 < 128) {
+					cx = b0;
+
+				// 10xxxxxx
+				} else if (b0 < 192) {
+					throw new IOException("Invalid hex value for first escape pattern in UTF-8 sequence:  " + b0);
+
+				// 110xxxxx	10xxxxxx
+				// 11000000(192) - 11011111(223)
+				} else if (b0 < 224) {
+					cx = readUTF8(b0-192, 1);
+					if (cx == -1) {
+						iCurrent = iMark;
+						return i;
+					}
+
+				// 1110xxxx	10xxxxxx	10xxxxxx
+				// 11100000(224) - 11101111(239)
+				} else if (b0 < 240) {
+					cx = readUTF8(b0-224, 2);
+					if (cx == -1) {
+						iCurrent = iMark;
+						return i;
+					}
+
+				// 11110xxx	10xxxxxx	10xxxxxx	10xxxxxx
+				// 11110000(240) - 11110111(247)
+				} else if (b0 < 248) {
+					cx = readUTF8(b0-240, 3);
+					if (cx == -1) {
+						iCurrent = iMark;
+						return i;
+					}
+
+				} else
+					throw new IOException("Invalid hex value for first escape pattern in UTF-8 sequence:  " + b0);
+
+				if (cx < 0x10000)
+					cbuf[off + i++] = (char)cx;
+				else {
+					cx -= 0x10000;
+					cbuf[off + i++] = (char)(0xd800 + (cx >> 10));
+					cbuf[off + i++] = (char)(0xdc00 + (cx & 0x3ff));
+				}
+			}
+		}
+		return i;
+	}
+
+	private final int readUTF8(int n, final int numBytes) throws IOException {
+		if (iCurrent + numBytes*3 > iEnd)
+			return -1;
+		for (int i = 0; i < numBytes; i++) {
+			n <<= 6;
+			n += readHex()-128;
+		}
+		return n;
+	}
+
+	private final int readHex() throws IOException {
+		int c = buff[iCurrent++];
+		if (c != '%')
+			throw new IOException("Did not find expected '%' character in UTF-8 sequence.");
+		return readEncodedByte();
+	}
+
+	private final int readEncodedByte() throws IOException {
+		if (iEnd <= iCurrent + 1)
+			throw new IOException("Incomplete trailing escape pattern");
+		int h = buff[iCurrent++];
+		int l = buff[iCurrent++];
+		h = fromHexChar(h);
+		l = fromHexChar(l);
+		return (h << 4) + l;
+	}
+
+	private final int fromHexChar(int c) throws IOException {
+		if (c >= '0' && c <= '9')
+			return c - '0';
+		if (c >= 'a' && c <= 'f')
+			return 10 + c - 'a';
+		if (c >= 'A' && c <= 'F')
+			return 10 + c - 'A';
+		throw new IOException("Invalid hex character '"+c+"' found in escape pattern.");
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Encoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Encoding.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Encoding.class
new file mode 100755
index 0000000..5fca57c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Encoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Readable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Readable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Readable.class
new file mode 100755
index 0000000..c4e6b57
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Readable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Simple.class
new file mode 100755
index 0000000..1ecf09c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$SimpleEncoding.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$SimpleEncoding.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$SimpleEncoding.class
new file mode 100755
index 0000000..2d0a383
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer$SimpleEncoding.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.class
new file mode 100755
index 0000000..4ca7cf1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.java
new file mode 100755
index 0000000..cb16038
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializer.java
@@ -0,0 +1,532 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+import static com.ibm.juno.core.urlencoding.UonSerializerProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJO models to UON (a notation for URL-encoded query parameter values).
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/uon</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/uon</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This serializer provides several serialization options.  Typically, one of the predefined DEFAULT serializers will be sufficient.
+ * 	However, custom serializers can be constructed to fine-tune behavior.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link UonSerializerProperties}
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ * <p>
+ * 	The following shows a sample object defined in Javascript:
+ * </p>
+ * <p class='bcode'>
+ * 	{
+ * 		id: 1,
+ * 		name: <js>'John Smith'</js>,
+ * 		uri: <js>'http://sample/addressBook/person/1'</js>,
+ * 		addressBookUri: <js>'http://sample/addressBook'</js>,
+ * 		birthDate: <js>'1946-08-12T00:00:00Z'</js>,
+ * 		otherIds: <jk>null</jk>,
+ * 		addresses: [
+ * 			{
+ * 				uri: <js>'http://sample/addressBook/address/1'</js>,
+ * 				personUri: <js>'http://sample/addressBook/person/1'</js>,
+ * 				id: 1,
+ * 				street: <js>'100 Main Street'</js>,
+ * 				city: <js>'Anywhereville'</js>,
+ * 				state: <js>'NY'</js>,
+ * 				zip: 12345,
+ * 				isCurrent: <jk>true</jk>,
+ * 			}
+ * 		]
+ * 	}
+ * </p>
+ * <p>
+ * 	Using the "strict" syntax defined in this document, the equivalent
+ * 		UON notation would be as follows:
+ * </p>
+ * <p class='bcode'>
+ * 	$o(
+ * 		<xa>id</xa>=$n(<xs>1</xs>),
+ * 		<xa>name</xa>=<xs>John+Smith</xs>,
+ * 		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+ * 		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+ * 		<xa>otherIds</xa>=<xs>%00</xs>,
+ * 		<xa>addresses</xa>=$a(
+ * 			$o(
+ * 				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
+ * 				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 				<xa>id</xa>=$n(<xs>1</xs>),
+ * 				<xa>street</xa>=<xs>100+Main+Street</xs>,
+ * 				<xa>city</xa>=<xs>Anywhereville</xs>,
+ * 				<xa>state</xa>=<xs>NY</xs>,
+ * 				<xa>zip</xa>=$n(<xs>12345</xs>),
+ * 				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+ * 			)
+ * 		)
+ * 	)
+ * </p>
+ * <p>
+ * 	A secondary "lax" syntax is available when the data type of the
+ * 		values are already known on the receiving end of the transmission:
+ * </p>
+ * <p class='bcode'>
+ * 	(
+ * 		<xa>id</xa>=<xs>1</xs>,
+ * 		<xa>name</xa>=<xs>John+Smith</xs>,
+ * 		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+ * 		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+ * 		<xa>otherIds</xa>=<xs>%00</xs>,
+ * 		<xa>addresses</xa>=(
+ * 			(
+ * 				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
+ * 				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
+ * 				<xa>id</xa>=<xs>1</xs>,
+ * 				<xa>street</xa>=<xs>100+Main+Street</xs>,
+ * 				<xa>city</xa>=<xs>Anywhereville</xs>,
+ * 				<xa>state</xa>=<xs>NY</xs>,
+ * 				<xa>zip</xa>=<xs>12345</xs>,
+ * 				<xa>isCurrent</xa>=<xs>true</xs>
+ * 			)
+ * 		)
+ * 	)
+ * </p>
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Serialize a Map</jc>
+ * 	Map m = <jk>new</jk> ObjectMap(<js>"{a:'b',c:1,d:false,e:['f',1,false],g:{h:'i'}}"</js>);
+ *
+ * 	<jc>// Serialize to value equivalent to JSON.</jc>
+ * 	<jc>// Produces "$o(a=b,c=$n(1),d=$b(false),e=$a(f,$n(1),$b(false)),g=$o(h=i))"</jc>
+ * 	String s = UonSerializer.<jsf>DEFAULT</jsf>.serialize(s);
+ *
+ * 	<jc>// Serialize to simplified value (for when data type is already known by receiver).</jc>
+ * 	<jc>// Produces "(a=b,c=1,d=false,e=(f,1,false),g=(h=i))"</jc>
+ * 	String s = UonSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
+ *
+ * 	<jc>// Serialize a bean</jc>
+ * 	<jk>public class</jk> Person {
+ * 		<jk>public</jk> Person(String s);
+ * 		<jk>public</jk> String getName();
+ * 		<jk>public int</jk> getAge();
+ * 		<jk>public</jk> Address getAddress();
+ * 		<jk>public boolean</jk> deceased;
+ * 	}
+ *
+ * 	<jk>public class</jk> Address {
+ * 		<jk>public</jk> String getStreet();
+ * 		<jk>public</jk> String getCity();
+ * 		<jk>public</jk> String getState();
+ * 		<jk>public int</jk> getZip();
+ * 	}
+ *
+ * 	Person p = <jk>new</jk> Person(<js>"John Doe"</js>, 23, <js>"123 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12345, <jk>false</jk>);
+ *
+ * 	<jc>// Produces "$o(name=John Doe,age=23,address=$o(street=123 Main St,city=Anywhere,state=NY,zip=$n(12345)),deceased=$b(false))"</jc>
+ * 	String s = UonSerializer.<jsf>DEFAULT</jsf>.serialize(s);
+ *
+ * 	<jc>// Produces "(name=John Doe,age=23,address=(street=123 Main St,city=Anywhere,state=NY,zip=12345),deceased=false)"</jc>
+ * 	String s = UonSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("text/uon")
+public class UonSerializer extends WriterSerializer {
+
+	/** Reusable instance of {@link UonSerializer}, all default settings. */
+	public static final UonSerializer DEFAULT = new UonSerializer().lock();
+
+	/** Reusable instance of {@link UonSerializer.Simple}. */
+	public static final UonSerializer DEFAULT_SIMPLE = new Simple().lock();
+
+	/** Reusable instance of {@link UonSerializer.Readable}. */
+	public static final UonSerializer DEFAULT_READABLE = new Readable().lock();
+
+	/** Reusable instance of {@link UonSerializer.Encoding}. */
+	public static final UonSerializer DEFAULT_ENCODING = new Encoding().lock();
+
+	/** Reusable instance of {@link UonSerializer.SimpleEncoding}. */
+	public static final UonSerializer DEFAULT_SIMPLE_ENCODING = new SimpleEncoding().lock();
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UonSerializer().setProperty(UonSerializerProperties.<jsf>UON_simpleMode</jsf>,<jk>true</jk>);</code>.
+	 */
+	@Produces(value={"text/uon-simple"},contentType="text/uon")
+	public static class Simple extends UonSerializer {
+		/** Constructor */
+		public Simple() {
+			setProperty(UON_simpleMode, true);
+		}
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UonSerializer().setProperty(UonSerializerProperties.<jsf>UON_useWhitespace</jsf>,<jk>true</jk>);</code>.
+	 */
+	public static class Readable extends UonSerializer {
+		/** Constructor */
+		public Readable() {
+			setProperty(UON_useWhitespace, true);
+			setProperty(SERIALIZER_useIndentation, true);
+		}
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UonSerializer().setProperty(UonSerializerProperties.<jsf>UON_encodeChars</jsf>,<jk>true</jk>);</code>.
+	 */
+	public static class Encoding extends UonSerializer {
+		/** Constructor */
+		public Encoding() {
+			setProperty(UON_encodeChars, true);
+		}
+	}
+
+	/**
+	 * Equivalent to <code><jk>new</jk> UonSerializer().setProperty(UonSerializerProperties.<jsf>UON_simpleMode</jsf>,<jk>true</jk>).setProperty(UonSerializerProperties.<jsf>UON_encodeChars</jsf>,<jk>true</jk>);</code>.
+	 */
+	@Produces(value={"text/uon-simple"},contentType="text/uon")
+	public static class SimpleEncoding extends UonSerializer {
+		/** Constructor */
+		public SimpleEncoding() {
+			setProperty(UON_simpleMode, true);
+			setProperty(UON_encodeChars, true);
+		}
+	}
+
+	/** UON serializer properties currently set on this serializer. */
+	protected transient UonSerializerProperties usp = new UonSerializerProperties();
+
+	/** URL-Encoding properties currently set on this serializer. */
+	protected transient UrlEncodingProperties uep = new UrlEncodingProperties();
+
+
+	/**
+	 * Workhorse method. Determines the type of object, and then calls the
+	 * appropriate type-specific serialization method.
+	 *
+	 * @param out The writer to serialize to.
+	 * @param o The object being serialized.
+	 * @param eType The expected type of the object if this is a bean property.
+	 * @param ctx The context that exist for the duration of a serialize.
+	 * @param attrName The bean property name if this is a bean property.  <jk>null</jk> if this isn't a bean property being serialized.
+	 * @param pMeta The bean property metadata.
+	 * @param quoteEmptyStrings <jk>true</jk> if this is the first entry in an array.
+	 * @param isTop If we haven't recursively called this method.
+	 * @return The same writer passed in.
+	 * @throws SerializeException
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	protected SerializerWriter serializeAnything(UonSerializerWriter out, Object o, ClassMeta<?> eType, UonSerializerContext ctx,
+			String attrName, BeanPropertyMeta pMeta, boolean quoteEmptyStrings, boolean isTop) throws SerializeException {
+		try {
+
+			BeanContext bc = ctx.getBeanContext();
+
+			if (o == null) {
+				out.appendObject(null, false, false, isTop);
+				return out;
+			}
+
+			if (eType == null)
+				eType = object();
+
+			boolean addClassAttr;		// Add "_class" attribute to element?
+			ClassMeta<?> aType;			// The actual type
+			ClassMeta<?> gType;			// The generic type
+
+			aType = ctx.push(attrName, o, eType);
+			boolean isRecursion = aType == null;
+
+			// Handle recursion
+			if (aType == null) {
+				o = null;
+				aType = object();
+			}
+
+			gType = aType.getFilteredClassMeta();
+			addClassAttr = (ctx.isAddClassAttrs() && ! eType.equals(aType));
+
+			// Filter if necessary
+			PojoFilter filter = aType.getPojoFilter();				// The filter
+			if (filter != null) {
+				o = filter.filter(o);
+
+				// If the filter's getFilteredClass() method returns Object, we need to figure out
+				// the actual type now.
+				if (gType.isObject())
+					gType = bc.getClassMetaForObject(o);
+			}
+
+			// '\0' characters are considered null.
+			if (o == null || (gType.isChar() && ((Character)o).charValue() == 0))
+				out.appendObject(null, false, false, isTop);
+			else if (gType.hasToObjectMapMethod())
+				serializeMap(out, gType.toObjectMap(o), eType, ctx);
+			else if (gType.isBean())
+				serializeBeanMap(out, bc.forBean(o), addClassAttr, ctx);
+			else if (gType.isUri() || (pMeta != null && (pMeta.isUri() || pMeta.isBeanUri())))
+				out.appendUri(o, isTop);
+			else if (gType.isMap()) {
+				if (o instanceof BeanMap)
+					serializeBeanMap(out, (BeanMap)o, addClassAttr, ctx);
+				else
+					serializeMap(out, (Map)o, eType, ctx);
+			}
+			else if (gType.isCollection()) {
+				if (addClassAttr)
+					serializeCollectionMap(out, (Collection)o, gType, ctx);
+				else
+					serializeCollection(out, (Collection) o, eType, ctx);
+			}
+			else if (gType.isArray()) {
+				if (addClassAttr)
+					serializeCollectionMap(out, toList(gType.getInnerClass(), o), gType, ctx);
+				else
+					serializeCollection(out, toList(gType.getInnerClass(), o), eType, ctx);
+			}
+			else {
+				out.appendObject(o, quoteEmptyStrings, false, isTop);
+			}
+
+			if (! isRecursion)
+				ctx.pop();
+			return out;
+		} catch (SerializeException e) {
+			throw e;
+		} catch (StackOverflowError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new SerializeException("Exception occured trying to process object of type ''{0}''", (o == null ? null : o.getClass().getName())).initCause(e);
+		}
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private SerializerWriter serializeMap(UonSerializerWriter out, Map m, ClassMeta<?> type, UonSerializerContext ctx) throws IOException, SerializeException {
+
+		m = sort(ctx, m);
+
+		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
+
+		int depth = ctx.getIndent();
+		out.startFlag('o');
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		while (mapEntries.hasNext()) {
+			Map.Entry e = (Map.Entry) mapEntries.next();
+			Object value = e.getValue();
+			Object key = generalize(ctx, e.getKey(), keyType);
+			out.cr(depth).appendObject(key, ctx.useWhitespace, false, false).append('=');
+			serializeAnything(out, value, valueType, ctx, (key == null ? null : key.toString()), null, ctx.useWhitespace, false);
+			if (mapEntries.hasNext())
+				out.append(',');
+		}
+
+		if (m.size() > 0)
+			out.cr(depth-1);
+		out.append(')');
+
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private SerializerWriter serializeCollectionMap(UonSerializerWriter out, Collection o, ClassMeta<?> type, UonSerializerContext ctx) throws IOException, SerializeException {
+		int i = ctx.getIndent();
+		out.startFlag('o').nl();
+		out.append(i, "_class=").appendObject(type, false, false, false).append(',').nl();
+		out.append(i, "items=");
+		ctx.indent++;
+		serializeCollection(out, o, type, ctx);
+		ctx.indent--;
+
+		if (o.size() > 0)
+			out.cr(i-1);
+		out.append(')');
+
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes" })
+	private SerializerWriter serializeBeanMap(UonSerializerWriter out, BeanMap m, boolean addClassAttr, UonSerializerContext ctx) throws IOException, SerializeException {
+		int depth = ctx.getIndent();
+
+		out.startFlag('o');
+
+		Iterator mapEntries = m.entrySet().iterator();
+
+		// Print out "_class" attribute on this bean if required.
+		if (addClassAttr) {
+			String attr = "_class";
+			out.cr(depth).appendObject(attr, false, false, false).append('=').append(m.getClassMeta().getInnerClass().getName());
+			if (mapEntries.hasNext())
+				out.append(',');
+		}
+
+		boolean addComma = false;
+
+		while (mapEntries.hasNext()) {
+			BeanMapEntry p = (BeanMapEntry)mapEntries.next();
+			BeanPropertyMeta pMeta = p.getMeta();
+
+			String key = p.getKey();
+			Object value = null;
+			try {
+				value = p.getValue();
+			} catch (StackOverflowError e) {
+				throw e;
+			} catch (Throwable t) {
+				ctx.addBeanGetterWarning(pMeta, t);
+			}
+
+			if (canIgnoreValue(ctx, pMeta.getClassMeta(), key, value))
+				continue;
+
+			if (addComma)
+				out.append(',');
+
+			out.cr(depth).appendObject(key, false, false, false).append('=');
+
+			serializeAnything(out, value, pMeta.getClassMeta(), ctx, key, pMeta, false, false);
+
+			addComma = true;
+		}
+
+		if (m.size() > 0)
+			out.cr(depth-1);
+		out.append(')');
+
+		return out;
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private SerializerWriter serializeCollection(UonSerializerWriter out, Collection c, ClassMeta<?> type, UonSerializerContext ctx) throws IOException, SerializeException {
+
+		ClassMeta<?> elementType = type.getElementType();
+
+		c = sort(ctx, c);
+
+		out.startFlag('a');
+
+		int depth = ctx.getIndent();
+		boolean quoteEmptyString = (c.size() == 1 || ctx.useWhitespace);
+
+		for (Iterator i = c.iterator(); i.hasNext();) {
+			out.cr(depth);
+			serializeAnything(out, i.next(), elementType, ctx, "<iterator>", null, quoteEmptyString, false);
+			if (i.hasNext())
+				out.append(',');
+		}
+
+		if (c.size() > 0)
+			out.cr(depth-1);
+		out.append(')');
+
+		return out;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	public UonSerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new UonSerializerContext(getBeanContext(), sp, usp, uep, properties, javaMethod);
+	}
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		UonSerializerContext uctx = (UonSerializerContext)ctx;
+		serializeAnything(uctx.getWriter(out), o, null, uctx, "root", null, false, true);
+	}
+
+	@Override /* CoreApi */
+	public UonSerializer setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! usp.setProperty(property, value))
+			if (! uep.setProperty(property, value))
+				super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonSerializer setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonSerializer addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonSerializer addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> UonSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UonSerializer setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UonSerializer lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UonSerializer clone() {
+		try {
+			UonSerializer c = (UonSerializer)super.clone();
+			c.usp = usp.clone();
+			c.uep = uep.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.class
new file mode 100755
index 0000000..d1e9fd4
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.java
new file mode 100755
index 0000000..849afef
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerContext.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.urlencoding.UonSerializerProperties.*;
+import static com.ibm.juno.core.urlencoding.UrlEncodingProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of {@link UonSerializer} and {@link UrlEncodingSerializer}.
+ * <p>
+ * 	See {@link SerializerContext} for details.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class UonSerializerContext extends SerializerContext {
+
+	boolean simpleMode, useWhitespace, encodeChars, expandedParams;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp Default general serializer properties.
+	 * @param usp Default UON serializer properties.
+	 * @param uep Default URL-Encoding properties.
+	 * @param op Override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	protected UonSerializerContext(BeanContext beanContext, SerializerProperties sp, UonSerializerProperties usp, UrlEncodingProperties uep, ObjectMap op, Method javaMethod) {
+		super(beanContext, sp, op, javaMethod);
+		if (op == null || op.isEmpty()) {
+			simpleMode = usp.simpleMode;
+			useWhitespace = usp.useWhitespace;
+			encodeChars = usp.encodeChars;
+			expandedParams = uep.expandedParams;
+		} else {
+			simpleMode = op.getBoolean(UON_simpleMode, usp.simpleMode);
+			useWhitespace = op.getBoolean(UON_useWhitespace, usp.useWhitespace);
+			encodeChars = op.getBoolean(UON_encodeChars, usp.encodeChars);
+			expandedParams = op.getBoolean(URLENC_expandedParams, uep.expandedParams);
+
+		}
+	}
+
+	/**
+	 * Returns the {@link UonSerializerProperties#UON_simpleMode} setting value in this context.
+	 *
+	 * @return The {@link UonSerializerProperties#UON_simpleMode} setting value in this context.
+	 */
+	public final boolean isSimpleMode() {
+		return simpleMode;
+	}
+
+	/**
+	 * Returns the {@link UonSerializerProperties#UON_encodeChars} setting value in this context.
+	 *
+	 * @return The {@link UonSerializerProperties#UON_encodeChars} setting value in this context.
+	 */
+	public final boolean isEncodeChars() {
+		return encodeChars;
+	}
+
+	/**
+	 * Returns the {@link UrlEncodingProperties#URLENC_expandedParams} setting value in this context.
+	 *
+	 * @return The {@link UrlEncodingProperties#URLENC_expandedParams} setting value in this context.
+	 */
+	public final boolean isExpandedParams() {
+		return expandedParams;
+	}
+
+	/**
+	 * Wraps the specified writer in a {@link UonSerializerWriter}.
+	 *
+	 * @param out The writer to wrap.
+	 * @return The wrapped writer.
+	 */
+	protected UonSerializerWriter getWriter(Writer out) {
+		if (out instanceof UonSerializerWriter)
+			return (UonSerializerWriter)out;
+		return new UonSerializerWriter(out, useWhitespace, isSimpleMode(), isEncodeChars(), getRelativeUriBase(), getAbsolutePathUriBase());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.class
new file mode 100755
index 0000000..d8f0914
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.java
new file mode 100755
index 0000000..e6912fb
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerProperties.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Configurable properties on the {@link UonSerializer} and {@link UrlEncodingSerializer} classes.
+ * <p>
+ * 	Use the {@link UonSerializer#setProperty(String, Object)} method to set property values.
+ * <p>
+ * 	In addition to these properties, the following properties are also applicable for {@link UonSerializer}.
+ * <ul>
+ * 	<li>{@link SerializerProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class UonSerializerProperties implements Cloneable {
+
+	/**
+	 * Use simplified output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, type flags will not be prepended to values in most cases.
+	 * <p>
+	 * Use this setting if the data types of the values (e.g. object/array/boolean/number/string)
+	 * 	is known on the receiving end.
+	 * <p>
+	 * It should be noted that the default behavior produces a data structure that can
+	 * 	be losslessly converted into JSON, and any JSON can be losslessly represented
+	 * 	in a URL-encoded value.  However, this strict equivalency does not exist
+	 * 	when simple mode is used.
+	 * <p>
+	 * <table class='styled'>
+	 * 	<tr>
+	 * 		<th>Input (in JSON)</th>
+	 * 		<th>Normal mode output</th>
+	 * 		<th>Simple mode output</th>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>{foo:'bar',baz:'bing'}</td>
+	 * 		<td class='code'>$o(foo=bar,baz=bing)</td>
+	 * 		<td class='code'>(foo=bar,baz=bing)</td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>{foo:{bar:'baz'}}</td>
+	 * 		<td class='code'>$o(foo=$o(bar=baz))</td>
+	 * 		<td class='code'>(foo=(bar=baz))</td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>['foo','bar']</td>
+	 * 		<td class='code'>$a(foo,bar)</td>
+	 * 		<td class='code'>(foo,bar)</td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>['foo',['bar','baz']]</td>
+	 * 		<td class='code'>$a(foo,$a(bar,baz))</td>
+	 * 		<td class='code'>(foo,(bar,baz))</td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>true</td>
+	 * 		<td class='code'>$b(true)</td>
+	 * 		<td class='code'>true</td>
+	 * 	</tr>
+	 * 	<tr>
+	 * 		<td class='code'>123</td>
+	 * 		<td class='code'>$n(123)</td>
+	 * 		<td class='code'>123</td>
+	 * 	</tr>
+	 * </table>
+	 */
+	public static final String UON_simpleMode = "UonSerializer.simpleMode";
+
+	/**
+	 * Use whitespace in output ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
+	 */
+	public static final String UON_useWhitespace = "UonSerializer.useWhitespace";
+
+	/**
+	 * Encode non-valid URI characters to <js>"%xx"</js> constructs. ({@link Boolean}, default=<jk>false</jk> for {@link UonSerializer}, <jk>true</jk> for {@link UrlEncodingSerializer}).
+	 * <p>
+	 * If <jk>true</jk>, non-valid URI characters will be converted to <js>"%xx"</js> sequences.
+	 * Set to <jk>false</jk> if parameter value is being passed to some other code that will already
+	 * 	perform URL-encoding of non-valid URI characters.
+	 */
+	public static final String UON_encodeChars = "UonSerializer.encodeChars";
+
+	boolean
+		simpleMode = false,
+		useWhitespace = false,
+		encodeChars = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(UON_simpleMode))
+			simpleMode = bc.convertToType(value, Boolean.class);
+		else if (property.equals(UON_useWhitespace))
+			useWhitespace = bc.convertToType(value, Boolean.class);
+		else if (property.equals(UON_encodeChars))
+			encodeChars = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public UonSerializerProperties clone() {
+		try {
+			return (UonSerializerProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.class
new file mode 100755
index 0000000..4fc3d48
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.java
new file mode 100755
index 0000000..3205234
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UonSerializerWriter.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import java.io.*;
+
+import com.ibm.juno.core.serializer.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Specialized writer for serializing UON-encoded text.
+ * <p>
+ * 	<b>Note:  This class is not intended for external use.</b>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class UonSerializerWriter extends SerializerWriter {
+
+	private final boolean simpleMode, encodeChars;
+
+	// Characters that do not need to be URL-encoded in strings.
+	private static final AsciiSet unencodedChars = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;/?:@-_.!*'$(),~=");
+
+	// Characters that do not need to be URL-encoded in attribute names.
+	// Identical to unencodedChars, but excludes '='.
+	private static final AsciiSet unencodedCharsAttrName = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;/?:@-_.!*'$(),~");
+
+	// Characters that need to be preceeded with an escape character.
+	private static final AsciiSet escapedChars = new AsciiSet(",()~=");
+
+	// AsciiSet that maps no characters.
+	private static final AsciiSet emptyCharSet = new AsciiSet("");
+
+	private static char[] hexArray = "0123456789ABCDEF".toCharArray();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param out The writer being wrapped.
+	 * @param useIndentation If <jk>true</jk>, tabs will be used in output.
+	 * @param simpleMode If <jk>true</jk>, type flags will not be generated in output.
+	 * @param encodeChars If <jk>true</jk>, special characters should be encoded.
+	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
+	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
+	 */
+	protected UonSerializerWriter(Writer out, boolean useIndentation, boolean simpleMode, boolean encodeChars, String relativeUriBase, String absolutePathUriBase) {
+		super(out, useIndentation, false, '\'', relativeUriBase, absolutePathUriBase);
+		this.simpleMode = simpleMode;
+		this.encodeChars = encodeChars;
+	}
+
+	/**
+	 * Serializes the specified simple object as a UON string value.
+	 *
+	 * @param o The object being serialized.
+	 * @param quoteEmptyStrings Special case where we're serializing an array containing an empty string.
+	 * @param isTopAttrName If this is a top-level attribute name we're serializing.
+	 * @param isTop If this is a top-level value we're serializing.
+	 * @return This object (for method chaining).
+	 * @throws IOException Should never happen.
+	 */
+	protected UonSerializerWriter appendObject(Object o, boolean quoteEmptyStrings, boolean isTopAttrName, boolean isTop) throws IOException {
+
+		char typeFlag = 0;
+
+		if (o == null)
+			o = "\u0000";
+		else if (o.equals("\u0000"))
+			typeFlag = 's';
+
+		String s = o.toString();
+		if (s.isEmpty()) {
+			if (quoteEmptyStrings)
+				typeFlag = 's';
+		} else if (s.charAt(0) == '(' || s.charAt(0) == '$') {
+			typeFlag = 's';
+		} else if (useIndentation && (s.indexOf('\n') != -1 || (s.charAt(0) <= ' ' && s.charAt(0) != 0))) {
+			// Strings containing newline characters must always be quoted so that they're not confused with whitespace.
+			// Also, strings starting with whitespace must be quoted so that the contents are not ignored when whitespace is ignored.
+			typeFlag = 's';
+		} else if (! simpleMode) {
+			if (o instanceof Boolean)
+				typeFlag = 'b';
+			else if (o instanceof Number)
+				typeFlag = 'n';
+		}
+
+		if (typeFlag != 0)
+			startFlag(typeFlag);
+
+		AsciiSet unenc = (isTopAttrName ? unencodedCharsAttrName : unencodedChars);
+		AsciiSet esc = (isTop && typeFlag == 0 ? emptyCharSet : escapedChars);
+
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (esc.contains(c))
+				append('~');
+			if ((!encodeChars) || unenc.contains(c))
+				append(c);
+			else {
+				if (c == ' ')
+					append('+');
+				else {
+					int p = s.codePointAt(i);
+					if (p < 0x0080)
+						appendHex(p);
+					else if (p < 0x0800) {
+						int p1=p>>>6;
+						appendHex(p1+192).appendHex((p&63)+128);
+					} else if (p < 0x10000) {
+						int p1=p>>>6, p2=p1>>>6;
+						appendHex(p2+224).appendHex((p1&63)+128).appendHex((p&63)+128);
+					} else {
+						i++;  // Two-byte codepoint...skip past surrogate pair lower byte.
+						int p1=p>>>6, p2=p1>>>6, p3=p2>>>6;
+						appendHex(p3+240).appendHex((p2&63)+128).appendHex((p1&63)+128).appendHex((p&63)+128);
+					}
+				}
+			}
+		}
+
+		if (typeFlag != 0)
+			append(')');
+
+		return this;
+	}
+
+	/**
+	 * Prints <code>$f(</code> in normal mode, and <code>(</code> in simple mode.
+	 *
+	 * @param f The flag character.
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	protected UonSerializerWriter startFlag(char f) throws IOException {
+		if (f != 's' && ! simpleMode)
+			append('$').append(f);
+		append('(');
+		return this;
+	}
+
+	/**
+	 * Prints out a two-byte %xx sequence for the given byte value.
+	 */
+	private UonSerializerWriter appendHex(int b) throws IOException {
+		if (b > 255)
+			throw new IOException("Invalid value passed to appendHex.  Must be in the range 0-255.  Value=" + b);
+		append('%').append(hexArray[b>>>4]).append(hexArray[b&0x0F]);
+		return this;
+	}
+
+	/**
+	 * Appends a URI to the output.
+	 *
+	 * @param uri The URI to append to the output.
+	 * @param isTop If this is a top-level value we're serializing.
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	public SerializerWriter appendUri(Object uri, boolean isTop) throws IOException {
+		String s = uri.toString();
+		if (s.indexOf("://") == -1) {
+			if (StringUtils.startsWith(s, '/')) {
+				if (absolutePathUriBase != null)
+					append(absolutePathUriBase);
+			} else {
+				if (relativeUriBase != null) {
+					append(relativeUriBase);
+					if (! relativeUriBase.equals("/"))
+						append("/");
+
+				}
+			}
+		}
+		return appendObject(s, false, false, isTop);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter cr(int depth) throws IOException {
+		super.cr(depth);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter appendln(int indent, String text) throws IOException {
+		super.appendln(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter appendln(String text) throws IOException {
+		super.appendln(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter append(int indent, String text) throws IOException {
+		super.append(indent, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter append(int indent, char c) throws IOException {
+		super.append(indent, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter q() throws IOException {
+		super.q();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter i(int indent) throws IOException {
+		super.i(indent);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter nl() throws IOException {
+		super.nl();
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter append(Object text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter append(String text) throws IOException {
+		super.append(text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter appendIf(boolean b, String text) throws IOException {
+		super.appendIf(b, text);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter appendIf(boolean b, char c) throws IOException {
+		super.appendIf(b, c);
+		return this;
+	}
+
+	@Override /* SerializerWriter */
+	public UonSerializerWriter append(char c) throws IOException {
+		super.append(c);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.class
new file mode 100755
index 0000000..307849c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.java
new file mode 100755
index 0000000..884dd1c
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingClassMeta.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import com.ibm.juno.core.urlencoding.annotation.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Metadata on classes specific to the URL-Encoding serializers and parsers pulled from the {@link UrlEncoding @UrlEncoding} annotation on the class.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class UrlEncodingClassMeta {
+
+	private final UrlEncoding urlEncoding;
+	private final boolean expandedParams;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param c The class that this annotation is defined on.
+	 */
+	public UrlEncodingClassMeta(Class<?> c) {
+		this.urlEncoding = ReflectionUtils.getAnnotation(UrlEncoding.class, c);
+		if (urlEncoding != null) {
+			expandedParams = urlEncoding.expandedParams();
+		} else {
+			expandedParams = false;
+		}
+	}
+
+	/**
+	 * Returns the {@link UrlEncoding} annotation defined on the class.
+	 *
+	 * @return The value of the {@link UrlEncoding} annotation, or <jk>null</jk> if annotation is not specified.
+	 */
+	protected UrlEncoding getAnnotation() {
+		return urlEncoding;
+	}
+
+	/**
+	 * Returns the {@link UrlEncoding#expandedParams()} annotation defined on the class.
+	 *
+	 * @return The value of the {@link UrlEncoding#expandedParams()} annotation.
+	 */
+	protected boolean isExpandedParams() {
+		return expandedParams;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.class
new file mode 100755
index 0000000..9b91ca9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.java
new file mode 100755
index 0000000..feb4548
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingParser.java
@@ -0,0 +1,568 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2013, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import static com.ibm.juno.core.urlencoding.UonParserProperties.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parses URL-encoded text into POJO models.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Content-Type</code> types: <code>application/x-www-form-urlencoded</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Parses URL-Encoded text (e.g. <js>"foo=bar&baz=bing"</js>) into POJOs.
+ * <p>
+ * 	Expects parameter values to be in UON notation.
+ * <p>
+ * 	This parser uses a state machine, which makes it very fast and efficient.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link UonParserProperties}
+ * 	<li>{@link ParserProperties}
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@SuppressWarnings({ "rawtypes", "unchecked", "hiding" })
+@Consumes("application/x-www-form-urlencoded")
+public class UrlEncodingParser extends UonParser {
+
+	/** Reusable instance of {@link UrlEncodingParser}. */
+	public static final UrlEncodingParser DEFAULT = new UrlEncodingParser().lock();
+
+	/** Reusable instance of {@link UrlEncodingParser}. */
+	public static final UrlEncodingParser DEFAULT_WS_AWARE = new UrlEncodingParser().setProperty(UON_whitespaceAware, true).lock();
+
+	/**
+	 * Constructor.
+	 */
+	public UrlEncodingParser() {
+		setProperty(UON_decodeChars, true);
+	}
+
+	private <T> T parseAnything(ClassMeta<T> nt, UonParserContext ctx, ParserReader r, Object outer, Object name) throws ParseException {
+
+		BeanContext bc = ctx.getBeanContext();
+		if (nt == null)
+			nt = (ClassMeta<T>)object();
+		PojoFilter<T,Object> filter = (PojoFilter<T,Object>)nt.getPojoFilter();
+		ClassMeta<?> ft = nt.getFilteredClassMeta();
+
+		try {
+			int c = r.peek();
+			if (c == '?')
+				r.read();
+
+			Object o;
+
+			if (ft.isObject()) {
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap(ctx, r, m, bc.string(), bc.object());
+				o = m.cast();
+			} else if (ft.isMap()) {
+				Map m = (ft.canCreateNewInstance() ? (Map)ft.newInstance() : new ObjectMap(bc));
+				o = parseIntoMap(ctx, r, m, ft.getKeyType(), ft.getValueType());
+			} else if (ft.canCreateNewInstanceFromObjectMap(outer)) {
+				ObjectMap m = new ObjectMap(bc);
+				parseIntoMap(ctx, r, m, string(), object());
+				o = ft.newInstanceFromObjectMap(outer, m);
+			} else if (ft.canCreateNewBean(outer)) {
+				BeanMap m = bc.newBeanMap(outer, ft.getInnerClass());
+				m = parseIntoBeanMap(ctx, r, m);
+				o = m == null ? null : m.getBean();
+			} else {
+				// It could be a non-bean with _class attribute.
+				ObjectMap m = new ObjectMap(bc);
+				ClassMeta<Object> valueType = object();
+				parseIntoMap(ctx, r, m, string(), valueType);
+				if (m.containsKey("_class"))
+					o = m.cast();
+				else if (m.containsKey("_value"))
+					o = ctx.getBeanContext().convertToType(m.get("_value"), ft);
+				else if (ft.isCollection()) {
+					// ?1=foo&2=bar...
+					Collection c2 = ft.canCreateNewInstance() ? (Collection)ft.newInstance() : new ObjectList(bc);
+					Map<Integer,Object> t = new TreeMap<Integer,Object>();
+					for (Map.Entry<String,Object> e : m.entrySet()) {
+						String k = e.getKey();
+						if (StringUtils.isNumeric(k))
+							t.put(Integer.valueOf(k), bc.convertToType(e.getValue(), ft.getElementType()));
+					}
+					c2.addAll(t.values());
+					o = c2;
+				} else {
+					if (ft.getNotABeanReason() != null)
+						throw new ParseException("Class ''{0}'' could not be instantiated as application/x-www-form-urlencoded.  Reason: ''{1}''", ft, ft.getNotABeanReason());
+					throw new ParseException("Malformed application/x-www-form-urlencoded input for class ''{0}''.", ft);
+				}
+			}
+
+			if (filter != null && o != null)
+				o = filter.unfilter(o, nt);
+
+			if (outer != null)
+				setParent(nt, o, outer);
+
+			if (name != null)
+				setName(nt, o, name);
+
+			return (T)o;
+
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new ParseException("Error occurred trying to parse into class ''{0}''", ft).initCause(e);
+		}
+	}
+
+	private <K,V> Map<K,V> parseIntoMap(UonParserContext ctx, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws ParseException, IOException {
+
+		if (keyType == null)
+			keyType = (ClassMeta<K>)string();
+
+		int c = r.peek();
+		if (c == -1)
+			return m;
+
+		final int S1=1; // Looking for attrName start.
+		final int S2=2; // Found attrName end, looking for =.
+		final int S3=3; // Found =, looking for valStart.
+		final int S4=4; // Looking for & or end.
+		boolean isInEscape = false;
+
+		int state = S1;
+		K currAttr = null;
+		while (c != -1) {
+			c = r.read();
+			if (! isInEscape) {
+				if (state == S1) {
+					if (c == -1)
+						return m;
+					r.unread();
+					Object attr = parseAttr(r, true, ctx);
+					currAttr = ctx.getBeanContext().convertToType(attr, keyType);
+					state = S2;
+					c = 0; // Avoid isInEscape if c was '\'
+				} else if (state == S2) {
+					if (c == '\u0002')
+						state = S3;
+					else if (c == -1 || c == '\u0001') {
+						m.put(currAttr, null);
+						if (c == -1)
+							return m;
+						state = S1;
+					}
+				} else if (state == S3) {
+					if (c == -1 || c == '\u0001') {
+						V value = convertAttrToType(m, "", valueType);
+						m.put(currAttr, value);
+						if (c == -1)
+							return m;
+						state = S1;
+					} else  {
+						// For performance, we bypass parseAnything for string values.
+						V value = (V)(valueType.isString() ? super.parseString(r.unread(), true, ctx) : super.parseAnything(valueType, ctx, r.unread(), null, m, true, null));
+
+						// If we already encountered this parameter, turn it into a list.
+						if (m.containsKey(currAttr) && valueType.isObject()) {
+							Object v2 = m.get(currAttr);
+							if (! (v2 instanceof ObjectList)) {
+								v2 = new ObjectList(v2);
+								m.put(currAttr, (V)v2);
+							}
+							((ObjectList)v2).add(value);
+						} else {
+						m.put(currAttr, value);
+						}
+						state = S4;
+						c = 0; // Avoid isInEscape if c was '\'
+					}
+				} else if (state == S4) {
+					if (c == '\u0001')
+						state = S1;
+					else if (c == -1) {
+						return m;
+					}
+				}
+			}
+			isInEscape = (c == '\\' && ! isInEscape);
+		}
+		if (state == S1)
+			throw new ParseException("Could not find attribute name on object.");
+		if (state == S2)
+			throw new ParseException("Could not find '=' following attribute name on object.");
+		if (state == S3)
+			throw new ParseException("Dangling '=' found in object entry");
+		if (state == S4)
+			throw new ParseException("Could not find end of object.");
+
+		return null; // Unreachable.
+	}
+
+	private <T> BeanMap<T> parseIntoBeanMap(UonParserContext ctx, ParserReader r, BeanMap<T> m) throws ParseException, IOException {
+		int line = r.getLine();
+		int column = r.getColumn();
+
+		int c = r.peek();
+		if (c == -1)
+			return m;
+
+		final int S1=1; // Looking for attrName start.
+		final int S2=2; // Found attrName end, looking for =.
+		final int S3=3; // Found =, looking for valStart.
+		final int S4=4; // Looking for , or }
+		boolean isInEscape = false;
+
+		int state = S1;
+		String currAttr = "";
+		int currAttrLine = -1, currAttrCol = -1;
+		while (c != -1) {
+			c = r.read();
+			if (! isInEscape) {
+				if (state == S1) {
+					if (c == -1) {
+						return m;
+					}
+					r.unread();
+					currAttrLine= r.getLine();
+					currAttrCol = r.getColumn();
+					currAttr = parseAttrName(r, true);
+					if (currAttr == null)  // Value was '%00'
+						return null;
+					state = S2;
+				} else if (state == S2) {
+					if (c == '\u0002')
+						state = S3;
+					else if (c == -1 || c == '\u0001') {
+						m.put(currAttr, null);
+						if (c == -1)
+							return m;
+						state = S1;
+					}
+				} else if (state == S3) {
+					if (c == -1 || c == '\u0001') {
+						if (! currAttr.equals("_class")) {
+							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
+							if (pMeta == null) {
+								if (m.getMeta().isSubTyped()) {
+									m.put(currAttr, "");
+								} else {
+									onUnknownProperty(ctx, currAttr, m, currAttrLine, currAttrCol);
+								}
+							} else {
+								try {
+									// In cases of "&foo=", create an empty instance of the value if createable.
+									// Otherwise, leave it null.
+									ClassMeta<?> cm = pMeta.getClassMeta();
+									if (cm.canCreateNewInstance())
+										pMeta.set(m, cm.newInstance());
+								} catch (Exception e) {
+									throw new ParseException(e);
+								}
+							}
+						}
+						if (c == -1)
+							return m;
+						state = S1;
+					} else {
+						if (! currAttr.equals("_class")) {
+							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
+							if (pMeta == null) {
+								if (m.getMeta().isSubTyped()) {
+									m.put(currAttr, parseAnything(object(), ctx, r.unread(), null, m.getBean(false), true, currAttr));
+								} else {
+									onUnknownProperty(ctx, currAttr, m, currAttrLine, currAttrCol);
+									parseAnything(object(), ctx, r.unread(), null, m.getBean(false), true, null); // Read content anyway to ignore it
+								}
+							} else {
+								if (shouldUseExpandedParams(pMeta, ctx)) {
+									ClassMeta cm = pMeta.getClassMeta();
+									Object value = parseAnything(cm.getElementType(), ctx, r.unread(), pMeta, m.getBean(false), true, currAttr);
+									pMeta.add(m, value);
+								} else {
+									Object value = parseAnything(pMeta.getClassMeta(), ctx, r.unread(), pMeta, m.getBean(false), true, currAttr);
+									pMeta.set(m, value);
+								}
+							}
+						}
+						state = S4;
+					}
+				} else if (state == S4) {
+					if (c == '\u0001')
+						state = S1;
+					else if (c == -1) {
+						return m;
+					}
+				}
+			}
+			isInEscape = (c == '\\' && ! isInEscape);
+		}
+		if (state == S1)
+			throw new ParseException(line, column, "Could not find attribute name on object.");
+		if (state == S2)
+			throw new ParseException(line, column, "Could not find '=' following attribute name on object.");
+		if (state == S3)
+			throw new ParseException(line, column, "Could not find value following '=' on object.");
+		if (state == S4)
+			throw new ParseException(line, column, "Could not find end of object.");
+
+		return null; // Unreachable.
+	}
+
+	/**
+	 * Returns true if the specified bean property should be expanded as multiple key-value pairs.
+	 */
+	private final boolean shouldUseExpandedParams(BeanPropertyMeta<?> pMeta, UonParserContext ctx) {
+		ClassMeta cm = pMeta.getClassMeta();
+		if (cm.isArray() || cm.isCollection()) {
+			if (ctx.isExpandedParams())
+				return true;
+			if (pMeta.getBeanMeta().getClassMeta().getUrlEncodingMeta().isExpandedParams())
+				return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Parse a URL query string into a simple map of key/value pairs.
+	 *
+	 * @param qs The query string to parse.
+	 * @return A sorted {@link TreeMap} of query string entries.
+	 * @throws IOException
+	 */
+	public Map<String,String[]> parseIntoSimpleMap(String qs) throws IOException {
+
+		Map<String,String[]> m = new TreeMap<String,String[]>();
+
+		if (StringUtils.isEmpty(qs))
+			return m;
+
+		UonParserReader r = new UonParserReader(qs, true);
+
+		final int S1=1; // Looking for attrName start.
+		final int S2=2; // Found attrName start, looking for = or & or end.
+		final int S3=3; // Found =, looking for valStart.
+		final int S4=4; // Found valStart, looking for & or end.
+
+		try {
+			int c = r.peek();
+			if (c == '?')
+				r.read();
+
+			int state = S1;
+			String currAttr = null;
+			while (c != -1) {
+				c = r.read();
+				if (state == S1) {
+					if (c != -1) {
+						r.unread();
+						r.mark();
+						state = S2;
+					}
+				} else if (state == S2) {
+					if (c == -1) {
+						add(m, r.getMarked(), null);
+					} else if (c == '\u0001') {
+						m.put(r.getMarked(0,-1), null);
+						state = S1;
+					} else if (c == '\u0002') {
+						currAttr = r.getMarked(0,-1);
+						state = S3;
+					}
+				} else if (state == S3) {
+					if (c == -1 || c == '\u0001') {
+						add(m, currAttr, "");
+					} else {
+						if (c == '\u0002')
+							r.replace('=');
+						r.unread();
+						r.mark();
+						state = S4;
+					}
+				} else if (state == S4) {
+					if (c == -1) {
+						add(m, currAttr, r.getMarked());
+					} else if (c == '\u0001') {
+						add(m, currAttr, r.getMarked(0,-1));
+						state = S1;
+					} else if (c == '\u0002') {
+						r.replace('=');
+					}
+				}
+			}
+		} finally {
+			r.close();
+		}
+
+		return m;
+	}
+
+	private static void add(Map<String,String[]> m, String key, String val) {
+		boolean b = m.containsKey(key);
+		if (val == null) {
+			if (! b)
+				m.put(key, null);
+		} else if (b && m.get(key) != null) {
+			m.put(key, ArrayUtils.append(m.get(key), val));
+		} else {
+			m.put(key, new String[]{val});
+		}
+	}
+
+	private Object[] parseArgs(UonParserContext ctx, ParserReader r, ClassMeta<?>[] argTypes) throws ParseException {
+		// TODO - This can be made more efficient.
+		BeanContext bc = ctx.getBeanContext();
+		ClassMeta<TreeMap<Integer,String>> cm = bc.getMapClassMeta(TreeMap.class, Integer.class, String.class);
+		TreeMap<Integer,String> m = parseAnything(cm, ctx, r, ctx.getOuter(), null);
+		Object[] vals = m.values().toArray(new Object[m.size()]);
+		if (vals.length != argTypes.length)
+			throw new ParseException("Argument lengths don't match.  vals={0}, argTypes={1}", vals.length, argTypes.length);
+		for (int i = 0; i < vals.length; i++) {
+			String s = String.valueOf(vals[i]);
+			vals[i] = super.parseAnything(argTypes[i], ctx, ctx.getUrlEncodingParserReader(new StringReader(s), s.length()), null, ctx.getOuter(), true, null);
+		}
+
+		return vals;
+	}
+
+	/**
+	 * Parses a single query parameter value into the specified class type.
+	 *
+	 * @param in The input query string value.
+	 * @param type The class type of the object to create.
+	 * @return A new instance of the specified type.
+	 * @throws ParseException
+	 */
+	public <T> T parseParameter(CharSequence in, ClassMeta<T> type) throws ParseException {
+		if (in == null)
+			return null;
+		UonParserContext uctx = (UonParserContext)createContext();
+		uctx.decodeChars = false;
+		UonParserReader r = uctx.getUrlEncodingParserReader(wrapReader(in), in.length());
+		return super.parseAnything(type, uctx, r, null, null, true, null);
+	}
+
+	/**
+	 * Parses a single query parameter value into the specified class type.
+	 *
+	 * @param in The input query string value.
+	 * @param type The class type of the object to create.
+	 * @return A new instance of the specified type.
+	 * @throws ParseException
+	 */
+	public <T> T parseParameter(CharSequence in, Class<T> type) throws ParseException {
+		return parseParameter(in, getBeanContext().getClassMeta(type));
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		type = ctx.getBeanContext().normalizeClassMeta(type);
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		T o = parseAnything(type, uctx, r, ctx.getOuter(), null);
+		return o;
+	}
+
+	@Override /* ReaderParser */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		Object[] a = parseArgs(uctx, r, argTypes);
+		return a;
+	}
+
+	@Override /* ReaderParser */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		UonParserContext uctx = (UonParserContext)ctx;
+		UonParserReader r = uctx.getUrlEncodingParserReader(in, estimatedSize);
+		if (r.peek() == '?')
+			r.read();
+		m = parseIntoMap(uctx, r, m, ctx.getBeanContext().getClassMeta(keyType), ctx.getBeanContext().getClassMeta(valueType));
+		return m;
+	}
+
+	@Override /* Parser */
+	public UrlEncodingParser setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! upp.setProperty(property, value))
+			if (! uep.setProperty(property, value))
+				super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingParser setProperties(ObjectMap properties) throws LockedException {
+		for (Map.Entry<String,Object> e : properties.entrySet())
+			setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> UrlEncodingParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public UrlEncodingParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UrlEncodingParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public UrlEncodingParser clone() {
+		UrlEncodingParser c = (UrlEncodingParser)super.clone();
+		c.upp = upp.clone();
+		c.uep = uep.clone();
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.class
new file mode 100755
index 0000000..2e6d92e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.java
new file mode 100755
index 0000000..4c65132
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingProperties.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.urlencoding;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Configurable properties on the {@link UrlEncodingSerializer} and {@link UrlEncodingParser} classes.
+ * <p>
+ * 	Use the {@link UrlEncodingSerializer#setProperty(String, Object)} and
+ * 	{@link UrlEncodingParser#setProperty(String, Object)} methods to set property values.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class UrlEncodingProperties implements Cloneable {
+
+	/**
+	 * Serialize bean property collections/arrays as separate key/value pairs ({@link Boolean}, default=<jk>false</jk>).
+	 * <p>
+	 * 	If <jk>false</jk>, serializing the array <code>[1,2,3]</code> results in <code>?key=$a(1,2,3)</code>.
+	 * 	If <jk>true</jk>, serializing the same array results in <code>?key=1&key=2&key=3</code>.
+	 * <p>
+	 * 	Example:
+	 * <p class='bcode'>
+	 * 	<jk>public class</jk> A {
+	 * 		<jk>public</jk> String[] f1 = {<js>"a"</js>,<js>"b"</js>};
+	 * 		<jk>public</jk> List&lt;String&gt; f2 = <jk>new</jk> LinkedList&lt;String&gt;(Arrays.<jsm>asList</jsm>(<jk>new</jk> String[]{<js>"c"</js>,<js>"d"</js>}));
+	 * 	}
+	 *
+	 * 	UrlEncodingSerializer s1 = <jk>new</jk> UrlEncodingParser();
+	 * 	UrlEncodingSerializer s2 = <jk>new</jk> UrlEncodingParser().setProperty(UrlEncodingProperties.<jsf>URLENC_expandedParams</jsf>, <jk>true</jk>);
+	 *
+	 * 	String s1 = p1.serialize(<jk>new</jk> A()); <jc>// Produces "f1=(a,b)&f2=(c,d)"</jc>
+	 * 	String s2 = p2.serialize(<jk>new</jk> A()); <jc>// Produces "f1=a&f1=b&f2=c&f2=d"</jc>
+	 * </p>
+	 * <p>
+	 * 	<b>Important note:</b>  If parsing multi-part parameters, it's highly recommended to use Collections or Lists
+	 * 	as bean property types instead of arrays since arrays have to be recreated from scratch every time a value
+	 * 	is added to it.
+	 * <p>
+	 * 	This option only applies to beans.
+	 */
+	public static final String URLENC_expandedParams = "UrlEncoding.expandedParams";
+
+	boolean
+		expandedParams = false;
+
+	/**
+	 * Sets the specified property value.
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @return <jk>true</jk> if property name was valid and property was set.
+	 */
+	public boolean setProperty(String property, Object value) {
+		BeanContext bc = BeanContext.DEFAULT;
+		if (property.equals(URLENC_expandedParams))
+			expandedParams = bc.convertToType(value, Boolean.class);
+		else
+			return false;
+		return true;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Cloneable */
+	public UrlEncodingProperties clone() {
+		try {
+			return (UrlEncodingProperties)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Readable.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Readable.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Readable.class
new file mode 100755
index 0000000..37a40a0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Readable.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Simple.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Simple.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Simple.class
new file mode 100755
index 0000000..51f3f69
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$Simple.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$SimpleExpanded.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$SimpleExpanded.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$SimpleExpanded.class
new file mode 100755
index 0000000..e11f2ac
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer$SimpleExpanded.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.class
new file mode 100755
index 0000000..83bb958
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/UrlEncodingSerializer.class differ


[38/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1.class
new file mode 100755
index 0000000..8606092
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1Filter.class
new file mode 100755
index 0000000..040d4be
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC1Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2.class
new file mode 100755
index 0000000..e4e62f2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2Filter.class
new file mode 100755
index 0000000..8de5b5d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HC2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1.class
new file mode 100755
index 0000000..2208799
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1Filter.class
new file mode 100755
index 0000000..28ca5ea
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI1Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2.class
new file mode 100755
index 0000000..9b0316b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2Filter.class
new file mode 100755
index 0000000..4cb0c25
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta$HI2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta.class
new file mode 100755
index 0000000..dc8c649
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ClassMeta.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$NotABean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$NotABean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$NotABean.class
new file mode 100755
index 0000000..263160c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$NotABean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$TestEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$TestEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$TestEnum.class
new file mode 100755
index 0000000..b2b9b4c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest$TestEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest.class
new file mode 100755
index 0000000..fc6eb3d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_DataConversionTest.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses$A.class
new file mode 100755
index 0000000..6a1afc9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses.class
new file mode 100755
index 0000000..53f1c9e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_IgnoredClasses.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_JacocoDummy.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_JacocoDummy.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_JacocoDummy.class
new file mode 100755
index 0000000..c81f06e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_JacocoDummy.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList$Person.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList$Person.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList$Person.class
new file mode 100755
index 0000000..fb0d16d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList$Person.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList.class
new file mode 100755
index 0000000..d31da83
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectList.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectMap.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectMap.class
new file mode 100755
index 0000000..23e6db7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ObjectMap.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection1.class
new file mode 100755
index 0000000..bd40c74
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection2.class
new file mode 100755
index 0000000..28d92f0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestCollection2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap1.class
new file mode 100755
index 0000000..a57bd20
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap2.class
new file mode 100755
index 0000000..b1fa64f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics$TestMap2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics.class
new file mode 100755
index 0000000..015e1e6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserGenerics.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserReader.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserReader.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserReader.class
new file mode 100755
index 0000000..8c454a7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_ParserReader.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_PropertyNamerDashedLC.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_PropertyNamerDashedLC.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_PropertyNamerDashedLC.class
new file mode 100755
index 0000000..7742584
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_PropertyNamerDashedLC.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility$A.class
new file mode 100755
index 0000000..0a4463f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility.class
new file mode 100755
index 0000000..c6ca4ad
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/CT_Visibility.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils$1.class
new file mode 100755
index 0000000..9cc9ba0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils.class
new file mode 100755
index 0000000..eaffe07
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/TestUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/XmlValidatorParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/XmlValidatorParser.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/XmlValidatorParser.class
new file mode 100755
index 0000000..ca3f69b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/XmlValidatorParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$1.class
new file mode 100755
index 0000000..09a86bb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A2.class
new file mode 100755
index 0000000..289d65f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A3.class
new file mode 100755
index 0000000..5dd8c12
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A4.class
new file mode 100755
index 0000000..bd78f27
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A5.class
new file mode 100755
index 0000000..3d5bcb0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1$A5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1.class
new file mode 100755
index 0000000..2bcfd6b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$A.class
new file mode 100755
index 0000000..dc113a6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$AA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$AA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$AA.class
new file mode 100755
index 0000000..a333a9a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$AA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$B.class
new file mode 100755
index 0000000..65c9bc7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$C.class
new file mode 100755
index 0000000..b39248c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$D.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$D.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$D.class
new file mode 100755
index 0000000..de3d0b6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$D.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$E.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$E.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$E.class
new file mode 100755
index 0000000..b442428
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$E.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$F.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$F.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$F.class
new file mode 100755
index 0000000..5ee1f3c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$F.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$IA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$IA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$IA.class
new file mode 100755
index 0000000..b958dc3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs$IA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs.class
new file mode 100755
index 0000000..24c098c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripAddClassAttrs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A1.class
new file mode 100755
index 0000000..5195f65
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A2.class
new file mode 100755
index 0000000..a45551f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A3.class
new file mode 100755
index 0000000..621525a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$A3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B1.class
new file mode 100755
index 0000000..2a0c32b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B2.class
new file mode 100755
index 0000000..1eec827
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance.class
new file mode 100755
index 0000000..234dce9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanInheritance.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$1.class
new file mode 100755
index 0000000..130c094
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$2.class
new file mode 100755
index 0000000..233d093
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$A.class
new file mode 100755
index 0000000..00c7d59
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$ABean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$ABean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$ABean.class
new file mode 100755
index 0000000..a91e041
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$ABean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B.class
new file mode 100755
index 0000000..f5c5421
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B1.class
new file mode 100755
index 0000000..ec8233f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B2.class
new file mode 100755
index 0000000..631cffb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B3.class
new file mode 100755
index 0000000..49a3f95
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$B3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA.class
new file mode 100755
index 0000000..1aa0e8d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA1.class
new file mode 100755
index 0000000..e361a72
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA2.class
new file mode 100755
index 0000000..76e160e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$BA2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C.class
new file mode 100755
index 0000000..9d8dd17
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C1.class
new file mode 100755
index 0000000..4f1aeb5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C2.class
new file mode 100755
index 0000000..b4427e3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C3.class
new file mode 100755
index 0000000..cf43ede
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$C3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA.class
new file mode 100755
index 0000000..950e8bc
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA1.class
new file mode 100755
index 0000000..0ae2d2a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA2.class
new file mode 100755
index 0000000..30fa6dd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CA2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CAFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CAFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CAFilter.class
new file mode 100755
index 0000000..9598b60
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CAFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CBean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CBean.class
new file mode 100755
index 0000000..09d3c33
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CBean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CFilter.class
new file mode 100755
index 0000000..12da2b2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$CFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D1.class
new file mode 100755
index 0000000..d2d40bb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2.class
new file mode 100755
index 0000000..36db6f6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2Filter.class
new file mode 100755
index 0000000..8c79c49
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$D2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E1.class
new file mode 100755
index 0000000..51fb277
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2.class
new file mode 100755
index 0000000..8d90bf0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2Filter.class
new file mode 100755
index 0000000..b02591d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$E2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA1.class
new file mode 100755
index 0000000..f7ecce2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA2.class
new file mode 100755
index 0000000..c27286f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FA2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1.class
new file mode 100755
index 0000000..6dbccf9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1Filter.class
new file mode 100755
index 0000000..a7fdf4b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB1Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2.class
new file mode 100755
index 0000000..ccacc68
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2Filter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2Filter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2Filter.class
new file mode 100755
index 0000000..a6ce52e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$FB2Filter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1$G2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1$G2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1$G2.class
new file mode 100755
index 0000000..bc1e097
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1$G2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1.class
new file mode 100755
index 0000000..a35d358
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G$G1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G.class
new file mode 100755
index 0000000..a932f4d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$G.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1$H2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1$H2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1$H2.class
new file mode 100755
index 0000000..86d1394
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1$H2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1.class
new file mode 100755
index 0000000..8acbba7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H$H1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H.class
new file mode 100755
index 0000000..d038373
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$H.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1$I2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1$I2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1$I2.class
new file mode 100755
index 0000000..daa2190
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1$I2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1.class
new file mode 100755
index 0000000..b6ae125
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I$I1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I.class
new file mode 100755
index 0000000..1c6055f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$I.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$IBean.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$IBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$IBean.class
new file mode 100755
index 0000000..e492639
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$IBean.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J$J2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J$J2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J$J2.class
new file mode 100755
index 0000000..0d33ae8
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J$J2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J.class
new file mode 100755
index 0000000..051405e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$J.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$K.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$K.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$K.class
new file mode 100755
index 0000000..ecd825f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$K.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$KEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$KEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$KEnum.class
new file mode 100755
index 0000000..94cc051
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$KEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$L.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$L.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$L.class
new file mode 100755
index 0000000..435488c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$L.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$M.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$M.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$M.class
new file mode 100755
index 0000000..b46a900
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$M.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N$N2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N$N2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N$N2.class
new file mode 100755
index 0000000..e2e90d2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N$N2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N.class
new file mode 100755
index 0000000..3f60e92
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps$N.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps.class
new file mode 100755
index 0000000..1754919
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripBeanMaps.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripDTOs.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripDTOs.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripDTOs.class
new file mode 100755
index 0000000..87aab79
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripDTOs.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$1.class
new file mode 100755
index 0000000..cc7ac7c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$2.class
new file mode 100755
index 0000000..7609a1e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$3.class
new file mode 100755
index 0000000..51fcddb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$4.class
new file mode 100755
index 0000000..2586d5f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A.class
new file mode 100755
index 0000000..682852a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$AEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$AEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$AEnum.class
new file mode 100755
index 0000000..b3e31f6
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$AEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$1.class
new file mode 100755
index 0000000..5158a20
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$2.class
new file mode 100755
index 0000000..e595787
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$3.class
new file mode 100755
index 0000000..56c5e0e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$4.class
new file mode 100755
index 0000000..f5273bf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B.class
new file mode 100755
index 0000000..511981d
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$BEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$BEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$BEnum.class
new file mode 100755
index 0000000..c2b103e
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum$BEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum.class
new file mode 100755
index 0000000..f280d7f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripEnum.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$1.class
new file mode 100755
index 0000000..db70e5f
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$2.class
new file mode 100755
index 0000000..910b4b3
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$3.class
new file mode 100755
index 0000000..fbf0723
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$4.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$4.class
new file mode 100755
index 0000000..bad1378
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$4.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$5.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$5.class
new file mode 100755
index 0000000..01f1333
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$5.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$6.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$6.class
new file mode 100755
index 0000000..0eee7cf
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A$6.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A.class
new file mode 100755
index 0000000..8f80860
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$B.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$B.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$B.class
new file mode 100755
index 0000000..aa44b80
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$B.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$BFilter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$BFilter.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$BFilter.class
new file mode 100755
index 0000000..747d163
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$BFilter.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C1.class
new file mode 100755
index 0000000..8c5b4e1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C2.class
new file mode 100755
index 0000000..4aa7931
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C3.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C3.class
new file mode 100755
index 0000000..f2467d0
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$C3.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$CDTO.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$CDTO.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$CDTO.class
new file mode 100755
index 0000000..bb358a2
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$CDTO.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D1.class
new file mode 100755
index 0000000..4bd6186
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D2.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D2.class
new file mode 100755
index 0000000..eda5d9a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans$D2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans.class
new file mode 100755
index 0000000..df0722b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripFilterBeans.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Pair.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Pair.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Pair.class
new file mode 100755
index 0000000..cbfbece
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Pair.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$RealPair.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$RealPair.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$RealPair.class
new file mode 100755
index 0000000..ca04e52
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$RealPair.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Source.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Source.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Source.class
new file mode 100755
index 0000000..31666f5
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Source.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Target.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Target.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Target.class
new file mode 100755
index 0000000..b1f546b
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics$Target.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics.class
new file mode 100755
index 0000000..f3a0c18
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripGenerics.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A.class
new file mode 100755
index 0000000..4ceb734
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1.class
new file mode 100755
index 0000000..1182205
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1List.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1List.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1List.class
new file mode 100755
index 0000000..6bb166a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/core/test/a/rttests/CT_RoundTripLargeObjects$A1List.class differ



[12/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.java
new file mode 100755
index 0000000..865b95e
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/ReaderParser.java
@@ -0,0 +1,394 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.parser;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Subclass of {@link Parser} for characters-based parsers.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This class is typically the parent class of all character-based parsers.
+ * 	It has 1 abstract method to implement...
+ * <ul>
+ * 	<li><code>parse(Reader, ClassMeta, ParserContext)</code>
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>@Consumes annotation</h6>
+ * <p>
+ * 	The media types that this parser can handle is specified through the {@link Consumes @Consumes} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()} method.
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class ReaderParser extends Parser<Reader> {
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	protected abstract <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws ParseException, IOException;
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Same as <code>parse(Reader, Class)</code> except parses from a <code>CharSequence</code>.
+	 *
+	 * @param in The string containing the input.
+	 * @param type The class type of the object to create.
+	 * 	If <jk>null</jk> or <code>Object.<jk>class</jk></code>, object type is based on what's being parsed.
+	 * @param <T> The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 */
+	public <T> T parse(CharSequence in, Class<T> type) throws ParseException {
+		return parse(in, getBeanContext().getClassMeta(type));
+	}
+
+	/**
+	 * Same as <code>parse(Reader, ClassMeta)</code> except parses from a <code>CharSequence</code>.
+	 *
+	 * @param in The string containing the input.
+	 * @param type The class type of the object to create.
+	 * 	If <jk>null</jk> or <code>Object.<jk>class</jk></code>, object type is based on what's being parsed.
+	 * @param <T> The class type of the object to create.
+	 * @return The parsed object.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 */
+	public <T> T parse(CharSequence in, ClassMeta<T> type) throws ParseException {
+		try {
+			if (in == null)
+				return null;
+			return parse(wrapReader(in), in.length(), type, createContext());
+		} catch (IOException e) {
+			throw new ParseException(e); // Won't happen since it's a StringReader.
+		}
+	}
+
+	/**
+	 * Same as <code>parseMap(Reader, Class, Class, Class)</code> except parses from a <code>CharSequence</code>.
+	 *
+	 * @param <T> The map class type.
+	 * @param <K> The class type of the map keys.
+	 * @param <V> The class type of the map values.
+	 * @param in The string containing the input.
+	 * @param mapClass The map class type.
+	 * @param keyClass The class type of the map keys.
+	 * @param valueClass The class type of the map values.
+	 * @return A new map instance.
+	 * @throws ParseException
+	 */
+	public <K,V,T extends Map<K,V>> T parseMap(CharSequence in, Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException {
+		ClassMeta<T> cm = getBeanContext().getMapClassMeta(mapClass, keyClass, valueClass);
+		return parse(in, cm);
+	}
+
+	/**
+	 * Same as <code>parseCollection(Reader, Class, Class)</code> except parses from a <code>CharSequence</code>.
+	 *
+	 * @param <T> The collection class type.
+	 * @param <E> The class type of the collection entries.
+	 * @param in The string containing the input.
+	 * @param collectionClass The map class type.
+	 * @param entryClass collectionClass
+	 * @return A new collection instance.
+	 * @throws ParseException
+	 */
+	public <E,T extends Collection<E>> T parseCollection(CharSequence in, Class<T> collectionClass, Class<E> entryClass) throws ParseException {
+		ClassMeta<T> cm = getBeanContext().getCollectionClassMeta(collectionClass, entryClass);
+		return parse(in, cm);
+	}
+
+	/**
+	 * Wraps the specified character sequence inside a reader.
+	 * Subclasses can override this method to implement their own readers.
+	 *
+	 * @param in The string being wrapped.
+	 * @return The string wrapped in a reader, or <jk>null</jk> if the <code>CharSequence</code> is null.
+	 */
+	protected Reader wrapReader(CharSequence in) {
+		return new CharSequenceReader(in);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Optional methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Parses the contents of the specified reader and loads the results into the specified map.
+	 * <p>
+	 * 	Reader must contain something that serializes to a map (such as text containing a JSON object).
+	 * <p>
+	 * 	Used in the following locations:
+	 * <ul>
+	 * 	<li>The various character-based constructors in {@link ObjectMap} (e.g. {@link ObjectMap#ObjectMap(CharSequence, ReaderParser)}).
+	 * </ul>
+	 *
+	 * @param <K> The key class type.
+	 * @param <V> The value class type.
+	 * @param in The reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param m The map being loaded.
+	 * @param keyType The class type of the keys, or <jk>null</jk> to default to <code>String.<jk>class</jk></code>.<br>
+	 * @param valueType The class type of the values, or <jk>null</jk> to default to whatever is being parsed.<br>
+	 * @return The same map that was passed in to allow this method to be chained.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 * @throws UnsupportedOperationException If not implemented.
+	 */
+	public final <K,V> Map<K,V> parseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType) throws ParseException, IOException {
+		ParserContext ctx = createContext();
+		try {
+			if (in == null)
+				throw new IOException("Null input stream or reader passed to parser.");
+			return doParseIntoMap(in, estimatedSize, m, keyType, valueType, ctx);
+		} finally {
+			ctx.close();
+		}
+	}
+
+	/**
+	 * Implementation method.
+	 * Default implementation throws an {@link UnsupportedOperationException}.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param m The map being loaded.
+	 * @param keyType The class type of the keys, or <jk>null</jk> to default to <code>String.<jk>class</jk></code>.<br>
+	 * @param valueType The class type of the values, or <jk>null</jk> to default to whatever is being parsed.<br>
+	 * @param ctx The runtime context object returned by {@link #createContext(ObjectMap, Method, Object)}.
+	 * 	If <jk>null</jk>, one will be created using {@link #createContext()}.
+	 * @return The same map that was passed in to allow this method to be chained.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 * @throws IOException Occurs if thrown from <code>Reader</code>
+	 */
+	protected <K,V> Map<K,V> doParseIntoMap(Reader in, int estimatedSize, Map<K,V> m, Type keyType, Type valueType, ParserContext ctx) throws ParseException, IOException {
+		throw new UnsupportedOperationException("Parser '"+getClass().getName()+"' does not support this method.");
+	}
+
+	/**
+	 * Same as {@link #parseIntoMap(Reader, int, Map, Type, Type)} except reads from a <code>CharSequence</code>.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param m The map being loaded.
+	 * @param keyType The class type of the keys, or <jk>null</jk> to default to <code>String.<jk>class</jk></code>.<br>
+	 * @param valueType The class type of the values, or <jk>null</jk> to default to whatever is being parsed.<br>
+	 * @return The same map that was passed in to allow this method to be chained.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 */
+	public final <K,V> Map<K,V> parseIntoMap(CharSequence in, Map<K,V> m, Type keyType, Type valueType) throws ParseException {
+		try {
+			if (in == null)
+				return null;
+			return parseIntoMap(wrapReader(in), in.length(), m, keyType, valueType);
+		} catch (IOException e) {
+			throw new ParseException(e);  // Won't happen.
+		}
+	}
+
+	/**
+	 * Parses the contents of the specified reader and loads the results into the specified collection.
+	 * <p>
+	 * 	Used in the following locations:
+	 * <ul>
+	 * 	<li>The various character-based constructors in {@link ObjectList} (e.g. {@link ObjectList#ObjectList(CharSequence, ReaderParser)}.
+	 * </ul>
+	 *
+	 * @param <E> The element class type.
+	 * @param in The reader containing the input.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param c The collection being loaded.
+	 * @param elementType The class type of the elements, or <jk>null</jk> to default to whatever is being parsed.
+	 * @return The same collection that was passed in to allow this method to be chained.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 * @throws UnsupportedOperationException If not implemented.
+	 */
+	public final <E> Collection<E> parseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType) throws ParseException, IOException {
+		ParserContext ctx = createContext();
+		try {
+			if (in == null)
+				throw new IOException("Null reader passed to parser.");
+			return doParseIntoCollection(in, estimatedSize, c, elementType, ctx);
+		} finally {
+			ctx.close();
+		}
+	}
+
+	/**
+	 * Implementation method.
+	 * Default implementation throws an {@link UnsupportedOperationException}.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param c The collection being loaded.
+	 * @param elementType The class type of the elements, or <jk>null</jk> to default to whatever is being parsed.
+	 * @param ctx The runtime context object returned by {@link #createContext(ObjectMap, Method, Object)}.
+	 * 	If <jk>null</jk>, one will be created using {@link #createContext()}.
+	 * @return The same collection that was passed in to allow this method to be chained.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 * @throws IOException Occurs if thrown from <code>Reader</code>
+	 */
+	protected <E> Collection<E> doParseIntoCollection(Reader in, int estimatedSize, Collection<E> c, Type elementType, ParserContext ctx) throws ParseException, IOException {
+		throw new UnsupportedOperationException("Parser '"+getClass().getName()+"' does not support this method.");
+	}
+
+	/**
+	 * Same as {@link #parseIntoCollection(Reader, int, Collection, Type)} except reads from a <code>CharSequence</code>.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param c The collection being loaded.
+	 * @param elementType The class type of the elements, or <jk>null</jk> to default to whatever is being parsed.
+	 * @return The same collection that was passed in to allow this method to be chained.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 */
+	public final <E> Collection<E> parseIntoCollection(CharSequence in, Collection<E> c, Type elementType) throws ParseException {
+		try {
+			return parseIntoCollection(wrapReader(in), in.length(), c, elementType);
+		} catch (IOException e) {
+			throw new ParseException(e);  // Won't happen.
+		}
+	}
+
+	/**
+	 * Parses the specified array input with each entry in the object defined by the {@code argTypes}
+	 * argument.
+	 * <p>
+	 * 	Used for converting arrays (e.g. <js>"[arg1,arg2,...]"</js>) into an {@code Object[]} that can be passed
+	 * 	to the {@code Method.invoke(target, args)} method.
+	 * <p>
+	 * 	Used in the following locations:
+	 * <ul>
+	 * 	<li>Used to parse argument strings in the {@link PojoIntrospector#invokeMethod(Method, Reader)} method.
+	 * </ul>
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param argTypes Specifies the type of objects to create for each entry in the array.
+	 * @return An array of parsed objects.
+	 * @throws ParseException If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 * @throws UnsupportedOperationException If not implemented.
+	 */
+	public final Object[] parseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes) throws ParseException, IOException {
+		if (in == null)
+			throw new IOException("Null reader passed to parser.");
+		if (argTypes == null || argTypes.length == 0)
+			return new Object[0];
+		ParserContext ctx = createContext();
+		try {
+			return doParseArgs(in, estimatedSize, argTypes, ctx);
+		} finally {
+			ctx.close();
+		}
+	}
+
+	/**
+	 * Implementation method.
+	 * Default implementation throws an {@link UnsupportedOperationException}.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param estimatedSize The estimated size of the input, or <code>-1</code> if unknown.
+	 * @param argTypes Specifies the type of objects to create for each entry in the array.
+	 * @param ctx The runtime context object returned by {@link #createContext(ObjectMap, Method, Object)}.
+	 * 	If <jk>null</jk>, one will be created using {@link #createContext()}.
+	 * @return An array of parsed objects.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 * @throws IOException Occurs if thrown from <code>Reader</code>
+	 */
+	protected Object[] doParseArgs(Reader in, int estimatedSize, ClassMeta<?>[] argTypes, ParserContext ctx) throws ParseException, IOException {
+		throw new UnsupportedOperationException("Parser '"+getClass().getName()+"' does not support this method.");
+	}
+
+	/**
+	 * Same as {@link #parseArgs(Reader, int, ClassMeta[])} except reads from a <code>CharSequence</code>.
+	 *
+	 * @param in The input.  Must represent an array.
+	 * @param argTypes Specifies the type of objects to create for each entry in the array.
+	 * @return An array of parsed objects.
+	 * @throws ParseException Occurs if syntax error detected in input.
+	 */
+	public Object[] parseArgs(CharSequence in, ClassMeta<?>[] argTypes) throws ParseException {
+		try {
+			return parseArgs(wrapReader(in), in.length(), argTypes);
+		} catch (IOException e) {
+			throw new ParseException(e);  // Won't happen.
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	public boolean isReaderParser() {
+		return true;
+	}
+
+	@Override /* Parser */
+	public ReaderParser setProperty(String property, Object value) throws LockedException {
+		super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public ReaderParser setProperties(ObjectMap properties) throws LockedException {
+		super.setProperties(properties);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public ReaderParser addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public ReaderParser addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> ReaderParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public ReaderParser setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* Lockable */
+	public ReaderParser lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* Lockable */
+	public ReaderParser clone() throws CloneNotSupportedException {
+		return (ReaderParser)super.clone();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/package.html
new file mode 100755
index 0000000..ccee463
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/parser/package.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Parser API</p>
+
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Parser'>Parser API</a></p>
+	<ol>
+		<li><p><a class='doclink' href='#ParserGroup'>The ParserGroup class</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#DefiningParser'>Defining a new Parser</a></p>
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Parser"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - Parser API</h2>
+<div class='topic'>
+	<p>
+		The parser API is designed to be easily extensible by developers. <br>
+		If you are writing your own parser, you will typically subclass directly from either {@link com.ibm.juno.core.parser.ReaderParser}
+			or {@link com.ibm.juno.core.parser.InputStreamParser}.<br>
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserGroup"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - The ParserGroup class</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.parser.ParserGroup} class represents a group of parser registered with the media types they handle.
+		</p>
+		
+		<h6 class='topic'>Features</h6>		
+		<p>
+			The <code>ParserGroup</code> class provides the following features:
+		<ul>
+			<li>Finds parsers based on HTTP <code>Content-Type</code> header values.
+			<li>Sets common properties on all parsers in a single method call.
+			<li>Locks all parsers in a single method call.
+			<li>Clones existing groups and all parsers within the group in a single method call.
+		</ul>
+		
+		<p>
+			Refer to {@link com.ibm.juno.core.parser.ParserGroup} for additional information.
+		</p>
+	</div> 
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="DefiningParser"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - Defining a new Parser</h2>
+<div class='topic'>
+	<p>
+		Defining a new parser is quite simple if you subclass directly from {@link com.ibm.juno.core.parser.ReaderParser} 
+			or {@link com.ibm.juno.core.parser.InputStreamParser}.  In each case, you simply need to implement a single
+			method and specify a {@link com.ibm.juno.core.annotation.Consumes} annotation.
+	</p>
+	<p>
+		The following example shows a simple parser that converts input streams to images using standard JRE classes.
+	</p>
+	<p class='bcode'>
+	<ja>@Consumes</ja>({<js>"image/png"</js>,<js>"image/jpeg"</js>})
+	<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
+		<ja>@Override</ja>
+		<jk>public</jk> &lt;T&gt; T parse(InputStream in, ClassMeta&lt;T&gt; type, ParserContext ctx) <jk>throws</jk> ParseException, IOException {
+			BufferedImage image = ImageIO.<jsm>read</jsm>(in);
+			<jk>return</jk> (T)image;
+		}
+	}
+	</p>
+	<p>
+		Parsers that take advantage of the entire {@link com.ibm.juno.core.CoreApi} interface to be able to parse arbitrary beans and POJOs is
+			considerably more complex and outside the scope of this document.  
+		If developing such a parser, the best course of action would be to replicate what occurs in the {@link com.ibm.juno.core.json.JsonParser} class.
+	</p>
+</div>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.class
new file mode 100755
index 0000000..319f116
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.java
new file mode 100755
index 0000000..4aa7ad1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextParser.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.plaintext;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.parser.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parsers HTTP plain text request bodies into <a href='../package-summary.html#PojoCategories'>Group 5</a> POJOs.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/plain</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/plain</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Essentially just converts plain text to POJOs via static <code>fromString()</code> or <code>valueOf()</code>, or
+ * 	through constructors that take a single string argument.
+ * <p>
+ * 	Also parses objects using a filter if the object class has an {@link PojoFilter PojoFilter&lt;?,String&gt;} filter defined on it.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Consumes("text/plain")
+public final class PlainTextParser extends ReaderParser {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Parser */
+	protected <T> T doParse(Reader in, int estimatedSize, ClassMeta<T> type, ParserContext ctx) throws IOException, ParseException {
+		return ctx.getBeanContext().convertToType(IOUtils.read(in), type);
+	}
+
+	@Override /* Lockable */
+	public PlainTextParser clone() {
+		try {
+			return (PlainTextParser)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.class
new file mode 100755
index 0000000..63a5321
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.java
new file mode 100755
index 0000000..9466161
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/PlainTextSerializer.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.plaintext;
+
+import java.io.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.serializer.*;
+
+/**
+ * Serializes POJOs to plain text using just the <code>toString()</code> method on the serialized object.
+ *
+ *
+ * <h6 class='topic'>Media types</h6>
+ * <p>
+ * 	Handles <code>Accept</code> types: <code>text/plain</code>
+ * <p>
+ * 	Produces <code>Content-Type</code> types: <code>text/plain</code>
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Essentially converts POJOs to plain text using the <code>toString()</code> method.
+ * <p>
+ * 	Also serializes objects using a filter if the object class has an {@link PojoFilter PojoFilter&lt;?,String&gt;} filter defined on it.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * <p>
+ * 	This class has the following properties associated with it:
+ * <ul>
+ * 	<li>{@link BeanContextProperties}
+ * </ul>
+ *
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+@Produces("text/plain")
+public final class PlainTextSerializer extends WriterSerializer {
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected void doSerialize(Object o, Writer out, SerializerContext ctx) throws IOException, SerializeException {
+		out.write(o == null ? "null" : ctx.getBeanContext().convertToType(o, String.class));
+	}
+
+	@Override /* Serializer */
+	public PlainTextSerializer clone() {
+		try {
+			return (PlainTextSerializer)super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e); // Shouldn't happen.
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/package.html
new file mode 100755
index 0000000..a0b213f
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/plaintext/package.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>Plain-text serialization and parsing support</p>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.class
new file mode 100755
index 0000000..0428518
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.java
new file mode 100755
index 0000000..a609751
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/OutputStreamSerializer.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import java.io.*;
+
+import com.ibm.juno.core.annotation.*;
+
+/**
+ * Subclass of {@link Serializer} for byte-based serializers.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	This class is typically the parent class of all byte-based serializers.
+ * 	It has 1 abstract method to implement...
+ * <ul>
+ * 	<li>{@link #doSerialize(Object, OutputStream, SerializerContext)}
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>@Produces annotation</h6>
+ * <p>
+ * 	The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()}
+ * 		and {@link #getResponseContentType()} methods.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class OutputStreamSerializer extends Serializer<OutputStream> {
+
+	@Override /* Serializer */
+	public boolean isWriterSerializer() {
+		return false;
+	}
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* Serializer */
+	protected abstract void doSerialize(Object o, OutputStream out, SerializerContext ctx) throws IOException, SerializeException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.class
new file mode 100755
index 0000000..54d57e1
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.java
new file mode 100755
index 0000000..9b0e2da
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializeException.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import java.text.*;
+
+/**
+ * General exception thrown whenever an error occurs during serialization.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SerializeException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The error message.
+	 * @param args Optional printf arguments to replace in the error message.
+	 */
+	public SerializeException(String msg, Object... args) {
+		super(args.length == 0 ? msg : MessageFormat.format(msg, args));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.
+	 */
+	public SerializeException(Throwable cause) {
+		super(cause == null ? null : cause.getLocalizedMessage());
+		initCause(cause);
+	}
+
+	/**
+	 * Sets the inner cause for this exception.
+	 *
+	 * @param cause The inner cause.
+	 * @return This object (for method chaining).
+	 */
+	@Override /* Throwable */
+	public synchronized SerializeException initCause(Throwable cause) {
+		super.initCause(cause);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.class
new file mode 100755
index 0000000..0a67c62
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.java
new file mode 100755
index 0000000..1d3cf51
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/Serializer.java
@@ -0,0 +1,377 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import static com.ibm.juno.core.utils.ClassUtils.*;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.text.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.annotation.*;
+import com.ibm.juno.core.filter.*;
+import com.ibm.juno.core.soap.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Parent class for all Juno serializers.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Base serializer class that serves as the parent class for all serializers.
+ * <p>
+ * 	Subclasses should extend directly from {@link OutputStreamSerializer} or {@link WriterSerializer}.
+ *
+ *
+ * <h6 class='topic'>@Produces annotation</h6>
+ * <p>
+ * 	The media types that this serializer can produce is specified through the {@link Produces @Produces} annotation.
+ * <p>
+ * 	However, the media types can also be specified programmatically by overriding the {@link #getMediaTypes()}
+ * 		and {@link #getResponseContentType()} methods.
+ *
+ *
+ * <h6 class='topic'>Configurable properties</h6>
+ * 	See {@link SerializerProperties} for a list of configurable properties that can be set on this class
+ * 	using the {@link #setProperty(String, Object)} method.
+ *
+ * @param <W> The output stream or writer class type.
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public abstract class Serializer<W> extends CoreApi {
+
+	/** General serializer properties currently set on this serializer. */
+	protected transient SerializerProperties sp = new SerializerProperties();
+	private String[] mediaTypes;
+	private String contentType;
+
+	// Hidden constructor to force subclass from OuputStreamSerializer or WriterSerializer.
+	Serializer() {}
+
+	/**
+	 * Returns <jk>true</jk> if this parser subclasses from {@link WriterSerializer}.
+	 *
+	 * @return <jk>true</jk> if this parser subclasses from {@link WriterSerializer}.
+	 */
+	public abstract boolean isWriterSerializer();
+
+	//--------------------------------------------------------------------------------
+	// Abstract methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Serializes a POJO to the specified output stream or writer.
+	 * <p>
+	 * This method should NOT close the context object.
+	 *
+	 * @param o The object to serialize.
+	 * @param out The writer or output stream to write to.
+	 * @param ctx The serializer context object return by {@link #createContext(ObjectMap, Method)}.<br>
+	 * 	If <jk>null</jk>, context is created using {@link #createContext()}.
+	 *
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	protected abstract void doSerialize(Object o, W out, SerializerContext ctx) throws IOException, SerializeException;
+
+	//--------------------------------------------------------------------------------
+	// Other methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Calls {@link #serialize(Object, Object, SerializerContext)} but intercepts {@link StackOverflowError} exceptions
+	 * 	and wraps them in a useful message.
+	 * @param o The object to serialize.
+	 * @param out The writer or output stream to write to.
+	 * @param ctx The serializer context object return by {@link #createContext(ObjectMap, Method)}.<br>
+	 * 	If <jk>null</jk>, context is created using {@link #createContext()}.
+	 *
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final void serialize(Object o, W out, SerializerContext ctx) throws IOException, SerializeException {
+		try {
+			doSerialize(o, out, ctx);
+		} catch (StackOverflowError e) {
+			throw new SerializeException("Stack overflow occurred.  This can occur when trying to serialize models containing loops.  It's recommended you use the SerializerProperties.SERIALIZER_detectRecursions setting to help locate the loop.").initCause(e);
+		} finally {
+			ctx.close();
+		}
+	}
+
+	/**
+	 * Serializes a POJO to the specified output stream or writer.
+	 * <p>
+	 * Equivalent to calling <code>serializer.serialize(o, out, <jk>null</jk>);</code>
+	 *
+	 * @param o The object to serialize.
+	 * @param out The writer or output stream to write to.
+	 *
+	 * @throws IOException If a problem occurred trying to write to the writer.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final void serialize(Object o, W out) throws IOException, SerializeException {
+		SerializerContext ctx = createContext();
+		serialize(o, out, ctx);
+	}
+
+	/**
+	 * Create the context object that will be passed in to the serialize method.
+	 * <p>
+	 * 	It's up to implementers to decide what the context object looks like, although typically
+	 * 	it's going to be a subclass of {@link SerializerContext}.
+	 *
+	 * @param properties Optional additional properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 * @return The new context.
+	 */
+	public SerializerContext createContext(ObjectMap properties, Method javaMethod) {
+		return new SerializerContext(getBeanContext(), sp, properties, javaMethod);
+	}
+
+	/**
+	 * Create a basic context object without overriding properties or specifying <code>javaMethod</code>.
+	 * <p>
+	 * Equivalent to calling <code>createContext(<jk>null</jk>, <jk>null</jk>)</code>.
+	 *
+	 * @return The new context.
+	 */
+	protected SerializerContext createContext() {
+		return createContext(null, null);
+	}
+
+	/**
+	 * Converts the contents of the specified object array to a list.
+	 * <p>
+	 * 	Works on both object and primitive arrays.
+	 * <p>
+	 * 	In the case of multi-dimensional arrays, the outgoing list will
+	 * 	contain elements of type n-1 dimension.  i.e. if {@code type} is <code><jk>int</jk>[][]</code>
+	 * 	then {@code list} will have entries of type <code><jk>int</jk>[]</code>.
+	 *
+	 * @param type The type of array.
+	 * @param array The array being converted.
+	 * @return The array as a list.
+	 */
+	protected final List<Object> toList(Class<?> type, Object array) {
+		Class<?> componentType = type.getComponentType();
+		if (componentType.isPrimitive()) {
+			int l = Array.getLength(array);
+			List<Object> list = new ArrayList<Object>(l);
+			for (int i = 0; i < l; i++)
+				list.add(Array.get(array, i));
+			return list;
+		}
+		return Arrays.asList((Object[])array);
+	}
+
+	/**
+	 * Generalize the specified object if a filter is associated with it.
+	 *
+	 * @param ctx The context that exists for the duration of a single serialize.
+	 * @param o The object to generalize.
+	 * @param type The type of object.
+	 * @return The generalized object, or <jk>null</jk> if the object is <jk>null</jk>.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	protected final Object generalize(SerializerContext ctx, Object o, ClassMeta<?> type) throws SerializeException {
+		if (o == null)
+			return null;
+		PojoFilter f = (type == null || type.isObject() ? ctx.getBeanContext().getClassMeta(o.getClass()).getPojoFilter() : type.getPojoFilter());
+		if (f == null)
+			return o;
+		return f.filter(o);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified value should not be serialized.
+	 *
+	 * @param ctx The context that exists for the duration of a single serialize.
+	 * @param cm The class type of the object being serialized.
+	 * @param attrName The bean attribute name, or <jk>null</jk> if this isn't a bean attribute.
+	 * @param value The object being serialized.
+	 * @return <jk>true</jk> if the specified value should not be serialized.
+	 * @throws SerializeException
+	 */
+	protected final boolean canIgnoreValue(SerializerContext ctx, ClassMeta<?> cm, String attrName, Object value) throws SerializeException {
+
+		if (ctx.isTrimNulls() && value == null)
+			return true;
+
+		if (value == null)
+			return false;
+
+		if (cm == null)
+			cm = object();
+
+		if (ctx.isTrimEmptyLists()) {
+			if (cm.isArray() || (cm.isObject() && value.getClass().isArray())) {
+				if (((Object[])value).length == 0)
+					return true;
+			}
+			if (cm.isCollection() || (cm.isObject() && isParentClass(Collection.class, value.getClass()))) {
+				if (((Collection<?>)value).isEmpty())
+					return true;
+			}
+		}
+
+		if (ctx.isTrimEmptyMaps()) {
+			if (cm.isMap() || (cm.isObject() && isParentClass(Map.class, value.getClass()))) {
+				if (((Map<?,?>)value).isEmpty())
+					return true;
+			}
+		}
+
+		if (ctx.isTrimNulls() && ctx.willRecurse(attrName, value, cm))
+			return true;
+
+		return false;
+	}
+
+	/**
+	 * Sorts the specified map if {@link SerializerContext#isSortMaps()} returns <jk>true</jk>.
+	 *
+	 * @param ctx The context that exists for the duration of a single serialize.
+	 * @param m The map being sorted.
+	 * @return A new sorted {@link TreeMap}.
+	 */
+	protected final <K,V> Map<K,V> sort(SerializerContext ctx, Map<K,V> m) {
+		if (ctx.isSortMaps() && m != null && (! m.isEmpty()) && m.keySet().iterator().next() instanceof Comparable<?>)
+			return new TreeMap<K,V>(m);
+		return m;
+	}
+
+	/**
+	 * Sorts the specified collection if {@link SerializerContext#isSortCollections()} returns <jk>true</jk>.
+	 *
+	 * @param ctx The context that exists for the duration of a single serialize.
+	 * @param c The collection being sorted.
+	 * @return A new sorted {@link TreeSet}.
+	 */
+	protected final <E> Collection<E> sort(SerializerContext ctx, Collection<E> c) {
+		if (ctx.isSortCollections() && c != null && (! c.isEmpty()) && c.iterator().next() instanceof Comparable<?>)
+			return new TreeSet<E>(c);
+		return c;
+	}
+
+	/**
+	 * Returns the media types handled based on the value of the {@link Produces} annotation on the serializer class.
+	 * <p>
+	 * This method can be overridden by subclasses to determine the media types programatically.
+	 *
+	 * @return The list of media types.  Never <jk>null</jk>.
+	 */
+	public String[] getMediaTypes() {
+		if (mediaTypes == null) {
+			Produces p = ReflectionUtils.getAnnotation(Produces.class, getClass());
+			if (p == null)
+				throw new RuntimeException(MessageFormat.format("Class ''{0}'' is missing the @Produces annotation", getClass().getName()));
+			mediaTypes = p.value();
+		}
+		return mediaTypes;
+	}
+
+	/**
+	 * Optional method that specifies HTTP request headers for this serializer.
+	 * <p>
+	 * 	For example, {@link SoapXmlSerializer} needs to set a <code>SOAPAction</code> header.
+	 * <p>
+	 * 	This method is typically meaningless if the serializer is being used standalone (i.e. outside of a REST server or client).
+	 *
+	 * @param properties Optional run-time properties (the same that are passed to {@link WriterSerializer#doSerialize(Object, Writer, SerializerContext)}.
+	 * 	Can be <jk>null</jk>.
+	 * @return The HTTP headers to set on HTTP requests.
+	 * 	Can be <jk>null</jk>.
+	 */
+	public ObjectMap getResponseHeaders(ObjectMap properties) {
+		return new ObjectMap(getBeanContext());
+	}
+
+	/**
+	 * Optional method that returns the response <code>Content-Type</code> for this serializer if it is different from the matched media type.
+	 * <p>
+	 * 	This method is specified to override the content type for this serializer.
+	 * 	For example, the {@link com.ibm.juno.core.json.JsonSerializer.Simple} class returns that it handles media type <js>"text/json+simple"</js>, but returns
+	 * 	<js>"text/json"</js> as the actual content type.
+	 * 	This allows clients to request specific 'flavors' of content using specialized <code>Accept</code> header values.
+	 * <p>
+	 * 	This method is typically meaningless if the serializer is being used standalone (i.e. outside of a REST server or client).
+	 *
+	 * @return The response content type.  If <jk>null</jk>, then the matched media type is used.
+	 */
+	public String getResponseContentType() {
+		if (contentType == null) {
+			Produces p = getClass().getAnnotation(Produces.class);
+			if (p == null)
+				contentType = "";
+			else {
+				contentType = p.contentType();
+				if (contentType.isEmpty())
+					contentType = p.value()[0];
+			}
+		}
+		return (contentType.isEmpty() ? null : contentType);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	@Override /* CoreApi */
+	public Serializer<W> setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		if (! sp.setProperty(property, value))
+			super.setProperty(property, value);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Serializer<W> addNotBeanClasses(Class<?>...classes) throws LockedException {
+		super.addNotBeanClasses(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Serializer<W> addFilters(Class<?>...classes) throws LockedException {
+		super.addFilters(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public <T> Serializer<W> addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		super.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Serializer<W> setClassLoader(ClassLoader classLoader) throws LockedException {
+		super.setClassLoader(classLoader);
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Serializer<W> lock() {
+		super.lock();
+		return this;
+	}
+
+	@Override /* CoreApi */
+	public Serializer<W> clone() throws CloneNotSupportedException {
+		@SuppressWarnings("unchecked")
+		Serializer<W> c = (Serializer<W>)super.clone();
+		c.sp = sp.clone();
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$1.class
new file mode 100755
index 0000000..81d75cb
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$StackElement.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$StackElement.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$StackElement.class
new file mode 100755
index 0000000..f298463
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext$StackElement.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.class
new file mode 100755
index 0000000..1d86e46
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.java
new file mode 100755
index 0000000..f646b0a
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerContext.java
@@ -0,0 +1,464 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import static com.ibm.juno.core.serializer.SerializerProperties.*;
+
+import java.lang.reflect.*;
+import java.text.*;
+import java.util.*;
+import java.util.logging.*;
+
+import com.ibm.juno.core.*;
+import com.ibm.juno.core.utils.*;
+
+/**
+ * Context object that lives for the duration of a single serialization of {@link Serializer} and its subclasses.
+ * <p>
+ *  	Used by serializers for the following purposes:
+ * 	<ul>
+ * 		<li>Keeping track of how deep it is in a model for indentation purposes.
+ * 		<li>Ensuring infinite loops don't occur by setting a limit on how deep to traverse a model.
+ * 		<li>Ensuring infinite loops don't occur from loops in the model (when detectRecursions is enabled.
+ * 		<li>Allowing serializer properties to be overridden on method calls.
+ * 	</ul>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public class SerializerContext {
+
+	private static Logger logger = Logger.getLogger(SerializerContext.class.getName());
+
+	private final int maxDepth, initialDepth;
+	private final boolean
+		debug,
+		detectRecursions,
+		ignoreRecursions,
+		useIndentation,
+		addClassAttrs,
+		trimNulls,
+		trimEmptyLists,
+		trimEmptyMaps,
+		sortCollections,
+		sortMaps;
+	private final char quoteChar;
+	private final String relativeUriBase, absolutePathUriBase;
+	private final ObjectMap overrideProperties;
+
+	/** The current indentation depth into the model. */
+	public int indent;
+
+	/** Contains the current objects in the current branch of the model. */
+	private Map<Object,Object> set;
+
+	/** Contains the current objects in the current branch of the model. */
+	private LinkedList<StackElement> stack;
+
+	/** If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null). */
+	private boolean isBottom;
+
+	/** Any warnings encountered. */
+	private final List<String> warnings = new LinkedList<String>();
+
+	/** The bean context being used in this context. */
+	private final BeanContext beanContext;
+
+	/** Java method that invoked this serializer. */
+	private final Method javaMethod;
+
+	/**
+	 * Create a new HashStack with the specified options.
+	 *
+	 * @param beanContext The bean context being used by the serializer.
+	 * @param sp The default serializer properties.
+	 * @param op The override properties.
+	 * @param javaMethod Java method that invoked this serializer.
+	 * 	When using the REST API, this is the Java method invoked by the REST call.
+	 * 	Can be used to access annotations defined on the method or class.
+	 */
+	public SerializerContext(BeanContext beanContext, SerializerProperties sp, ObjectMap op, Method javaMethod) {
+		this.beanContext = beanContext;
+		this.javaMethod = javaMethod;
+		if (op == null || op.isEmpty()) {
+			overrideProperties = new ObjectMap();
+			maxDepth = sp.maxDepth;
+			initialDepth = sp.initialDepth;
+			debug = sp.debug;
+			detectRecursions = sp.detectRecursions;
+			ignoreRecursions = sp.ignoreRecursions;
+			useIndentation = sp.useIndentation;
+			addClassAttrs = sp.addClassAttrs;
+			trimNulls = sp.trimNulls;
+			trimEmptyLists = sp.trimEmptyLists;
+			trimEmptyMaps = sp.trimEmptyMaps;
+			quoteChar = sp.quoteChar;
+			relativeUriBase = resolveRelativeUriBase(sp.relativeUriBase);
+			absolutePathUriBase = resolveAbsolutePathUriBase(sp.absolutePathUriBase);
+			sortCollections = sp.sortCollections;
+			sortMaps = sp.sortMaps;
+		} else {
+			overrideProperties = op;
+			maxDepth = op.getInt(SERIALIZER_maxDepth, sp.maxDepth);
+			initialDepth = op.getInt(SERIALIZER_initialDepth, sp.initialDepth);
+			debug = op.getBoolean(SERIALIZER_debug, sp.debug);
+			detectRecursions = op.getBoolean(SERIALIZER_detectRecursions, sp.detectRecursions);
+			ignoreRecursions = op.getBoolean(SERIALIZER_ignoreRecursions, sp.ignoreRecursions);
+			useIndentation = op.getBoolean(SERIALIZER_useIndentation, sp.useIndentation);
+			addClassAttrs = op.getBoolean(SERIALIZER_addClassAttrs, sp.addClassAttrs);
+			trimNulls = op.getBoolean(SERIALIZER_trimNullProperties, sp.trimNulls);
+			trimEmptyLists = op.getBoolean(SERIALIZER_trimEmptyLists, sp.trimEmptyLists);
+			trimEmptyMaps = op.getBoolean(SERIALIZER_trimEmptyMaps, sp.trimEmptyMaps);
+			quoteChar = op.getString(SERIALIZER_quoteChar, ""+sp.quoteChar).charAt(0);
+			relativeUriBase = resolveRelativeUriBase(op.getString(SERIALIZER_relativeUriBase, sp.relativeUriBase));
+			absolutePathUriBase = resolveAbsolutePathUriBase(op.getString(SERIALIZER_absolutePathUriBase, sp.absolutePathUriBase));
+			sortCollections = op.getBoolean(SERIALIZER_sortCollections, sp.sortMaps);
+			sortMaps = op.getBoolean(SERIALIZER_sortMaps, sp.sortMaps);
+		}
+
+		this.indent = initialDepth;
+		if (detectRecursions || debug) {
+			set = new IdentityHashMap<Object,Object>();
+			stack = new LinkedList<StackElement>();
+		}
+	}
+
+	private String resolveRelativeUriBase(String s) {
+		if (StringUtils.isEmpty(s))
+			return null;
+		if (s.equals("/"))
+			return s;
+		else if (StringUtils.endsWith(s, '/'))
+			s = s.substring(0, s.length()-1);
+		return s;
+	}
+
+	private String resolveAbsolutePathUriBase(String s) {
+		if (StringUtils.isEmpty(s))
+			return null;
+		if (StringUtils.endsWith(s, '/'))
+			s = s.substring(0, s.length()-1);
+		return s;
+	}
+
+	/**
+	 * Returns the bean context associated with this context.
+	 *
+	 * @return The bean context associated with this context.
+	 */
+	public final BeanContext getBeanContext() {
+		return beanContext;
+	}
+
+	/**
+	 * Returns the Java method that invoked this serializer.
+	 * <p>
+	 * When using the REST API, this is the Java method invoked by the REST call.
+	 * Can be used to access annotations defined on the method or class.
+	 *
+	 * @return The Java method that invoked this serializer.
+	*/
+	public final Method getJavaMethod() {
+		return javaMethod;
+	}
+
+	/**
+	 * Returns the runtime properties associated with this context.
+	 *
+	 * @return The runtime properties associated with this context.
+	 */
+	public final ObjectMap getProperties() {
+		return overrideProperties;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_maxDepth} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_maxDepth} setting value in this context.
+	 */
+	public final int getMaxDepth() {
+		return maxDepth;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_initialDepth} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_initialDepth} setting value in this context.
+	 */
+	public final int getInitialDepth() {
+		return initialDepth;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_debug} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_debug} setting value in this context.
+	 */
+	public final boolean isDebug() {
+		return debug;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_detectRecursions} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_detectRecursions} setting value in this context.
+	 */
+	public final boolean isDetectRecursions() {
+		return detectRecursions;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_ignoreRecursions} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_ignoreRecursions} setting value in this context.
+	 */
+	public final boolean isIgnoreRecursions() {
+		return ignoreRecursions;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_useIndentation} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_useIndentation} setting value in this context.
+	 */
+	public final boolean isUseIndentation() {
+		return useIndentation;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_addClassAttrs} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_addClassAttrs} setting value in this context.
+	 */
+	public final boolean isAddClassAttrs() {
+		return addClassAttrs;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_quoteChar} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_quoteChar} setting value in this context.
+	 */
+	public final char getQuoteChar() {
+		return quoteChar;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_trimNullProperties} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_trimNullProperties} setting value in this context.
+	 */
+	public final boolean isTrimNulls() {
+		return trimNulls;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_trimEmptyLists} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_trimEmptyLists} setting value in this context.
+	 */
+	public final boolean isTrimEmptyLists() {
+		return trimEmptyLists;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_trimEmptyMaps} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_trimEmptyMaps} setting value in this context.
+	 */
+	public final boolean isTrimEmptyMaps() {
+		return trimEmptyMaps;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_sortCollections} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_sortCollections} setting value in this context.
+	 */
+	public final boolean isSortCollections() {
+		return sortCollections;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_sortMaps} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_sortMaps} setting value in this context.
+	 */
+	public final boolean isSortMaps() {
+		return sortMaps;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_relativeUriBase} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_relativeUriBase} setting value in this context.
+	 */
+	public final String getRelativeUriBase() {
+		return relativeUriBase;
+	}
+
+	/**
+	 * Returns the {@link SerializerProperties#SERIALIZER_absolutePathUriBase} setting value in this context.
+	 *
+	 * @return The {@link SerializerProperties#SERIALIZER_absolutePathUriBase} setting value in this context.
+	 */
+	public final String getAbsolutePathUriBase() {
+		return absolutePathUriBase;
+	}
+
+	/**
+	 * Push the specified object onto the stack.
+	 *
+	 * @param attrName The attribute name.
+	 * @param o The current object being serialized.
+	 * @param eType The expected class type.
+	 * @return The {@link ClassMeta} of the object so that <code>instanceof</code> operations
+	 * 	only need to be performed once (since they can be expensive).<br>
+	 * @throws SerializeException
+	 */
+	public ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) throws SerializeException {
+		indent++;
+		isBottom = true;
+		if (o == null)
+			return null;
+		Class<?> c = o.getClass();
+		ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) ? eType : beanContext.getClassMeta(c);
+		if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
+			return cm;
+		if (detectRecursions || debug) {
+			if (stack.size() > maxDepth)
+				return null;
+			if (willRecurse(attrName, o, cm))
+				return null;
+			isBottom = false;
+			stack.add(new StackElement(stack.size(), attrName, o, cm));
+			if (debug)
+				logger.info(getStack(false));
+			set.put(o, o);
+		}
+		return cm;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if {@link SerializerProperties#SERIALIZER_detectRecursions} is enabled, and the specified
+	 * 	object is already higher up in the serialization chain.
+	 *
+	 * @param attrName The bean property attribute name, or some other identifier.
+	 * @param o The object to check for recursion.
+	 * @param cm The metadata on the object class.
+	 * @return <jk>true</jk> if recursion detected.
+	 * @throws SerializeException
+	 */
+	public boolean willRecurse(String attrName, Object o, ClassMeta<?> cm) throws SerializeException {
+		if (! (detectRecursions || debug))
+			return false;
+		if (! set.containsKey(o))
+			return false;
+		if (ignoreRecursions && ! debug)
+			return true;
+
+		stack.add(new StackElement(stack.size(), attrName, o, cm));
+		throw new SerializeException("Recursion occurred, stack={0}", getStack(true));
+	}
+
+	/**
+	 * Pop an object off the stack.
+	 */
+	public void pop() {
+		indent--;
+		if ((detectRecursions || debug) && ! isBottom)  {
+			Object o = stack.removeLast().o;
+			Object o2 = set.remove(o);
+			if (o2 == null)
+				addWarning("Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack.", o.getClass().getName(), stack);
+		}
+		isBottom = false;
+	}
+
+	/**
+	 * The current indentation depth.
+	 *
+	 * @return The current indentation depth.
+	 */
+	public int getIndent() {
+		return indent;
+	}
+
+	/**
+	 * Logs a warning message.
+	 *
+	 * @param msg The warning message.
+	 * @param args Optional printf arguments to replace in the error message.
+	 */
+	public void addWarning(String msg, Object... args) {
+		msg = args.length == 0 ? msg : MessageFormat.format(msg, args);
+		logger.warning(msg);
+		warnings.add(warnings.size() + 1 + ": " + msg);
+	}
+
+	/**
+	 * Specialized warning when an exception is thrown while executing a bean getter.
+	 *
+	 * @param p The bean map entry representing the bean property.
+	 * @param t The throwable that the bean getter threw.
+	 */
+	public void addBeanGetterWarning(BeanPropertyMeta<?> p, Throwable t) {
+		String prefix = (debug ? getStack(false) + ": " : "");
+		addWarning("{0}Could not call getValue() on property ''{1}'' of class ''{2}'', exception = {3}", prefix, p.getName(), p.getBeanMeta().getClassMeta(), t.getLocalizedMessage());
+	}
+
+	/**
+	 * Perform cleanup on this context object if necessary.
+	 *
+	 * @throws SerializeException
+	 */
+	public void close() throws SerializeException {
+		if (debug && warnings.size() > 0)
+			throw new SerializeException("Warnings occurred during serialization: \n" + StringUtils.join(warnings, "\n"));
+	}
+
+	private static class StackElement {
+		private int depth;
+		private String name;
+		private Object o;
+		private ClassMeta<?> aType;
+
+		private StackElement(int depth, String name, Object o, ClassMeta<?> aType) {
+			this.depth = depth;
+			this.name = name;
+			this.o = o;
+			this.aType = aType;
+		}
+
+		private String toString(boolean simple) {
+			StringBuilder sb = new StringBuilder().append('[').append(depth).append(']');
+			sb.append(StringUtils.isEmpty(name) ? "<noname>" : name).append(":");
+			sb.append(aType.toString(simple));
+			if (aType != aType.getFilteredClassMeta())
+				sb.append("/").append(aType.getFilteredClassMeta().toString(simple));
+			return sb.toString();
+		}
+	}
+
+	private String getStack(boolean full) {
+		StringBuilder sb = new StringBuilder();
+		for (StackElement e : stack) {
+			if (full) {
+				sb.append("\n\t");
+				for (int i = 1; i < e.depth; i++)
+					sb.append("  ");
+				if (e.depth > 0)
+					sb.append("->");
+				sb.append(e.toString(false));
+			} else {
+				sb.append(" > ").append(e.toString(true));
+			}
+		}
+		return sb.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup$SerializerEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup$SerializerEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup$SerializerEntry.class
new file mode 100755
index 0000000..ad993fd
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup$SerializerEntry.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.class
new file mode 100755
index 0000000..b2c10d7
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.java
new file mode 100755
index 0000000..509ed58
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerGroup.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.serializer;
+
+import static com.ibm.juno.core.utils.ArrayUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Represents a group of {@link Serializer Serializers} that can be looked up by media type.
+ *
+ *
+ * <h6 class='topic'>Description</h6>
+ * <p>
+ * 	Provides the following features:
+ * <ul>
+ * 	<li>Finds serializers based on HTTP <code>Accept</code> header values.
+ * 	<li>Sets common properties on all serializers in a single method call.
+ * 	<li>Locks all serializers in a single method call.
+ * 	<li>Clones existing groups and all serializers within the group in a single method call.
+ * </ul>
+ *
+ *
+ * <h6 class='topic'>Match ordering</h6>
+ * <p>
+ * 	Serializers are matched against <code>Accept</code> strings in the order they exist in this group.
+ * <p>
+ * 	Adding new entries will cause the entries to be prepended to the group.
+ *  	This allows for previous serializers to be overridden through subsequent calls.
+ * <p>
+ * 	For example, calling <code>g.append(S1.<jk>class</jk>,S2.<jk>class</jk>).append(S3.<jk>class</jk>,S4.<jk>class</jk>)</code>
+ * 	will result in the order <code>S3, S4, S1, S2</code>.
+ *
+ *
+ * <h6 class='topic'>Examples</h6>
+ * <p class='bcode'>
+ * 	<jc>// Construct a new serializer group</jc>
+ * 	SerializerGroup g = <jk>new</jk> SerializerGroup();
+ *
+ * 	<jc>// Add some serializers to it</jc>
+ * 	g.append(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);
+ *
+ * 	<jc>// Change settings for all serializers in the group and lock it.</jc>
+ * 	g.setProperty(SerializerProperties.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+ * 		.addFilters(CalendarFilter.ISO8601DT.<jk>class</jk>)
+ * 		.lock();
+ *
+ * 	<jc>// Find the appropriate serializer by Accept type</jc>
+ * 	String mediaTypeMatch = g.findMatch(<js>"text/foo, text/json;q=0.8, text/*;q:0.6, *\/*;q=0.0"</js>);
+ * 	WriterSerializer s = (WriterSerializer)g.getSerializer(mediaTypeMatch);
+ *
+ * 	<jc>// Serialize a bean to JSON text </jc>
+ * 	AddressBook addressBook = <jk>new</jk> AddressBook();  <jc>// Bean to serialize.</jc>
+ * 	String json = s.serialize(addressBook);
+ * </p>
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class SerializerGroup extends Lockable {
+
+	// Maps media-types to serializers.
+	private transient Map<String,SerializerEntry> entryMap = new HashMap<String,SerializerEntry>();
+	private transient LinkedList<SerializerEntry> tempEntries = new LinkedList<SerializerEntry>();
+	private transient SerializerEntry[] entries;
+
+
+	/**
+	 * Registers the specified REST serializers with this serializer group.
+	 *
+	 * @param s The serializers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup append(Serializer<?>...s) {
+		checkLock();
+		entries = null;
+		for (Serializer<?> ss : reverse(s))  {
+			SerializerEntry e = new SerializerEntry(ss);
+			tempEntries.addFirst(e);
+			for (String mediaType : e.mediaTypes)
+				entryMap.put(mediaType, e);
+		}
+		return this;
+	}
+
+	/**
+	 * Same as {@link #append(Serializer[])}, except specify classes instead of class instances
+	 * 	 of {@link Serializer}.
+	 * <p>
+	 * Note that this can only be used on {@link Serializer Serializers} with public no-arg constructors.
+	 *
+	 * @param s The serializers to append to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception Thrown if {@link Serializer} could not be constructed.
+	 */
+	public SerializerGroup append(Class<? extends Serializer<?>>...s) throws Exception {
+		checkLock();
+		for (Class<? extends Serializer<?>> ss : reverse(s))
+			try {
+			append(ss.newInstance());
+			} catch (NoClassDefFoundError e) {
+				// Ignore if dependent library not found (e.g. Jena).
+				System.err.println(e);
+			}
+		return this;
+	}
+
+	/**
+	 * Same as {@link #append(Class[])}, except specify a single class to avoid unchecked compile warnings.
+	 *
+	 * @param c The serializer to append to this group.
+	 * @return This object (for method chaining).
+	 * @throws Exception Thrown if {@link Serializer} could not be constructed.
+	 */
+	public SerializerGroup append(Class<? extends Serializer<?>> c) throws Exception {
+		checkLock();
+		try {
+		append(c.newInstance());
+		} catch (NoClassDefFoundError e) {
+			// Ignore if dependent library not found (e.g. Jena).
+			System.err.println(e);
+		}
+		return this;
+	}
+
+	/**
+	 * Returns the serializer registered to handle the specified media type.
+	 * <p>
+	 * The media-type string must not contain any parameters or q-values.
+	 *
+	 * @param mediaType The media-type string (e.g. <js>"text/json"</js>
+	 * @return The serializer that handles the specified accept content type, or <jk>null</jk> if
+	 * 		no serializer is registered to handle it.
+	 */
+	public Serializer<?> getSerializer(String mediaType) {
+		SerializerEntry e = entryMap.get(mediaType);
+		return (e == null ? null : e.serializer);
+	}
+
+	/**
+	 * Searches the group for a serializer that can handle the specified <code>Accept</code> value.
+	 * <p>
+	 * 	The <code>accept</code> value complies with the syntax described in RFC2616, Section 14.1, as described below:
+	 * <p class='bcode'>
+	 * 	Accept         = "Accept" ":"
+	 * 	                  #( media-range [ accept-params ] )
+	 *
+	 * 	media-range    = ( "*\/*"
+	 * 	                  | ( type "/" "*" )
+	 * 	                  | ( type "/" subtype )
+	 * 	                  ) *( ";" parameter )
+	 * 	accept-params  = ";" "q" "=" qvalue *( accept-extension )
+	 * 	accept-extension = ";" token [ "=" ( token | quoted-string ) ]
+	 * </p>
+	 * <p>
+	 * 	The general idea behind having the serializer resolution be a two-step process is so that
+	 * 	the matched media type can be passed in to the {@link WriterSerializer#doSerialize(Object, Writer, SerializerContext)} method.
+	 * 	For example...
+	 * <p class='bcode'>
+	 * 	String acceptHeaderValue = request.getHeader(<js>"Accept"</js>);
+	 * 	String matchingMediaType = group.findMatch(acceptHeaderValue);
+	 * 	if (matchingMediaType == <jk>null</jk>)
+	 * 		<jk>throw new</jk> RestException(<jsf>SC_NOT_ACCEPTABLE</jsf>);
+	 * 	WriterSerializer s = (WriterSerializer)group.getSerializer(matchingMediaType);
+	 *  s.serialize(getPojo(), response.getWriter(), response.getProperties(), matchingMediaType);
+	 * </p>
+	 *
+	 * @param accept The accept string.
+	 * @return The media type registered by one of the parsers that matches the <code>accept</code> string,
+	 * 	or <jk>null</jk> if no media types matched.
+	 */
+	public String findMatch(String accept) {
+		MediaRange[] mr = MediaRange.parse(accept);
+		if (mr.length == 0)
+			mr = MediaRange.parse("*/*");
+
+		for (MediaRange a : mr)
+			for (SerializerEntry e : getEntries())
+				for (MediaRange a2 : e.mediaRanges)
+					if (a.matches(a2))
+						return a2.getMediaType();
+
+		return null;
+	}
+
+	/**
+	 * Returns the media types that all serializers in this group can handle
+	 * <p>
+	 * Entries are ordered in the same order as the serializers in the group.
+	 *
+	 * @return The list of media types.
+	 */
+	public List<String> getSupportedMediaTypes() {
+		List<String> l = new ArrayList<String>();
+		for (SerializerEntry e : getEntries())
+			for (String mt : e.mediaTypes)
+				if (! l.contains(mt))
+					l.add(mt);
+		return l;
+	}
+
+	private SerializerEntry[] getEntries() {
+		if (entries == null)
+			entries = tempEntries.toArray(new SerializerEntry[tempEntries.size()]);
+		return entries;
+	}
+
+	static class SerializerEntry {
+		Serializer<?> serializer;
+		MediaRange[] mediaRanges;
+		String[] mediaTypes;
+
+		SerializerEntry(Serializer<?> s) {
+			serializer = s;
+
+			mediaTypes = new String[s.getMediaTypes().length];
+			int i = 0;
+			for (String mt : s.getMediaTypes())
+				mediaTypes[i++] = mt.toLowerCase(Locale.ENGLISH);
+
+			List<MediaRange> l = new LinkedList<MediaRange>();
+			for (i = 0; i < mediaTypes.length; i++)
+				l.addAll(Arrays.asList(MediaRange.parse(mediaTypes[i])));
+			mediaRanges = l.toArray(new MediaRange[l.size()]);
+		}
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Convenience methods for setting properties on all serializers.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Shortcut for calling {@link Serializer#setProperty(String, Object)} on all serializers in this group.
+	 *
+	 * @param property The property name.
+	 * @param value The property value.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup setProperty(String property, Object value) throws LockedException {
+		checkLock();
+		for (SerializerEntry e : getEntries())
+			e.serializer.setProperty(property, value);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Serializer#setProperties(ObjectMap)} on all serializers in this group.
+	 *
+	 * @param properties The properties to set.  Ignored if <jk>null</jk>.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup setProperties(ObjectMap properties) {
+		checkLock();
+		if (properties != null)
+			for (Map.Entry<String,Object> e : properties.entrySet())
+				setProperty(e.getKey(), e.getValue());
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Serializer#addNotBeanClasses(Class[])} on all serializers in this group.
+	 *
+	 * @param classes The classes to specify as not-beans to the underlying bean context of all serializers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup addNotBeanClasses(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (SerializerEntry e : getEntries())
+			e.serializer.addNotBeanClasses(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Serializer#addFilters(Class[])} on all serializers in this group.
+	 *
+	 * @param classes The classes to add bean filters for to the underlying bean context of all serializers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup addFilters(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (SerializerEntry e : getEntries())
+			e.serializer.addFilters(classes);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling {@link Serializer#addImplClass(Class, Class)} on all serializers in this group.
+	 *
+	 * @param <T> The interface or abstract class type.
+	 * @param interfaceClass The interface or abstract class.
+	 * @param implClass The implementation class.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public <T> SerializerGroup addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
+		checkLock();
+		for (SerializerEntry e : getEntries())
+			e.serializer.addImplClass(interfaceClass, implClass);
+		return this;
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Overridden methods
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Locks this group and all serializers in this group.
+	 */
+	@Override /* Lockable */
+	public SerializerGroup lock() {
+		super.lock();
+		for (SerializerEntry e : getEntries())
+			e.serializer.lock();
+		return this;
+	}
+
+	/**
+	 * Clones this group and all serializers in this group.
+	 */
+	@Override /* Lockable */
+	public SerializerGroup clone() throws CloneNotSupportedException {
+		SerializerGroup c = (SerializerGroup)super.clone();
+		c.entryMap = new HashMap<String,SerializerEntry>();
+		c.tempEntries = new LinkedList<SerializerEntry>();
+		c.entries = null;
+		SerializerEntry[] e = getEntries();
+		for (int i = e.length-1; i >= 0; i--)
+			c.append(e[i].serializer.clone());
+		return c;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.class
new file mode 100755
index 0000000..ace6ce9
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/serializer/SerializerProperties.class differ


[08/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/package.html
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/package.html b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/package.html
new file mode 100755
index 0000000..790aa41
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/urlencoding/package.html
@@ -0,0 +1,1410 @@
+<!DOCTYPE HTML>
+<!--
+    Licensed Materials - Property of IBM
+    (c) Copyright IBM Corporation 2014. All Rights Reserved.
+   
+    Note to U.S. Government Users Restricted Rights:  
+    Use, duplication or disclosure restricted by GSA ADP Schedule 
+    Contract with IBM Corp. 
+ -->
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<style type="text/css">
+		/* For viewing in Page Designer */
+		@IMPORT url("../../../../../../javadoc.css");
+
+		/* For viewing in REST interface */
+		@IMPORT url("../htdocs/javadoc.css");
+		body { 
+			margin: 20px; 
+		}	
+	</style>
+	<script>
+		/* Replace all @code and @link tags. */	
+		window.onload = function() {
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
+			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
+		}
+	</script>
+</head>
+<body>
+<p>URL encoding serialization and parsing support</p>
+<script>
+	function toggle(x) {
+		var div = x.nextSibling;
+		while (div != null && div.nodeType != 1)
+			div = div.nextSibling;
+		if (div != null) {
+			var d = div.style.display;
+			if (d == 'block' || d == '') {
+				div.style.display = 'none';
+				x.className += " closed";
+			} else {
+				div.style.display = 'block';
+				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
+			}
+		}
+	}
+</script>
+
+<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
+<ol class='toc'>
+	<li><p><a class='doclink' href='#Overview'>URL encoding support overview</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#OverviewExample'>Example</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#UrlEncodingSerializer'>UrlEncodingSerializer and UonSerializer classes</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
+		<li><p><a class='doclink' href='#Collections'>Collections</a></p>
+		<li><p><a class='doclink' href='#Recursion'> Non-tree models and recursion detection</a></p>
+		<li><p><a class='doclink' href='#SerializerConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#SerializerOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#UrlEncodingParser'>UrlEncodingParser and UonParser classes</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#GenericParsing'>Parsing into generic POJO models</a></p>
+		<li><p><a class='doclink' href='#ParserConfigurableProperties'>Configurable properties</a></p>
+		<li><p><a class='doclink' href='#ParserOtherNotes'>Other notes</a></p>
+	</ol>
+	<li><p><a class='doclink' href='#RestApiSupport'>REST API support</a></p> 
+	<ol>
+		<li><p><a class='doclink' href='#RestServerSupport'>REST server support</a></p>
+		<ol>
+		<li><p><a class='doclink' href='#RestServletDefault'>Using RestServletDefault</a></p>
+		<li><p><a class='doclink' href='#RestServlet'>Using RestServlet with annotations</a></p>
+		<li><p><a class='doclink' href='#DefaultProvider'>Using JAX-RS DefaultProvider</a></p>
+		<li><p><a class='doclink' href='#BaseProvider'>Using JAX-RS BaseProvider with annotations</a></p>
+		</ol>
+		<li><p><a class='doclink' href='#RestClientSupport'>REST client support</a></p>
+	</ol>	
+</ol>
+
+<!-- ======================================================================================================== -->
+<a id="Overview"></a>
+<h2 class='topic' onclick='toggle(this)'>1 - URL encoding support overview</h2>
+<div class='topic'>
+	<p>
+		Juno supports converting arbitrary POJOs to and from URL-encoded strings using ultra-efficient serializers and parsers.<br>
+		The serializer converts POJOs directly to URL-encoded strings without the need for intermediate DOM objects using a highly-efficient state machine.<br>
+		Likewise, the parser creates POJOs directly from URL-encoded strings without the need for intermediate DOM objects. 
+	</p>
+	<p>
+		Juno uses UON (URL-Encoded Object Notation) for representing POJOs.  
+		The UON specification can be found <a href='doc-files/rfc_uon.txt'>here</a>.
+	</p>
+	<p>
+		Juno can serialize and parse instances of any of the following POJO types:
+	</p>
+	<ul>
+		<li>Java primitives and primitive objects (e.g. <code>String</code>, <code>Integer</code>, <code>Boolean</code>, <code>Float</code>).
+		<li>Java Collections Framework objects (e.g. <code>HashSet</code>, <code>TreeMap</code>) containing anything on this list.
+		<li>Multi-dimensional arrays of any type on this list.
+		<li>Java Beans with properties of any type on this list.
+		<li>Classes with standard transformations to and from <code>Strings</code> (e.g. classes containing <code>toString()</code>, <code>fromString()</code>, <code>valueOf()</code>, <code>constructor(String)</code>).
+		<li>Non-serializable classes and properties with associated <code>PojoFilters</code> that convert them to serializable forms.
+	</ul>
+	<p>
+		Refer to <a href='../package-summary.html#PojoCategories' class='doclink'>POJO Categories</a> for a complete definition of supported POJOs.
+	</p>
+	<h6 class='topic'>Prerequisites</h6>
+	<p>
+		The Juno URL-encoding serialization and parsing support does not require any external prerequisites.  
+		It only requires Java 1.6 or above.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="OverviewExample"></a>
+	<h3 class='topic' onclick='toggle(this)'>1.1 - URL-encoding support overview - example</h3>
+	<div class='topic'>
+		<p>
+			The example shown here is from the Address Book resource located in the <code>com.ibm.juno.sample.war</code> application.<br>
+			The POJO model consists of a <code>List</code> of <code>Person</code> beans, with each <code>Person</code> containing
+				zero or more <code>Address</code> beans.
+		</p>
+		<p>
+			When you point a browser at <code>/sample/addressBook/people/1</code>, the POJO is rendered as HTML:
+		</p>
+		<img class='bordered' src="doc-files/Example_HTML.png">
+		<p>
+			By appending <code>?Accept=application/x-www-form-urlencoded&plainText=true</code> to the URL, you can view the data as a URL-encoded string:
+		</p>
+		<img class='bordered' src="doc-files/Example_UrlEncoding.png">
+		
+		<p>
+			Juno supports two kinds of serialization:
+		</p>
+		<ul>
+			<li>Construction of full URL query parameter strings (e.g. <code>&key=value</code> pairs) from beans and maps.
+			<li>Construction of URL query parameter value strings (e.g. just the <code>value</code> portion of <code>&key=value</code> pairs) from any POJO.  
+		</ul>
+		<p>
+			Top-level beans and maps can serialized as key/value pairs as shown below:
+		</p>
+		<h6 class='figure'>Example:  A bean with 2 string properties, 'foo' and 'baz', serialized to a query string</h6>
+		<p class='bcode'>	http://localhost/sample?<xa>foo</xa>=<xs>bar</xs>&<xa>baz</xa>=<xs>bing</xs></p>
+		<p>
+			Lower-level beans and maps are also serialized as key/value pairs, but are surrounded with a <js>"$o(...)"</js> construct to denote an object mapping, 
+				and uses a comma as the parameter delimiter instead of <js>"&"</js>.<br>
+		</p>
+		<h6 class='figure'>Example:  A bean serialized as a query parameter value.</h6>
+		<p class='bcode'>	http://localhost/sample?<xa>a1</xa>=$o(<xa>foo</xa>=<xs>bar</xs>,<xa>baz</xa>=<xs>bing</xs>)</p>
+		<p>
+			The UON specification defines two separate modes:  
+		</p>
+		<ul>
+			<li>Strict mode - Serialized model is fully equivalent to JSON and can be losslessly converted back and forth into a JSON model without additional information.
+			<li>Lax mode - A shortened form that excludes data type information.  Ideal if the data types of values are fixed and already known by the parser.
+		</ul>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Java type</th><th>JSON equivalent</th><th>Strict syntax</th><th>Lax syntax</th></tr>
+			<tr>
+				<td>Maps/beans</td>
+				<td>OBJECT</td>
+				<td class='code'><xa>a1</xa>=$o(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>)<br><xa>a1</xa>=$o(<xa>b1</xa>=$o(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+				<td class='code'><xa>a1</xa>=(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>)<br><xa>a1</xa>=(<xa>b1</xa>=(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+			</tr>
+			<tr>
+				<td>Collections/arrays</td>
+				<td>ARRAY</td>
+				<td class='code'><xa>a1</xa>=$a(<xs>x1</xs>,<xs>x2</xs>)<br><xa>a1</xa>=$a($a(<xs>x1</xs>,<xs>x2</xs>),$a(<xs>x3</xs>,<xs>x4</xs>))<br><xa>a1</xa>=$a($o(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>),$o(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+				<td class='code'><xa>a1</xa>=(<xs>x1</xs>,<xs>x2</xs>)<br><xa>a1</xa>=((<xs>x1</xs>,<xs>x2</xs>),(<xs>x3</xs>,<xs>x4</xs>))<br><xa>a1</xa>=((<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>),(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+			</tr>
+			<tr>
+				<td>Booleans</td>
+				<td>BOOLEAN</td>
+				<td class='code'><xa>a1</xa>=$b(<xs>true</xs>)&<xa>a2</xa>=$b(<xs>false</xs>)</td>
+				<td class='code'><xa>a1</xa>=<xs>true</xs>&<xa>a2</xa>=<xs>false</xs></td>
+			</tr>
+			<tr>
+				<td>int/float/double/...</td>
+				<td>NUMBER</td>
+				<td class='code'><xa>a1</xa>=$n(<xs>123</xs>)&<xa>a2</xa>=$n(<xs>1.23e1</xs>)</td>
+				<td class='code'><xa>a1</xa>=<xs>123</xs>&<xa>a2</xa>=<xs>1.23e1</xs></td>
+			</tr>
+			<tr>
+				<td>null</td>
+				<td>NULL</td>
+				<td class='code'><xa>a1</xa>=<xs>%00</xs></td>
+				<td class='code'><xa>a1</xa>=<xs>%00</xs></td>
+			</tr>
+			<tr>
+				<td>String</td>
+				<td>STRING</td>
+				<td class='code'><xa>a1</xa>=<xs>foobar</xs></td>
+				<td class='code'><xa>a1</xa>=<xs>foobar</xs></td>
+			</tr>
+		</table>
+		<p>
+			Refer to the <a href='doc-files/rfc_uon.txt'>UON specification</a> for a complete set of syntax rules.		
+		<p>
+			Filters can be used to convert non-serializable POJOs into serializable forms, such as converting 
+				<code>Calendar</code> object to ISO8601 strings, or <code><jk>byte</jk>[]</code> arrays to Base-64 encoded strings.<br>
+			These filters can be associated at various levels:
+		</p>
+		<ul>
+			<li>On serializer and parser instances to handle all objects of the class type globally.
+			<li>On classes through the <code><ja>@Bean</ja></code> annotation.
+			<li>On bean properties through the <code><ja>@BeanProperty</ja></code> annotations.
+		</ul>
+		<h6 class='figure'>Example:  A serialized Calendar object using <code>CalendarFilter.RFC2822DTZ</code> filter.</h6>
+		<p class='bcode'>	http://localhost/sample?<xa>a1=<js>Sun~,+03+Mar+1901+09:05:06+GMT</js></p>
+		<p>
+			For more information about filters, refer to {@link com.ibm.juno.core.filter}.
+		</p>
+	</div>
+	
+</div>
+
+<!-- ======================================================================================================== -->
+<a id="UrlEncodingSerializer"></a>
+<h2 class='topic' onclick='toggle(this)'>2 - UrlEncodingSerializer and UonSerializer classes</h2>
+<div class='topic'>
+	<p>
+		{@link com.ibm.juno.core.urlencoding.UrlEncodingSerializer} and {@link com.ibm.juno.core.urlencoding.UonSerializer} classes are used to convert POJOs to URL-encoded strings.<br>
+		The <code>UonSerializer</code> class converts parameter values to UON notation. 
+		The <code>UrlEncodingSerializer</code> class converts a POJO to key/value URL-Encoded pairs using <code>UonSerializer</code> to serialize the values.
+		If you're trying to construct complete URL-Encoded entities, use <code>UrlEncodingSerializer</code>. 
+		If you're constructing your own key/value pairs, use <code>UonSerializer</code>.
+	</p>	
+	<p>
+		The serializers include several configurable settings.<br>
+		Static reusable instances of serializers are provided with commonly-used settings:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.urlencoding.UrlEncodingSerializer#DEFAULT} - All default settings, strict mode.
+		<li>{@link com.ibm.juno.core.urlencoding.UrlEncodingSerializer#DEFAULT_SIMPLE} - All default settings, lax mode.
+		<li>{@link com.ibm.juno.core.urlencoding.UrlEncodingSerializer#DEFAULT_READABLE} - Use whitespace and indentation for readability.
+		<li>{@link com.ibm.juno.core.urlencoding.UonSerializer#DEFAULT} - All default settings, strict mode.
+		<li>{@link com.ibm.juno.core.urlencoding.UonSerializer#DEFAULT_SIMPLE} - All default settings, lax mode.
+		<li>{@link com.ibm.juno.core.urlencoding.UonSerializer#DEFAULT_READABLE} - Use whitespace and indentation for readability.
+		<li>{@link com.ibm.juno.core.urlencoding.UonSerializer#DEFAULT_ENCODING} - Same as DEFAULT, but use URL-Encoding on special characters.
+		<li>{@link com.ibm.juno.core.urlencoding.UonSerializer#DEFAULT_SIMPLE_ENCODING} - Same as DEFAULT_SIMPLE, but use URL-Encoding on special characters.
+	</ul>
+	<p>
+		The general guidelines on which serializer to use is:
+	</p>
+	<ul>
+		<li>Use strict mode serializers if the data types of the value are not known on the parsing side, and this
+			information needs to be preserved during transmission.
+		<li>Use lax mode serializers if the data types of the value are known on the parsing side. 
+			For example, if you're serializing/parsing beans, lax mode is usually sufficient since the data types
+			can be inferred from the bean properties.
+		<li>Use encoding serializers when you're using the results to construct a URI yourself, and therefore 
+			need invalid URI characters to be encoded.
+		<li>Use unencoding serializers when you're creating parameter values and passing them off to some other
+			utility class that will itself encode invalid URI characters.
+		<li>Use the readable serializer for debugging purposes.
+	</ul>
+
+	<h6 class='topic'>Notes about examples</h6>
+	<p>
+		The examples shown in this document will use default strict settings.<br>
+		For brevity, the examples will use public fields instead of getters/setters to reduce the size of the examples.<br>
+		In the real world, you'll typically want to use standard bean getters and setters.
+	</p>
+	<p>
+		To start off simple, we'll begin with the following simplified bean and build upon it.
+	</p>
+	<p class='bcode'>
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name) {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+		}
+	}
+	</p>
+	<p>
+		The following code shows how to convert this to a URL-encoded value:
+	</p>
+	<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	UonSerializer s = UonSerializer.<jsf>DEFAULT</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+
+	<jc>// Serialize the bean to URL-encoded parameter value.</jc>
+	String urlencoded = s.serialize(p);
+	</p>
+	<p>
+		The code above produces the following output:
+	</p>
+	<p class='bcode'>
+	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>)
+	</p>
+	<p>
+		The {@link com.ibm.juno.core.urlencoding.UrlEncodingSerializer} class converts
+		maps and beans into top-level query parameter strings.
+	</p>
+	<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	UrlEncodingSerializer s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>;
+	
+	<jc>// Serialize the bean to URL-encoded query string.</jc>
+	String urlencoded = s.serialize(p);
+	</p>
+	<p>
+		The code above produces the following output:
+	</p>
+	<p class='bcode'>
+	<xa>id</xa>=$n(<xs>1</xs>)&<xa>name</xa>=<xs>John+Smith</xs>
+	</p>
+	<p>
+		The general method guidelines are as follows:
+	</p>
+	<ul>
+		<li>Use <code>UonSerializer</code> to create individual query parameter values.
+		<li>Use <code>UrlEncodingSerializer</code> to create complete URL-encoded query strings.
+	</ul>
+	<p>
+		By default, the <code>UrlEncodingSerializer</code> class will URL-Encode special characters, and the <code>UonSerializer</code> will NOT URL-encode special characters.  
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="BeanAnnotations"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.1 - @Bean and @BeanProperty annotations</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.core.annotation.Bean @Bean} and {@link com.ibm.juno.core.annotation.BeanProperty @BeanProperty} annotations
+				are used to customize the behavior of beans across the entire framework.<br>
+			They have various uses:
+		</p>
+		<ul>
+			<li>Hiding bean properties.
+			<li>Specifying the ordering of bean properties.
+			<li>Overriding the names of bean properties.
+			<li>Associating filters at both the class and property level (to convert non-serializable POJOs to serializable forms).
+		</ul>
+		<p>
+			For example, we now add a <code>birthDate</code> property, and associate a filter with it to transform
+				it to an ISO8601 date-time string in GMT time.<br>
+			We'll also add a couple of <code>URI</code> properties.<br>
+			By default, <code>Calendars</code> are treated as beans by the framework, which is usually not how you want them serialized.<br>
+			Using filters, we can convert them to standardized string forms.
+		</p>
+		<p class='bcode'>	
+	<jk>public class</jk> Person {
+		<jc>// Bean properties</jc>
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>name</jf>;
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>addressBookUri</jf>;
+
+		<ja>@BeanProperty</ja>(filter=CalendarFilter.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
+
+
+		<jc>// Bean constructor (needed by parser)</jc>
+		<jk>public</jk> Person() {}
+
+		<jc>// Normal constructor</jc>
+		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
+			<jk>this</jk>.<jf>id</jf> = id;
+			<jk>this</jk>.<jf>name</jf> = name;
+			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
+			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
+			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
+			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
+		}
+	}
+		</p>
+		<p>
+			Next, we alter our code to pass in the birthdate:
+		</p>
+		<p class='bcode'>
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+		</p>
+		<p>
+			Now when we rerun the sample code, we'll get the following:
+		</p>
+		<p class='bcode'>
+	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>,<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>)
+		</p>
+		<p>
+			Using <code>UrlEncodingSerializer</code> instead would create the following:
+		</p>
+		<p class='bcode'>
+	<xa>id</xa>=$n(<xs>1</xs>)&<xa>name</xa>=<xs>John+Smith</xs>&<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>&<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>&<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>
+		</p>
+		<p>
+			Another useful feature is the {@link com.ibm.juno.core.annotation.Bean#propertyNamer()} annotation that allows you to plug in your own
+				logic for determining bean property names.<br>
+			The {@link com.ibm.juno.core.PropertyNamerDashedLC} is an example of an alternate property namer.
+			It converts bean property names to lowercase-dashed format.
+		</p>
+		<h6 class='figure'>Example</h6>
+		<p class='bcode'>	
+	<ja>@Bean</ja>(propertyNamer=PropertyNamerDashedLC.<jk>class</jk>)
+	<jk>public class</jk> Person {
+		...
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>,<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,<xa>address-book-uri</xa>=<xs>http://sample/addressBook</xs>,<xa>birth-date</xa>=<xs>1946-08-12T00:00:00Z</xs>)
+		</p>
+	</div>
+	
+		
+	<!-- ======================================================================================================== -->
+	<a id="Collections"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.2 - Collections</h3>
+	<div class='topic'>
+		<p>
+			In our example, let's add a list-of-beans property to our sample class:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Person {
+		
+		<jc>// Bean properties</jc>
+		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
+		...
+	}
+		</p>
+		<p>
+			The <code>Address</code> class has the following properties defined:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> Address {
+
+		<jc>// Bean properties</jc>
+		<jk>public</jk> URI <jf>uri</jf>;
+		<jk>public</jk> URI <jf>personUri</jf>;
+		<jk>public int</jk> <jf>id</jf>;
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
+		<jk>public boolean</jk> <jf>isCurrent</jf>;
+	}
+		</p>
+		<p>
+			Next, add some quick-and-dirty code to add an address to our person bean:
+		</p>
+		<p class='bcode'>
+	<jc>// Use serializer with readable output, simple mode.</jc>
+	UonSerializer s = UonSerializer.<jsf>DEFAULT_READABLE</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+		</p>
+		<p>
+			Now when we run the sample code, we get the following (in readable format):
+		</p>
+		<p class='bcode'>
+	$o(
+		<xa>id</xa>=$n(<xs>1</xs>), 
+		<xa>name</xa>=<xs>John+Smith</xs>, 
+		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+		<xa>addresses</xa>=$a(
+			$o(
+				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
+				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+				<xa>id</xa>=$n(<xs>1</xs>), 
+				<xa>street</xa>=<xs>100+Main+Street</xs>, 
+				<xa>city</xa>=<xs>Anywhereville</xs>, 
+				<xa>state</xa>=<xs>NY</xs>, 
+				<xa>zip</xa>=$n(<xs>12345</xs>), 
+				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+			)
+		)
+	)
+		</p>
+		<p>
+			If we were to use lax mode instead, we would get the following:
+		</p>
+		<p class='bcode'>
+	(
+		<xa>id</xa>=<xs>1</xs>, 
+		<xa>name</xa>=<xs>John+Smith</xs>, 
+		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+		<xa>addresses</xa>=(
+			(
+				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
+				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+				<xa>id</xa>=<xs>1</xs>, 
+				<xa>street</xa>=<xs>100+Main+Street</xs>, 
+				<xa>city</xa>=<xs>Anywhereville</xs>, 
+				<xa>state</xa>=<xs>NY</xs>, 
+				<xa>zip</xa>=<xs>12345</xs>, 
+				<xa>isCurrent</xa>=<xs>true</xs>
+			)
+		)
+	)
+		</p>
+		<p>
+			Note how the data type information is removed, so it's not possible to distinguish between numbers/booleans/strings, and between objects/arrays.
+			However, this is fine if we're parsing back into the same beans, since we can inver the data types from the bean property metadata.
+		</p>
+		<p>
+			If we were to use <code>UrlEncodingSerializer</code> instead, we would get the following:
+		</p>
+		<p class='bcode'>
+	<xa>id</xa>=$n(<xs>1</xs>)& 
+	<xa>name</xa>=<xs>John+Smith</xs>& 
+	<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>& 
+	<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>&
+	<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>&
+	<xa>addresses</xa>=$a(
+		$o(
+			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
+			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+			<xa>id</xa>=$n(<xs>1</xs>), 
+			<xa>street</xa>=<xs>100+Main+Street</xs>, 
+			<xa>city</xa>=<xs>Anywhereville</xs>, 
+			<xa>state</xa>=<xs>NY</xs>, 
+			<xa>zip</xa>=$n(<xs>12345</xs>), 
+			<xa>isCurrent</xa>=$b(<xs>true</xs>)
+		)
+	)
+		</p>
+	</div>
+	<p>
+		Note how the top level <code>Person</code> bean is serialized using the standard <js>'&'</js> delimiter, whereas the lower-level <code>Address</code>
+			bean is serialized using the <js>','</js> character to prevent the <code>addresses</code> field from being incompletely parsed.
+	</p>
+	
+
+
+
+	<!-- ======================================================================================================== -->
+	<a id="Recursion"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.3 - Non-tree models and recursion detection</h3>
+	<div class='topic'>
+		<p>
+			The URL-encoding serializer is designed to be used against POJO tree structures. <br> 
+			It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).<br>
+			If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
+				be thrown (if {@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth} is not reached first).
+		</p>
+		<p>
+			If you still want to use the URL-encoding serializer on such models, Juno provides the 
+				{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions} setting.<br>
+			It tells the serializer to look for instances of an object in the current branch of the tree and
+				skip serialization when a duplicate is encountered.
+		</p>
+		<p>
+			For example, let's make a POJO model out of the following classes:
+		</p>
+		<p class='bcode'>
+	<jk>public class</jk> A {
+		<jk>public</jk> B b;
+	}
+	
+	<jk>public class</jk> B {
+		<jk>public</jk> C c;
+	}
+	
+	<jk>public class</jk> C {
+		<jk>public</jk> A a;
+	}
+		</p>
+		<p>
+			Now we create a model with a loop and serialize the results.
+		</p>
+		<p class='bcode'>
+	<jc>// Clone an existing serializer and set property for detecting recursions.</jc>
+	UrlEncodingSerializer s = UrlEncodingSerializer.<jsf>DEFAULT_READABLE</jsf>.clone().setProperty(SerializerProperties.<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>);
+
+	<jc>// Create a recursive loop.</jc>
+	A a = <jk>new</jk> A();
+	a.<jf>b</jf> = <jk>new</jk> B();
+	a.<jf>b</jf>.<jf>c</jf> = <jk>new</jk> C();
+	a.<jf>b</jf>.<jf>c</jf>.<jf>a</jf> = a;
+	
+	<jc>// Serialize.</jc>
+	String json = s.serialize(a);
+		</p>
+		<p>
+			What we end up with is the following, which does not serialize the contents of the <code>c</code> field:
+		</p>
+		<p class='bcode'>
+	$o(
+		<xa>b</xa>=$o(
+			<xa>c</xa>=$o()
+		)
+	)
+		</p>
+		<p>
+			Without recursion detection enabled, this would cause a stack-overflow error.
+		</p>
+		<p>
+			Recursion detection introduces a performance penalty of around 20%.<br>
+			For this reason the setting is disabled by default.
+		</p>
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.4 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>UrlEncodingSerializer</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.urlencoding.UonSerializerProperties#UON_simpleMode}</td>
+				<td>Use UON lax mode instead of strict mode</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.urlencoding.UonSerializerProperties#UON_useWhitespace}</td>
+				<td>Use whitespace in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.urlencoding.UonSerializerProperties#UON_encodeChars}</td>
+				<td>Encode invalid URI characters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_maxDepth}</td>
+				<td>Maximum serialization depth</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_detectRecursions}</td>
+				<td>Automatically detect POJO recursions</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_useIndentation}</td>
+				<td>Use indentation in output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimNullProperties}</td>
+				<td>Trim null bean property values from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyLists}</td>
+				<td>Trim empty lists and arrays from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_trimEmptyMaps}</td>
+				<td>Trim empty maps from output</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_relativeUriBase}</td>
+				<td>URI context root for relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.serializer.SerializerProperties#SERIALIZER_absolutePathUriBase}</td>
+				<td>URI authority for absolute path relative URIs</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireDefaultConstructor}</td>
+				<td>Beans require no-arg constructors</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSerializable}</td>
+				<td>Beans require <code>Serializable</code> interface</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSettersForGetters}</td>
+				<td>Beans require setters for getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beansRequireSomeProperties}</td>
+				<td>Beans require some properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanConstructorVisibility}</td>
+				<td>Look for bean constructors with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanClassVisibility}</td>
+				<td>Look for bean classes with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_beanFieldVisibility}</td>
+				<td>Look for bean fields with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_methodVisibility}</td>
+				<td>Look for bean methods with the specified minimum visibility</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_useInterfaceProxies}</td>
+				<td>Use interface proxies</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownBeanProperties}</td>
+				<td>Ignore unknown properties</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreUnknownNullBeanProperties}</td>
+				<td>Ignore unknown properties with null values</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignorePropertiesWithoutSetters}</td>
+				<td>Ignore properties without setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnGetters}</td>
+				<td>Ignore invocation errors when calling getters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_ignoreInvocationExceptionsOnSetters}</td>
+				<td>Ignore invocation errors when calling setters</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_addNotBeanPackages}</td>
+				<td>Add to the list of packages whose classes should not be considered beans</td>
+			</tr>	
+			<tr>
+				<td>{@link com.ibm.juno.core.BeanContextProperties#BEAN_removeNotBeanPackages}</td>
+				<td>Remove from the list of packages whose classes should not be considered beans</td>
+			</tr>	
+		</table>	
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="SerializerOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>2.5 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno serializers, the URL-encoding serializers are thread safe and maintain an internal cache of bean classes encountered.<br>
+				For performance reasons, it's recommended that serializers be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="UrlEncodingParser"></a>
+<h2 class='topic' onclick='toggle(this)'>3 - UrlEncodingParser and UonParser classes</h2>
+<div class='topic'>
+	<p>
+		{@link com.ibm.juno.core.urlencoding.UrlEncodingParser} and {@link com.ibm.juno.core.urlencoding.UonParser} classes are used to convert URL-encoded strings back into POJOs.<br>
+		The <code>UonParser</code> class converts UON-encoded parameter values to POJOs.
+		The <code>UrlEncodingParser</code> class converts entire URL-Encoded strings to POJOs using <code>UonSerializer</code> to serialize indivisual values.
+		If you're trying to parse an entire URL-Encoded string, use <code>UrlEncodingParser</code>. 
+		If you're trying to parse an individual value (such as that returned by <code>RestServlet.getParameter(name)</code>), use <code>UonParser</code>.
+	</p>	
+	<p>
+		The following static reusable instances of <code>UrlEncodingParser</code> are provided for convenience:
+	</p>
+	<ul>
+		<li>{@link com.ibm.juno.core.urlencoding.UrlEncodingParser#DEFAULT} - Default parser for entire URL-encoded strings, decode <code>%xx</code> sequences.
+		<li>{@link com.ibm.juno.core.urlencoding.UonParser#DEFAULT} - Default parser for URL-encoded parameter values, don't decode <code>%xx</code> sequences.
+		<li>{@link com.ibm.juno.core.urlencoding.UonParser#DEFAULT_DECODING} - Default parser for URL-encoded parameter values, decode <code>%xx</code> sequences.
+	</ul>
+	<p>
+		The general guildlines on which parser to use is:
+	</p>
+	<ul>
+		<li>Use the <code>DEFAULT</code> parser for parameter values that have already had <code>%xx</code> sequences decoded, 
+			such as when using <code>HttpServletRequest.getParameter(name)</code>.
+		<li>Use the <code>DEFAULT_ENCODED</code> parser if the input has not already had <code>%xx</code> sequences decoded.
+	</ul>
+	<p>
+		Let's build upon the previous example and parse the generated URL-encoded string back into the original bean.<br>
+		We start with the URL-encoded string that was generated.
+	</p>
+	<p class='bcode'>
+	<jc>// Use serializer with readable output.</jc>
+	UonSerializer s = UonSerializer.<jsf>DEFAULT_READABLE</jsf>;
+
+	<jc>// Create our bean.</jc>
+	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, <js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
+	Address a = <jk>new</jk> Address();
+	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
+	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
+	a.<jf>id</jf> = 1;
+	a.<jf>street</jf> = <js>"100 Main Street"</js>;
+	a.<jf>city</jf> = <js>"Anywhereville"</js>;
+	a.<jf>state</jf> = <js>"NY"</js>;
+	a.<jf>zip</jf> = 12345;
+	a.<jf>isCurrent</jf> = <jk>true</jk>;
+	p.<jf>addresses</jf>.add(a);	
+
+	<jc>// Serialize the bean.</jc>
+	String urlencoded = s.serialize(p);
+	</p>
+	<p>
+		This code produced the following:
+	</p>
+	<p class='bcode'>
+	$o(
+		<xa>id</xa>=$n(<xs>1</xs>), 
+		<xa>name</xa>=<xs>John+Smith</xs>, 
+		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+		<xa>addresses</xa>=$a(
+			$o(
+				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
+				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+				<xa>id</xa>=$n(<xs>1</xs>), 
+				<xa>street</xa>=<xs>100+Main+Street</xs>, 
+				<xa>city</xa>=<xs>Anywhereville</xs>, 
+				<xa>state</xa>=<xs>NY</xs>, 
+				<xa>zip</xa>=$n(<xs>12345</xs>), 
+				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+			)
+		)
+	)
+	</p>
+	<p>
+		The code to convert this back into a bean is:
+	</p>
+	<p class='bcode'>
+	<jc>// Parse it back into a bean using the reusable JSON parser.</jc>
+	Person p = UonParser.<jsf>DEFAULT</jsf>.parse(urlencoded, Person.<jk>class</jk>);
+
+	<jc>// Render it back as JSON.</jc>
+	json = JsonSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>.serialize(p);
+	</p>
+	<p>
+		We print it back out to JSON to show that all the data has been preserved:
+	</p>
+	<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}	
+	</p>
+	
+
+	<!-- ======================================================================================================== -->
+	<a id="GenericParsing"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.1 - Parsing into generic POJO models</h3>
+	<div class='topic'>
+		<p>
+			The URL-encoding parser is not limited to parsing back into the original bean classes.<br>  
+			If the bean classes are not available on the parsing side, the parser can also be used to 
+				parse into a generic model consisting of <code>Maps</code>, <code>Collections</code>, and primitive
+				objects.
+		</p>
+		<p>
+			You can parse into any <code>Map</code> type (e.g. <code>HashMap</code>, <code>TreeMap</code>), but
+				using {@link com.ibm.juno.core.ObjectMap} is recommended since it has many convenience methods
+				for converting values to various types.<br> 
+			The same is true when parsing collections.  You can use any Collection (e.g. <code>HashSet</code>, <code>LinkedList</code>)
+				or array (e.g. <code>Object[]</code>, <code>String[]</code>, <code>String[][]</code>), but using 
+				{@link com.ibm.juno.core.ObjectList} is recommended.
+		</p>
+		<p>
+			When the map or list type is not specified, or is the abstract <code>Map</code>, <code>Collection</code>, or <code>List</code> types, 
+				the parser will use <code>ObjectMap</code> and <code>ObjectList</code> by default.
+		</p>
+		<p>
+			Starting back with our original URL-encoded string:
+		</p>
+		<p class='bcode'>
+	$o(
+		<xa>id</xa>=$n(<xs>1</xs>), 
+		<xa>name</xa>=<xs>John+Smith</xs>, 
+		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
+		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
+		<xa>addresses</xa>=$a(
+			$o(
+				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
+				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
+				<xa>id</xa>=$n(<xs>1</xs>), 
+				<xa>street</xa>=<xs>100+Main+Street</xs>, 
+				<xa>city</xa>=<xs>Anywhereville</xs>, 
+				<xa>state</xa>=<xs>NY</xs>, 
+				<xa>zip</xa>=$n(<xs>12345</xs>), 
+				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+			)
+		)
+	)
+		</p>
+		<p>
+			We can parse this into a generic <code>ObjectMap</code>:
+		</p>
+		<p class='bcode'>	
+	<jc>// Parse URL-encoded string into a generic POJO model.</jc>
+	ObjectMap m = UonParser.<jsf>DEFAULT</jsf>.parse(urlencoded, ObjectMap.<jk>class</jk>);
+
+	<jc>// Convert it back to JSON.</jc>
+	String json = JsonSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>.serialize(m);
+		</p>
+		<p>
+			What we end up with is the exact same output.<br>
+			Even the numbers and booleans are preserved because they are parsed into <code>Number</code> and <code>Boolean</code> objects
+				when parsing into generic models.
+		</p>
+		<p class='bcode'>
+	{
+		id: <jk>1</jk>, 
+		name: <js>'John Smith'</js>, 
+		uri: <js>'http://sample/addressBook/person/1'</js>, 
+		addressBookUri: <js>'http://sample/addressBook'</js>, 
+		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
+		addresses: [
+			{
+				uri: <js>'http://sample/addressBook/address/1'</js>, 
+				personUri: <js>'http://sample/addressBook/person/1'</js>, 
+				id: <jk>1</jk>, 
+				street: <js>'100 Main Street'</js>, 
+				city: <js>'Anywhereville'</js>, 
+				state: <js>'NY'</js>, 
+				zip: <jk>12345</jk>, 
+				isCurrent: <jk>true</jk>
+			}
+		]
+	}
+		</p>
+		<p>
+			Once parsed into a generic model, various convenience methods are provided on the <code>ObjectMap</code>
+				and <code>ObjectList</code> classes to retrieve values:
+		</p>
+		<p class='bcode'>
+	<jc>// Parse URL-encoded string into a generic POJO model.</jc>
+	ObjectMap m = UonParser.<jsf>DEFAULT</jsf>.parse(urlencoded, ObjectMap.<jk>class</jk>);
+
+	<jc>// Get some simple values.</jc>
+	String name = m.getString(<js>"name"</js>);
+	<jk>int</jk> id = m.getInt(<js>"id"</js>);
+
+	<jc>// Get a value convertable from a String.</jc>
+	URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>);
+
+	<jc>// Get a value using a filter.</jc>
+	CalendarFilter filter = <jk>new</jk> CalendarFilter.ISO8601DTZ();
+	Calendar birthDate = m.get(filter, <js>"birthDate"</js>);
+
+	<jc>// Get the addresses.</jc>
+	ObjectList addresses = m.getObjectList(<js>"addresses"</js>);
+
+	<jc>// Get the first address and convert it to a bean.</jc>
+	Address address = addresses.get(Address.<jk>class</jk>, 0);
+		</p>
+
+		<p>
+			As a general rule, parsing into beans is often more efficient than parsing into generic models.<br>
+			And working with beans is often less error prone than working with generic models.
+		</p>		
+	</div>
+
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserConfigurableProperties"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.2 - Configurable properties</h3>
+	<div class='topic'>
+		<p>
+			The full list of configurable settings applicable to the <code>UrlEncodingParser</code> class is shown below:
+		</p>
+		<table class='styled' style='border-collapse: collapse;'>
+			<tr><th>Property</th><th>Short Description</th></tr>
+			<tr>
+				<td>{@link com.ibm.juno.core.urlencoding.UonParserProperties#UON_decodeChars}</td>
+				<td>Decode <js>"%xx"</js> sequences</td>
+			</tr>	
+		</table>
+	</div>		
+
+
+	<!-- ======================================================================================================== -->
+	<a id="ParserOtherNotes"></a>
+	<h3 class='topic' onclick='toggle(this)'>3.3 - Other notes</h3>
+	<div class='topic'>
+		<ul>
+			<li>Like all other Juno parsers, the URL-encoding parsers are thread safe and maintain an internal cache of bean classes encountered.<br>
+				For performance reasons, it's recommended that parser be reused whenever possible instead of always creating new instances.
+		</ul>
+	</div>
+	
+</div>
+
+
+<!-- ======================================================================================================== -->
+<a id="RestApiSupport"></a>
+<h2 class='topic' onclick='toggle(this)'>4 - REST API support</h2>
+<div class='topic'>
+	<p>
+		Juno provides fully-integrated support for URL-encoding serialization/parsing in the REST server and client APIs.<br>
+		The next two sections describe these in detail.
+	</p>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestServerSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.1 - REST server support</h3>
+	<div class='topic'>
+		<p>
+			There are four general ways of defining REST interfaces with support for JSON.
+			Two using the built-in Juno Server API, and two using the JAX-RS integration component.
+		</p>
+		<ul>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.RestServletDefault}.<br>
+					This includes URL-encoding serialization/parsing support by default, in addition to several other media types.<br><br>
+			<li>Create a servlet that subclasses from {@link com.ibm.juno.server.RestServlet} and specify the
+					URL-encoding serializer and/or parser using the {@link com.ibm.juno.server.annotation.RestResource#serializers()} and
+					{@link com.ibm.juno.server.annotation.RestResource#parsers()} on the entire servlet class, or 
+					the {@link com.ibm.juno.server.annotation.RestMethod#serializers()} and {@link com.ibm.juno.server.annotation.RestMethod#parsers()}
+					annotations on individual methods within the class.<br><br>
+			<li>Register {@link com.ibm.juno.server.jaxrs.DefaultProvider} with JAX-RS.<br>
+					This includes URL-encoding serialization/parsing support by default, in addition to several other media types.<br><br>
+			<li>Create and register a subclass of {@link com.ibm.juno.server.jaxrs.BaseProvider} and specify the serializers and parsers to use on JAX-RS resources.
+		</ul>
+		<p>
+			In general, the Juno REST server API is much more configurable and easier to use than JAX-RS, but beware that the author may be slightly biased in this statement.
+		</p>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServletDefault"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.1 - Using RestServletDefault</h4>
+		<div class='topic'>
+			<p>
+				The quickest way to implement a REST resource with URL-encoding support is to create a subclass of {@link com.ibm.juno.server.RestServletDefault}.<br>
+				This class provides support for JSON, XML, HTML, URL-Encoding, and others.
+			</p>
+			<p>
+				The <code>AddressBookResource</code> example shown in the first chapter uses the <code>RestServletJenaDefault</code> class
+					which is a subclass of <code>RestServletDefault</code> with additional support for RDF languages.<br>
+				The start of the class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<jc>// Proof-of-concept resource that shows off the capabilities of working with POJO resources.
+	// Consists of an in-memory address book repository.</jc>
+	<ja>@RestResource</ja>(
+		messages=<js>"nls/AddressBookResource"</js>,
+		properties={
+			<ja>@Property</ja>(name=UonSerializerProperties.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_description</jsf>, value=<js>"$L{description}"</js>),
+			<ja>@Property</ja>(name=HtmlDocSerializerProperties.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
+		},
+		encoders=GzipEncoder.<jk>class</jk>
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault {
+			</p>
+			<p>
+				Notice how serializer and parser properties can be specified using the <code>@RestResource.properties()</code> annotation.<br>
+				In this case, we're overriding the <jsf>UON_simpleMode</jsf> property to produce lax UON notation.
+				The remaining properties are specific to the HTML serializer.
+			</p>
+			<p>
+ 				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
+ 				These variables are replaced at runtime based on the HTTP request locale.
+				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
+				See {@link com.ibm.juno.server.RestServlet#getVarResolver()} for more information.
+			</p>
+			<p>
+				This document won't go into all the details of the Juno <code>RestServlet</code> class.<br>
+				Refer to the {@link com.ibm.juno.server} documentation for more information on the REST servlet class in general.
+			</p>
+			<p>
+				The rest of the code in the resource class consists of REST methods that simply accept and return POJOs.<br>
+				The framework takes care of all content negotiation, serialization/parsing, and error handling.<br>
+				Below are 3 of those methods to give you a general idea of the concept:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404})
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+	
+	<jc>// POST person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/people"</js>, guards=AdminGuard.<jk>class</jk>, rc={307,404})
+	<jk>public void</jk> createPerson(RestResponse res, <ja>@Content</ja> CreatePerson cp) <jk>throws</jk> Exception {
+		Person p = addressBook.createPerson(cp);
+		res.sendRedirect(p.<jf>uri</jf>);
+	}
+
+	<jc>// DELETE person handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"DELETE"</js>, path=<js>"/people/{id}"</js>, guards=AdminGuard.<jk>class</jk>, rc={200,404})
+	<jk>public</jk> String deletePerson(RestResponse res, <ja>@Attr</ja> <jk>int</jk> id) <jk>throws</jk> Exception {
+		Person p = findPerson(id);
+		addressBook.remove(p);
+		<jk>return</jk> <js>"DELETE successful"</js>;			
+	}	
+			</p>
+			<p>
+				The resource class can be registered with the web application like any other servlet, or can be 
+					defined as a child of another resource through the {@link com.ibm.juno.server.annotation.RestResource#children()} annotation.
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="RestServlet"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.2 - Using RestServlet with annotations</h4>
+		<div class='topic'>
+			<p>
+				For fine-tuned control of media types, the {@link com.ibm.juno.server.RestServlet} class 
+					can be subclassed directly.<br>
+				The serializers/parsers can be specified through annotations at the class and/or method levels.
+			</p>
+			<p>
+				An equivalent <code>AddressBookResource</code> class could be defined to only support URL-encoding using
+					the following definition:
+			</p>
+			<p class='bcode'>
+	<ja>@RestResource</ja>(
+		serializers={UrlEncodingSerializer.<jk>class</jk>},
+		parsers={UrlEncodingParser.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=UonSerializerProperties.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+		}
+	)
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServlet {
+			</p>
+			<p>
+				Likewise, serializers and parsers can be specified/augmented/overridden at the method level like so:
+			</p>
+			<p class='bcode'>
+	<jc>// GET person request handler</jc>
+	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/people/{id}/*"</js>, rc={200,404},
+		serializers={UrlEncodingSerializer.<jk>class</jk>},
+		parsers={UrlEncodingParser.<jk>class</jk>},
+		properties={
+			<ja>@Property</ja>(name=UonSerializerProperties.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+		}
+	)
+	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Attr</ja> <jk>int</jk> id) throws Exception {
+		properties.put(HtmlDocSerializerProperties.<jsf>HTMLDOC_title</jsf>, req.getPathInfo());
+		<jk>return</jk> findPerson(id);
+	}
+			</p>
+			<p>
+				The {@link com.ibm.juno.server.annotation.RestMethod#serializersInherit()} and 
+					{@link com.ibm.juno.server.annotation.RestMethod#parsersInherit()} control how various artifacts
+					are inherited from the parent class.<br>
+				Refer to {@link com.ibm.juno.server} for additional information on using these annotations.
+			</p>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="DefaultProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.3 - Using JAX-RS DefaultProvider</h4>
+		<div class='topic'>
+			<p>
+				URL-encoding media type support in JAX-RS can be achieved by using the {@link com.ibm.juno.server.jaxrs.DefaultProvider} class.<br>
+				It implements the JAX-RS <code>MessageBodyReader</code> and <code>MessageBodyWriter</code> interfaces for all Juno supported media types.
+			</p>
+			<p>
+				The <code>DefaultProvider</code> class definition is shown below:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonSerializer</jc>
+		<js>"application/json+simple"</js>,<js>"text/json+simple"</js>,    <jc>// JsonSerializer.Simple</jc>
+		<js>"application/json+schema"</js>,<js>"text/json+schema"</js>,    <jc>// JsonSchemaSerializer</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlDocSerializer</jc>
+		<js>"text/xml+simple"</js>,                               <jc>// XmlDocSerializer.Simple</jc>
+		<js>"text/xml+schema"</js>,                               <jc>// XmlSchemaDocSerializer</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlDocSerializer</jc>
+		<js>"text/uon"</js>,                                      <jc>// UonSerializer</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingSerializer</jc>
+		<js>"text/xml+soap"</js>,                                 <jc>// SoapXmlSerializer</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectSerializer</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"application/json"</js>, <js>"text/json"</js>,                 <jc>// JsonParser</jc>
+		<js>"text/xml"</js>,                                      <jc>// XmlParser</jc>
+		<js>"text/html"</js>,                                     <jc>// HtmlParser</jc>
+		<js>"text/uon"</js>,                                      <jc>// UonParser</jc>
+		<js>"application/x-www-form-urlencoded"</js>,             <jc>// UrlEncodingParser</jc>
+		<js>"application/x-java-serialized-object"</js>           <jc>// JavaSerializedObjectParser</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			JsonSerializer.<jk>class</jk>,
+			JsonSerializer.Simple.<jk>class</jk>,
+			JsonSchemaSerializer.<jk>class</jk>,
+			XmlDocSerializer.<jk>class</jk>,
+			XmlDocSerializer.Simple.<jk>class</jk>,
+			XmlSchemaDocSerializer.<jk>class</jk>,
+			HtmlDocSerializer.<jk>class</jk>,
+			UonSerializer.<jk>class</jk>,
+			UrlEncodingSerializer.<jk>class</jk>,
+			SoapXmlSerializer.<jk>class</jk>,
+			JavaSerializedObjectSerializer.<jk>class</jk>
+		},
+		parsers={
+			JsonParser.<jk>class</jk>,
+			XmlParser.<jk>class</jk>,
+			HtmlParser.<jk>class</jk>,
+			UonParser.<jk>class</jk>,
+			UrlEncodingParser.<jk>class</jk>,
+			JavaSerializedObjectParser.<jk>class</jk>,
+		}
+	)
+	<jk>public final class</jk> DefaultProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				That's the entire class.  It consists of only annotations to hook up media types to Juno serializers and parsers.
+				The <ja>@Provider</ja>, <ja>@Produces</ja>, and <ja>@Consumes</ja> annotations are standard JAX-RS annotations, and the <ja>@JunoProvider</ja> annotation is from Juno.
+			</p>
+			<p>
+				To enable the provider, you need to make the JAX-RS environment aware of it.
+				In Wink, this is accomplished by adding an entry to a config file.
+			</p>
+			<p class='bcode'>
+	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>"2.3"</xs><xt>&gt;</xt>
+		<xt>&lt;servlet&gt;</xt>
+			<xt>&lt;servlet-name&gt;</xt>WinkService<xt>&lt;/servlet-name&gt;</xt>
+			<xt>&lt;servlet-class&gt;</xt>org.apache.wink.server.internal.servlet.RestServlet<xt>&lt;/servlet-class&gt;</xt>
+			<xt>&lt;init-param&gt;</xt>
+				<xt>&lt;param-name&gt;</xt>applicationConfigLocation<xt>&lt;/param-name&gt;</xt>
+				<xt>&lt;param-value&gt;</xt>/WEB-INF/wink.cfg<xt>&lt;/param-value&gt;</xt>
+			<xt>&lt;/init-param&gt;</xt>
+		<xt>&lt;/servlet&gt;</xt>
+			</p>
+			<p>
+				Simply include a reference to the provider in the configuration file.
+			<p class='bcode'>
+	com.ibm.juno.server.jaxrs.DefaultProvider
+			</p>
+			<p>
+				Properties can be specified on providers through the {@link com.ibm.juno.server.jaxrs.JunoProvider#properties()} annotation.<br>
+				Properties can also be specified at the method level by using the {@link com.ibm.juno.server.annotation.RestMethod#properties} annotation, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@GET</ja>
+	<ja>@Produces</ja>(<js>"*/*"</js>)
+	<ja>@RestMethod</ja>( <jc>/* Override some properties */</jc>
+		properties={
+			<ja>@Property</ja>(name=UonSerializerProperties.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+		}
+	)
+	<jk>public</jk> Message getMessage() {
+		<jk>return</jk> message;
+	}
+			</p>
+			<h6 class='topic'>Limitations</h6>
+			<p>
+				In general, the Juno REST API is considerably more flexible than the JAX-RS API, since you can specify and override
+					serializers, parsers, properties, filters, converters, guards, etc... at both the class and method levels.<br>
+				Therefore, the JAX-RS API has the following limitations that the Juno Server API does not:
+			</p>
+			<ul>
+				<li>The ability to specify different media type providers at the class and method levels.<br> 
+					For example, you may want to use <code>JsonSerializer</code> with one set of properties on 
+						one class, and another instance with different properties on another class.<br>
+					There is currently no way to define this at the class level.<br>
+					You can override properties at the method level, but this can be cumbersome since it would have to be
+						done for all methods in the resource.<br><br>
+				<li>The Juno Server API allows you to manipulate properties programatically through the {@link com.ibm.juno.server.RestResponse#setProperty(String,Object)}
+					method, and through the {@link com.ibm.juno.server.annotation.Properties} annotation.<br>
+					There is no equivalent in JAX-RS.
+			</ul>
+		</div>
+
+		<!-- ======================================================================================================== -->
+		<a id="BaseProvider"></a>
+		<h4 class='topic' onclick='toggle(this)'>4.1.4 - Using JAX-RS BaseProvider with annotations</h4>
+		<div class='topic'>
+			<p>
+				To provide support for only JSON media types, you can define your own provider class, like so:
+			</p>
+			<p class='bcode'>
+	<ja>@Provider</ja>
+	<ja>@Produces</ja>({
+		<js>"application/x-www-form-urlencoded"</js>,                 <jc>// UrlEncodingSerializer</jc>
+	})
+	<ja>@Consumes</ja>({
+		<js>"application/x-www-form-urlencoded"</js>                  <jc>// UrlEncodingParser</jc>
+	})
+	<ja>@JunoProvider</ja>(
+		serializers={
+			UrlEncodingSerializer.<jk>class</jk>
+		},
+		parsers={
+			UrlEncodingParser.<jk>class</jk>,
+		}
+		properties={
+			<ja>@Property</ja>(name=UonSerializerProperties.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+		}
+	)
+	<jk>public final class</jk> MyUrlEncodingProvider <jk>extends</jk> BaseProvider {}
+			</p>
+			<p>
+				Then register it with Wink the same way as <code>DefaultProvider</code>.
+			</p>
+		</div>
+
+	</div>
+
+	<!-- ======================================================================================================== -->
+	<a id="RestClientSupport"></a>
+	<h3 class='topic' onclick='toggle(this)'>4.2 - REST client support</h3>
+	<div class='topic'>
+		<p>
+			The {@link com.ibm.juno.client.RestClient} class provides an easy-to-use REST client interface with 
+				pluggable media type handling using any of the Juno serializers and parsers.<br>
+			Defining a client to support the URL-encoding media type on HTTP requests and responses can be done in one line of code:
+		</p>
+		<p class='bcode'>
+	<jc>// Create a client to handle URL-encoded requests and responses.</jc>
+	RestClient client = <jk>new</jk> RestClient(UrlEncodingSerializer.<jk>class</jk>, UrlEncodingParser.<jk>class</jk>);
+		</p>
+		<p>
+			The client handles all content negotiation based on the registered serializers and parsers.
+		</p>
+		<p>
+			The following code is pulled from the main method of the <code>ClientTest</code> class in the sample web application, and
+				is run against the <code>AddressBookResource</code> class running within the sample app.<br>
+			It shows how the client can be used to interact with the REST API while completely hiding the negotiated content type and working with nothing more than beans.
+		</p>
+		<h6 class='figure'>Example</h6>
+		<p class='bcode'>
+	String root = <js>"http://localhost:9080/sample/addressBook"</js>;
+	
+	<jc>// Get the current contents of the address book</jc>
+	AddressBook ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Delete the existing entries</jc>
+	<jk>for</jk> (Person p : ab) {
+		String r = client.doDelete(p.<jf>uri</jf>).getResponse(String.<jk>class</jk>);
+		System.<jsm>out</jsm>.println(<js>"Deleted person "</js> + p.<jf>name</jf> + <js>", response = "</js> + r);
+	}
+	
+	<jc>// Make sure they're gone</jc>
+	ab = client.doGet(root).getResponse(AddressBook.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Number of entries = "</js> + ab.size());
+	
+	<jc>// Add 1st person again</jc>
+	CreatePerson cp = <jk>new</jk> CreatePerson(
+		<js>"Barack Obama"</js>, 
+		<jsm>toCalendar</jsm>(<js>"Aug 4, 1961"</js>),
+		<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>true</jk>),
+		<jk>new</jk> CreateAddress(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, <js>"IL"</js>, 60615, <jk>false</jk>)
+	); 
+	Person p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add 2nd person again, but add addresses separately</jc>
+	cp = <jk>new</jk> CreatePerson(
+		<js>"George Walker Bush"</js>, 
+		toCalendar(<js>"Jul 6, 1946"</js>)
+	);
+	p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>);
+	
+	<jc>// Add addresses to 2nd person</jc>
+	CreateAddress ca = <jk>new</jk> CreateAddress(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, <js>"TX"</js>, 76638, <jk>true</jk>);
+	Address a = client.doPost(p.<jf>uri</jf> + <js>"/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+				
+	ca = <jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>false</jk>);
+	a = client.doPost(p.<jf>uri</jf> + "/addresses"</js>, ca).getResponse(Address.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Created address "</js> + a.<jf>uri</jf>);
+	
+	<jc>// Find 1st person, and change name</jc>
+	Person[] pp = client.doGet(root + <js>"?q={name:\"'Barack+Obama'\"}"</js>).getResponse(Person[].<jk>class</jk>);
+	String r = client.doPut(pp[0].<jf>uri</jf> + <js>"/name"</js>, <js>"Barack Hussein Obama"</js>).getResponse(String.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"Changed name, response = "</js> + r);
+	p = client.doGet(pp[0].<jf>uri</jf>).getResponse(Person.<jk>class</jk>);
+	System.<jsm>out</jsm>.println(<js>"New name = "</js> + p.<jf>name</jf>);
+		</p>
+		<h6 class='figure'>Results</h6>
+		<p class='bcode'>
+	Number of entries = 2
+	Deleted person Barack Obama, response = DELETE successful
+	Deleted person George Walker Bush, response = DELETE successful
+	Number of entries = 0
+	Created person Barack Obama, uri = http://localhost:9080/sample/addressBook/people/3
+	Created person George Walker Bush, uri = http://localhost:9080/sample/addressBook/people/4
+	Created address http://localhost:9080/sample/addressBook/addresses/7
+	Created address http://localhost:9080/sample/addressBook/addresses/8
+	Changed name, response = PUT successful
+	New name = Barack Hussein Obama
+		</p>
+	</div>
+</div>
+<p align="center"><i><b>*** f�n ***</b></i></p>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.class
new file mode 100755
index 0000000..f781f70
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.java
new file mode 100755
index 0000000..9d64bb1
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/Args.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import java.util.*;
+
+import com.ibm.juno.core.*;
+
+/**
+ * Utility class to make it easier to work with command-line arguments pass in through a <code>main(String[] args)</code> method.
+ * <p>
+ * Used to parse command-line arguments of the form <js>"[zero or more main arguments] [zero or more optional arguments]"</js>.
+ * <p>
+ * The format of a main argument is a token that does not start with <js>'-'</js>.
+ * <p>
+ * The format of an optional argument is <js>"-argName [zero or more tokens]"</js>.
+ * <p>
+ * <h6 class='topic'>Command-line examples</h6>
+ * <ul>
+ * 	<li><code>java com.sample.MyClass mainArg1</code>
+ * 	<li><code>java com.sample.MyClass mainArg1 mainArg2</code>
+ * 	<li><code>java com.sample.MyClass mainArg1 -optArg1</code>
+ * 	<li><code>java com.sample.MyClass -optArg1</code>
+ * 	<li><code>java com.sample.MyClass mainArg1 -optArg1 optArg1Val</code>
+ * 	<li><code>java com.sample.MyClass mainArg1 -optArg1 optArg1Val1 optArg1Val2</code>
+ * 	<li><code>java com.sample.MyClass mainArg1 -optArg1 optArg1Val1 -optArg1 optArg1Val2</code>
+ * </ul>
+ *
+ * <h6 class='topic'>Code examples</h6>
+ * <p class='bcode'>
+ *
+ * 	<jc>// Main method with arguments</jc>
+ * 	<jk>public static void</jk> <jsm>main</jsm>(String[] args) {
+ *
+ * 		<jc>// Wrap in Args</jc>
+ * 		Args a = new Args(args);
+ *
+ * 		<jc>// One main argument</jc>
+ * 		<jc>// a1</jc>
+ * 		String a1 = a.getArg(0); <jc>// "a1"</jc>
+ * 		String a2 = a.getArg(1); <jc>// null</jc>
+ *
+ * 		<jc>// Two main arguments</jc>
+ * 		<jc>// a1 a2</jc>
+ * 		String a1 = a.getArg(0); <jc>// "a1"</jc>
+ * 		String a2 = a.getArg(1); <jc>// "a2"</jc>
+ *
+ * 		<jc>// One main argument and one optional argument with no value</jc>
+ * 		<jc>// a1 -a2</jc>
+ * 		String a1 = a.getArg(0);
+ * 		<jk>boolean</jk> hasA2 = a.hasArg(<js>"a2"</js>); <jc>// true</jc>
+ * 		<jk>boolean</jk> hasA3 = a.hasArg(<js>"a3"</js>); <jc>// false</jc>
+ *
+ * 		<jc>// One main argument and one optional argument with one value</jc>
+ * 		<jc>// a1 -a2 v2</jc>
+ * 		String a1 = a.getArg(0);
+ * 		String a2 = a.getArg(<js>"a2"</js>); <jc>// "v2"</jc>
+ * 		String a3 = a.getArg(<js>"a3"</js>); <jc>// null</jc>
+ *
+ * 		<jc>// One main argument and one optional argument with two values</jc>
+ * 		<jc>// a1 -a2 v2a v2b</jc>
+ * 		String a1 = a.getArg(0);
+ * 		List&lt;String&gt; a2 = a.getArgs(<js>"a2"</js>); <jc>// Contains ["v2a","v2b"]</jc>
+ * 		List&lt;String&gt; a3 = a.getArgs(<js>"a3"</js>); <jc>// Empty list</jc>
+ *
+ * 		<jc>// Same as previous, except specify optional argument name multiple times</jc>
+ * 		<jc>// a1 -a2 v2a -a2 v2b</jc>
+ * 		String a1 = a.getArg(0);
+ * 		List&lt;String&gt; a2 = a.getArgs(<js>"a2"</js>); <jc>// Contains ["v2a","v2b"]</jc>
+ * 	}
+ * </p>
+ * <p>
+ * Main arguments are available through numeric string keys (e.g. <js>"0"</js>, <js>"1"</js>, ...).
+ * So you could use the {@link ObjectMap} API to convert main arguments directly to POJOs, such as an <code>Enum</code>
+ * <p class='bcode'>
+ * 	<jc>// Get 1st main argument as an Enum</jc>
+ * 	MyEnum e = a.get(MyEnum.<jk>class</jk>, <js>"0"</js>);
+ *
+ * 	<jc>// Get 1st main argument as an integer</jc>
+ * 	int i = a.get(<jk>int</jk>.<jk>class</jk>, <js>"0"</js>);
+ * </p>
+ * <p>
+ * Equivalent operations are available on optional arguments through the {@link #getArg(Class, String)} method.
+ *
+ * @author jbognar
+ */
+public final class Args extends ObjectMap {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param args Arguments passed in through a <code>main(String[] args)</code> method.
+	 */
+	public Args(String[] args) {
+		List<String> argList = new LinkedList<String>(Arrays.asList(args));
+
+		// Capture the main arguments.
+		Integer i = 0;
+		while (! argList.isEmpty()) {
+			String s = argList.get(0);
+			if (StringUtils.startsWith(s,'-'))
+				break;
+			put(i.toString(), argList.remove(0));
+			i++;
+		}
+
+		// Capture the mapped arguments.
+		String key = null;
+		while (! argList.isEmpty()) {
+			String s = argList.remove(0);
+			if (StringUtils.startsWith(s, '-')) {
+				key = s.substring(1);
+				if (key.matches("\\d*"))
+					throw new RuntimeException("Invalid optional key name '"+key+"'");
+				if (! containsKey(key))
+					put(key, new ObjectList());
+			} else {
+				((ObjectList)get(key)).add(s);
+			}
+		}
+	}
+
+	/**
+	 * Returns main argument at the specified index, or <jk>null</jk> if the index is out of range.
+	 * <p>
+	 * Can be used in conjuction with {@link #hasArg(int)} to check for existence of arg.
+	 * <p class='bcode'>
+	 * 	<jc>// Check for no arguments</jc>
+	 * 	<jk>if</jk> (! args.hasArg(0))
+	 * 		printUsageAndExit();
+	 *
+	 * 	<jc>// Get the first argument</jc>
+	 * 	String firstArg = args.getArg(0);
+	 * </p>
+	 * <p>
+	 * Since main arguments are stored as numeric keys, this method is essentially equivalent to...
+	 * <p class='bcode'>
+	 * 	<jc>// Check for no arguments</jc>
+	 * 	<jk>if</jk> (! args.containsKey(<js>"0"</js>))
+	 * 		printUsageAndExit();
+	 *
+	 * 	<jc>// Get the first argument</jc>
+	 * 	String firstArg = args.getString("0");
+	 * </p>
+	 *
+	 * @param i The index position of the main argument (zero-indexed).
+	 * @return The main argument value, or <js>""</js> if argument doesn't exist at that position.
+	 */
+	public String getArg(int i) {
+		return getString(Integer.toString(i));
+	}
+
+	/**
+	 * Returns <jk>true</jk> if argument exists at specified index.
+	 *
+	 * @param i The zero-indexed position of the argument.
+	 * @return <jk>true</jk> if argument exists at specified index.
+	 */
+	public boolean hasArg(int i) {
+		return containsKey(Integer.toString(i));
+	}
+
+	/**
+	 * Returns the optional argument value, or blank if the optional argument was not specified.
+	 * <p>
+	 * If the optional arg has multiple values, returns values as a comma-delimited list.
+	 *
+	 * @param name The optional argument name.
+	 * @return The optional argument value, or blank if the optional argument was not specified.
+	 */
+	public String getArg(String name) {
+		ObjectList l = (ObjectList)get(name);
+		if (l == null || l.size() == 0)
+			return null;
+		if (l.size() == 1)
+			return l.get(0).toString();
+		return Arrays.toString(l.toArray()).replaceAll("[\\[\\]]", "");
+	}
+
+	/**
+	 * Returns the optional argument value converted to the specified object type.
+	 * <p>
+	 * If the optional arg has multiple values, returns only the first converted value.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Command:  java com.sample.MyClass -verbose true -debug 5</jc>
+	 * 	<jk>boolean</jk> b = args.getArg(<jk>boolean</jk>.<jk>class</jk>, <js>"verbose"</js>);
+	 * 	<jk>int</jk> i = args.getArg(<jk>int</jk>.<jk>class</jk>, <js>"debug"</js>);
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param c The class type to convert the value to.
+	 * @param <T> The class type to convert the value to.
+	 * @param name The optional argument name.
+	 * @return The optional argument value, or blank if the optional argument was not specified.
+	 */
+	public <T> T getArg(Class<T> c, String name) {
+		ObjectList l = (ObjectList)get(name);
+		if (l == null || l.size() == 0)
+			return null;
+		return l.get(c, 0);
+	}
+
+	/**
+	 * Returns the optional argument values as a list of strings.
+	 *
+	 * <dl>
+	 * 	<dt>Example:</dt>
+	 * 	<dd>
+	 * <p class='bcode'>
+	 * 	<jc>// Command:  java com.sample.MyClass -extraArgs foo bar baz</jc>
+	 * 	List&lt;String&gt; l1 = args.getArgs(<js>"extraArgs"</js>); <jc>// ['foo','bar','baz']</jc>
+	 * 	List&lt;String&gt; l2 = args.getArgs(<js>"nonExistentArgs"</js>); <jc>// An empty list</jc>
+	 * </p>
+	 * 	</dd>
+	 * </dl>
+	 *
+	 * @param name The optional argument name.
+	 * @return The optional argument values, or an empty list if the optional argument was not specified.
+	 */
+	@SuppressWarnings({"rawtypes", "unchecked"})
+	public List<String> getArgs(String name) {
+		List l = (ObjectList)get(name);
+		if (l == null)
+			return Collections.emptyList();
+		return l;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1$1.class
new file mode 100755
index 0000000..157067c
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1.class
new file mode 100755
index 0000000..3b7e54a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$1.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$2.class
new file mode 100755
index 0000000..7ab64ff
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils$2.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.class
new file mode 100755
index 0000000..64841df
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.class differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.java
new file mode 100755
index 0000000..22923df
--- /dev/null
+++ b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ArrayUtils.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
+ *
+ *  The source code for this program is not published or otherwise
+ *  divested of its trade secrets, irrespective of what has been
+ *  deposited with the U.S. Copyright Office.
+ *******************************************************************************/
+package com.ibm.juno.core.utils;
+
+import static com.ibm.juno.core.utils.ThrowableUtils.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+/**
+ * Quick and dirty utilities for working with arrays.
+ *
+ * @author James Bognar (jbognar@us.ibm.com)
+ */
+public final class ArrayUtils {
+
+	/**
+	 * Appends one or more elements to an array.
+	 *
+	 * @param <T> The element type.
+	 * @param array The array to append to.
+	 * @param newElements The new elements to append to the array.
+	 * @return A new array with the specified elements appended.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] append(T[] array, T...newElements) {
+		assertNotNull(array, "Array cannot be null.");
+		if (newElements.length == 0)
+			return array;
+		T[] a = (T[])Array.newInstance(array.getClass().getComponentType(), array.length + newElements.length);
+		for (int i = 0; i < array.length; i++)
+			a[i] = array[i];
+		for (int i = 0; i < newElements.length; i++)
+			a[i+array.length] = newElements[i];
+		return a;
+	}
+
+	/**
+	 * Appends one or more elements to an array.
+	 *
+	 * @param <T> The element type.
+	 * @param array The array to append to.
+	 * @param newElements The new elements to append to the array.
+	 * @return A new array with the specified elements appended.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] append(T[] array, Collection<T> newElements) {
+		assertFieldNotNull(array, "array");
+		if (newElements.size() == 0)
+			return array;
+		T[] a = (T[])Array.newInstance(array.getClass().getComponentType(), array.length + newElements.size());
+		for (int i = 0; i < array.length; i++)
+			a[i] = array[i];
+		int l = array.length;
+		for (T t : newElements)
+			a[l++] = t;
+		return a;
+	}
+
+	/**
+	 * Combine an arbitrary number of arrays into a single array.
+	 *
+	 * @param arrays Collection of arrays to combine.
+	 * @return A new combined array, or <jk>null</jk> if all arrays are <jk>null</jk>.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] combine(T[]...arrays) {
+		assertFieldNotNull(arrays, "arrays");
+		int l = 0;
+		T[] a1 = null;
+		for (T[] a : arrays) {
+			if (a1 == null && a != null)
+				a1 = a;
+			l += (a == null ? 0 : a.length);
+		}
+		if (a1 == null)
+			return null;
+		T[] a = (T[])Array.newInstance(a1.getClass().getComponentType(), l);
+		int i = 0;
+		for (T[] aa : arrays)
+			if (aa != null)
+				for (T t : aa)
+					a[i++] = t;
+		return a;
+	}
+
+	/**
+	 * Creates a new array with reversed entries.
+	 *
+	 * @param <T> The class type of the array.
+	 * @param array The array to reverse.
+	 * @return A new array with reversed entries, or <jk>null</jk> if the array was <jk>null</jk>.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] reverse(T[] array) {
+		assertFieldNotNull(array, "array");
+		Class<T> c = (Class<T>)array.getClass().getComponentType();
+		T[] a2 = (T[])Array.newInstance(c, array.length);
+		for (int i = 0; i < array.length; i++)
+			a2[a2.length-i-1] = array[i];
+		return a2;
+	}
+
+	/**
+	 * Converts the specified array to a <code>Set</code>.
+	 * <p>
+	 * 	The order of the entries in the set are the same as the array.
+	 *
+	 * @param <T> The entry type of the array.
+	 * @param array The array being wrapped in a <code>Set</code> interface.
+	 * @return The new set.
+	 */
+	public static <T> Set<T> asSet(final T[] array) {
+		assertFieldNotNull(array, "array");
+		return new AbstractSet<T>() {
+
+			@Override /* Set */
+			public Iterator<T> iterator() {
+				return new Iterator<T>() {
+					int i = 0;
+
+					@Override /* Iterator */
+					public boolean hasNext() {
+						return i < array.length;
+					}
+
+					@Override /* Iterator */
+					public T next() {
+						if (i >= array.length)
+							throw new NoSuchElementException();
+						T t = array[i];
+						i++;
+						return t;
+					}
+
+					@Override /* Iterator */
+					public void remove() {
+						throw new UnsupportedOperationException();
+					}
+				};
+			}
+
+			@Override /* Set */
+			public int size() {
+				return array.length;
+			}
+		};
+	}
+
+	/**
+	 * Returns an iterator against an array.
+	 * This works with any array type (e.g. <code>String[]</code>, <code>Object[]</code>, <code><jk>int</jk>[]</code>, etc...).
+	 *
+	 * @param array The array to create an iterator over.
+	 * @return An iterator over the specified array.
+	 */
+	public static Iterator<Object> iterator(final Object array) {
+		return new Iterator<Object>() {
+			int i = 0;
+			int length = array == null ? 0 : Array.getLength(array);
+
+			@Override /* Iterator */
+			public boolean hasNext() {
+				return i < length;
+			}
+
+			@Override /* Iterator */
+			public Object next() {
+				if (i >= length)
+					throw new NoSuchElementException();
+				return Array.get(array, i++);
+			}
+
+			@Override /* Iterator */
+			public void remove() {
+				throw new UnsupportedOperationException();
+			}
+		};
+	}
+
+	/**
+	 * Converts the specified collection to an array.
+	 * Works on both object and primitive arrays.
+	 *
+	 * @param c The collection to convert to an array.
+	 * @param componentType The component type of the collection.
+	 * @return A new array.
+	 */
+	public static <T> Object toArray(Collection<T> c, Class<T> componentType) {
+		Object a = Array.newInstance(componentType, c.size());
+		Iterator<T> it = c.iterator();
+		int i = 0;
+		while (it.hasNext())
+			Array.set(a, i++, it.next());
+		return a;
+	}
+
+	/**
+	 * Copies the specified array into the specified list.
+	 * Works on both object and primitive arrays.
+	 *
+	 * @param array The array to copy into a list.
+	 * @param list The list to copy the values into.
+	 */
+	@SuppressWarnings({"unchecked","rawtypes"})
+	public static void copyToList(Object array, List list) {
+		if (array != null) {
+			int length = Array.getLength(array);
+			for (int i = 0; i < length; i++)
+				list.add(Array.get(array, i));
+		}
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified array contains the specified element
+	 * 	using the {@link Object#equals(Object)} method.
+	 *
+	 * @param element The element to check for.
+	 * @param array The array to check.
+	 * @return <jk>true</jk> if the specified array contains the specified element,
+	 * 	<jk>false</jk> if the array or element is <jk>null</jk>.
+	 */
+	public static <T> boolean contains(T element, T[] array) {
+		return indexOf(element, array) != -1;
+	}
+
+	/**
+	 * Returns the index position of the element in the specified array
+	 * 	using the {@link Object#equals(Object)} method.
+	 *
+	 * @param element The element to check for.
+	 * @param array The array to check.
+	 * @return The index position of the element in the specified array, or
+	 * 	<code>-1</code> if the array doesn't contain the element, or the array or element is <jk>null</jk>.
+	 */
+	public static <T> int indexOf(T element, T[] array) {
+		if (element == null)
+			return -1;
+		if (array == null)
+			return -1;
+		for (int i = 0; i < array.length; i++)
+			if (element.equals(array[i]))
+				return i;
+		return -1;
+	}
+
+	/**
+	 * Converts a primitive wrapper array (e.g. <code>Integer[]</code>) to a primitive array (e.g. <code><jk>int</jk>[]</code>).
+	 *
+	 * @param o The array to convert.  Must be a primitive wrapper array.
+	 * @return A new array.
+	 * @throws IllegalArgumentException If object is not a wrapper object array.
+	 */
+	public static Object toPrimitiveArray(Object o) {
+		Class<?> c = o.getClass();
+		if (! c.isArray())
+			throw new IllegalArgumentException("Cannot pass non-array objects to toPrimitiveArray()");
+		int l = Array.getLength(o);
+		Class<?> tc = ClassUtils.getPrimitiveForWrapper(c.getComponentType());
+		if (tc == null)
+			throw new IllegalArgumentException("Array type is not a primitive wrapper array.");
+		Object a = Array.newInstance(tc, l);
+		for (int i = 0; i < l; i++)
+			Array.set(a, i, Array.get(o, i));
+		return a;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.class
new file mode 100755
index 0000000..b6b5b3a
Binary files /dev/null and b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/AsciiSet.class differ