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:08:11 UTC

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

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