Add @RestMethod.bpInclude/bpExclude

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/1a4670de
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/1a4670de
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/1a4670de

Branch: refs/heads/master
Commit: 1a4670def5ba561f00602234082d65de0f8e22ac
Parents: feaa916
Author: JamesBognar <[email protected]>
Authored: Thu Jun 15 20:10:46 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Thu Jun 15 20:10:46 2017 -0400

----------------------------------------------------------------------
 .../juneau/jena/RdfSerializerBuilder.java       |  36 +++++
 .../org/apache/juneau/PropertyStoreTest.java    |  20 +--
 .../java/org/apache/juneau/BeanContext.java     | 107 ++++++++++++++
 .../main/java/org/apache/juneau/BeanMeta.java   |  13 +-
 .../org/apache/juneau/BeanPropertyMeta.java     |   3 +
 .../java/org/apache/juneau/BeanSession.java     |   3 +
 .../org/apache/juneau/CoreObjectBuilder.java    | 140 +++++++++++++++++++
 .../apache/juneau/annotation/BeanProperty.java  |  16 +++
 .../apache/juneau/csv/CsvSerializerBuilder.java |  36 +++++
 .../org/apache/juneau/html/HtmlSerializer.java  |  76 +++++++---
 .../juneau/html/HtmlSerializerBuilder.java      |  36 +++++
 .../apache/juneau/jso/JsoSerializerBuilder.java |  36 +++++
 .../json/JsonSchemaSerializerBuilder.java       |  36 +++++
 .../juneau/json/JsonSerializerBuilder.java      |  36 +++++
 .../msgpack/MsgPackSerializerBuilder.java       |  36 +++++
 .../plaintext/PlainTextSerializerBuilder.java   |  36 +++++
 .../juneau/serializer/SerializerBuilder.java    |  36 +++++
 .../serializer/SerializerGroupBuilder.java      |  74 ++++++++++
 .../juneau/soap/SoapXmlSerializerBuilder.java   |  36 +++++
 .../juneau/transforms/StringFormatSwap.java     |  45 ++++++
 .../apache/juneau/uon/UonSerializerBuilder.java |  36 +++++
 .../UrlEncodingSerializerBuilder.java           |  36 +++++
 .../juneau/xml/XmlSchemaSerializerBuilder.java  |  36 +++++
 .../apache/juneau/xml/XmlSerializerBuilder.java |  36 +++++
 juneau-core/src/main/javadoc/overview.html      |  12 +-
 .../apache/juneau/examples/rest/PetStore.json   |  17 +++
 .../juneau/examples/rest/PetStoreResource.java  | 108 ++++++++++++++
 .../juneau/examples/rest/RootResources.java     |   1 +
 .../apache/juneau/examples/rest/htdocs/bird.png | Bin 0 -> 1925 bytes
 .../apache/juneau/examples/rest/htdocs/cat.png  | Bin 0 -> 1878 bytes
 .../apache/juneau/examples/rest/htdocs/dog.png  | Bin 0 -> 1980 bytes
 .../apache/juneau/examples/rest/htdocs/fish.png | Bin 0 -> 2198 bytes
 .../juneau/examples/rest/htdocs/mouse.png       | Bin 0 -> 1551 bytes
 .../juneau/examples/rest/htdocs/rabbit.png      | Bin 0 -> 1603 bytes
 .../juneau/examples/rest/htdocs/snake.png       | Bin 0 -> 1824 bytes
 .../juneau/rest/client/RestClientBuilder.java   |  36 +++++
 .../java/org/apache/juneau/rest/CallMethod.java |   7 +-
 .../juneau/rest/annotation/RestMethod.java      |  72 ++++++++++
 38 files changed, 1218 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index f254734..0f82cec 100644
--- 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -789,6 +789,42 @@ public class RdfSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public RdfSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public RdfSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core-test/src/test/java/org/apache/juneau/PropertyStoreTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/PropertyStoreTest.java 
b/juneau-core-test/src/test/java/org/apache/juneau/PropertyStoreTest.java
index de00d7c..93144eb 100644
--- a/juneau-core-test/src/test/java/org/apache/juneau/PropertyStoreTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/PropertyStoreTest.java
@@ -251,7 +251,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'true'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.Boolean' to type 
'java.lang.Class'.  Value=true.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Boolean' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum'.  Value=true.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Boolean' to 
type 'java.lang.String[]'.  Value=true.")
+                       .test(String[].class, "['true']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.Boolean' to type 
'java.lang.Class[]'.  Value=true.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Boolean' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value=true.")
                        .testMap(String.class, String.class, "Could not 
retrieve property store property 'A.a'.  Invalid data conversion from type 
'java.lang.Boolean' to type 
'java.util.LinkedHashMap<java.lang.String,java.lang.String>'.  Value=true.")
@@ -267,7 +267,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'123'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.Integer' to type 
'java.lang.Class'.  Value=123.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Integer' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum'.  Value=123.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Integer' to 
type 'java.lang.String[]'.  Value=123.")
+                       .test(String[].class, "['123']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.Integer' to type 
'java.lang.Class[]'.  Value=123.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Integer' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value=123.")
                        .testMap(String.class, String.class, "Could not 
retrieve property store property 'A.a'.  Invalid data conversion from type 
'java.lang.Integer' to type 
'java.util.LinkedHashMap<java.lang.String,java.lang.String>'.  Value=123.")
@@ -283,7 +283,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'java.lang.String'")
                        .test(Class.class, "'java.lang.String'")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Class' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum'.  
Value='java.lang.String'.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Class' to 
type 'java.lang.String[]'.  Value='java.lang.String'.")
+                       .test(String[].class, "['class java.lang.String']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.Class' to type 
'java.lang.Class[]'.  Value='java.lang.String'.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.Class' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  
Value='java.lang.String'.")
                        .testMap(String.class, String.class, "Could not 
retrieve property store property 'A.a'.  Invalid data conversion from type 
'java.lang.Class' to type 
'java.util.LinkedHashMap<java.lang.String,java.lang.String>'.  
Value='java.lang.String'.")
@@ -299,7 +299,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'foo'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.String' to type 
'java.lang.Class'.  Value='foo'.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.String' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum'.  Value='foo'.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.String' to 
type 'java.lang.String[]'.  Value='foo'.")
+                       .test(String[].class, "['foo']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.lang.String' to type 
'java.lang.Class[]'.  Value='foo'.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 'java.lang.String' to 
type 'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value='foo'.")
                        .testMap(String.class, String.class, "Could not 
retrieve property store property 'A.a'.  Invalid data conversion from type 
'java.lang.String' to type 
'java.util.LinkedHashMap<java.lang.String,java.lang.String>'.  Value='foo'.")
@@ -327,9 +327,9 @@ public class PropertyStoreTest {
                        .test(String.class, "'ONE'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 'java.lang.Class'.  
Value='ONE'.")
                        .test(TestEnum.class, "'ONE'")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 'java.lang.String[]'.  
Value='ONE'.")
+                       .test(String[].class, "['ONE']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 'java.lang.Class[]'.  
Value='ONE'.")
-                       .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value='ONE'.")
+                       .test(TestEnum[].class, "['ONE']")
                        .testMap(String.class, String.class, "Could not 
retrieve property store property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 
'java.util.LinkedHashMap<java.lang.String,java.lang.String>'.  Value='ONE'.")
                        .testMap(Class.class, Class.class, "Could not retrieve 
property store property 'A.a'.  Invalid data conversion from type 
'org.apache.juneau.PropertyStoreTest$TestEnum' to type 
'java.util.LinkedHashMap<java.lang.Class,java.lang.Class>'.  Value='ONE'.")
                ;
@@ -402,7 +402,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'{foo:\\'bar\\'}'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.util.LinkedHashMap' to 
type 'java.lang.Class'.  Value={foo:'bar'}.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum'.  Value={foo:'bar'}.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 'java.lang.String[]'.  Value={foo:'bar'}.")
+                       .test(String[].class, "['{foo=bar}']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.util.LinkedHashMap' to 
type 'java.lang.Class[]'.  Value={foo:'bar'}.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value={foo:'bar'}.")
                        .testMap(String.class, String.class, "{foo:'bar'}")
@@ -420,7 +420,7 @@ public class PropertyStoreTest {
                        .test(String.class, 
"'{\\'java.lang.String\\':\\'java.lang.Integer\\'}'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.util.LinkedHashMap' to 
type 'java.lang.Class'.  Value={'java.lang.String':'java.lang.Integer'}.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum'.  
Value={'java.lang.String':'java.lang.Integer'}.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 'java.lang.String[]'.  
Value={'java.lang.String':'java.lang.Integer'}.")
+                       .test(String[].class, "['{class java.lang.String=class 
java.lang.Integer}']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a'.  Invalid data conversion from type 'java.util.LinkedHashMap' to 
type 'java.lang.Class[]'.  Value={'java.lang.String':'java.lang.Integer'}.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a'.  Invalid data conversion from type 
'java.util.LinkedHashMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  
Value={'java.lang.String':'java.lang.Integer'}.")
                        .testMap(String.class, String.class, 
"{'java.lang.String':'java.lang.Integer'}")
@@ -740,7 +740,7 @@ public class PropertyStoreTest {
                        .test(String.class, "'{foo:\\'bar\\'}'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.Class'.  
Value={foo:'bar'}.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum'.  Value={foo:'bar'}.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.String[]'.  
Value={foo:'bar'}.")
+                       .test(String[].class, "['{foo=bar}']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.Class[]'.  
Value={foo:'bar'}.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  Value={foo:'bar'}.")
                        .testMap(String.class, String.class, "{foo:'bar'}")
@@ -758,7 +758,7 @@ public class PropertyStoreTest {
                        .test(String.class, 
"'{\\'java.lang.String\\':\\'java.lang.Integer\\'}'")
                        .test(Class.class, "Could not retrieve property store 
property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.Class'.  
Value={'java.lang.String':'java.lang.Integer'}.")
                        .test(TestEnum.class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum'.  
Value={'java.lang.String':'java.lang.Integer'}.")
-                       .test(String[].class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.String[]'.  
Value={'java.lang.String':'java.lang.Integer'}.")
+                       .test(String[].class, "['{class java.lang.String=class 
java.lang.Integer}']")
                        .test(Class[].class, "Could not retrieve property store 
property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 'java.lang.Class[]'.  
Value={'java.lang.String':'java.lang.Integer'}.")
                        .test(TestEnum[].class, "Could not retrieve property 
store property 'A.a.map'.  Invalid data conversion from type 
'java.util.Collections$SynchronizedMap' to type 
'org.apache.juneau.PropertyStoreTest$TestEnum[]'.  
Value={'java.lang.String':'java.lang.Integer'}.")
                        .testMap(String.class, String.class, 
"{'java.lang.String':'java.lang.Integer'}")

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index 53a8cc0..c9e2d1c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -24,6 +24,7 @@ import java.util.concurrent.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
@@ -610,6 +611,62 @@ public class BeanContext extends Context {
        public static final String BEAN_implClasses_put = 
"BeanContext.implClasses.map.put";
 
        /**
+        * <b>Configuration property:</b>  Explicitly specify visible bean 
properties.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"BeanContext.includeProperties"</js>
+        *      <li><b>Data type:</b> <code>Map&lt;String,String&gt;</code>
+        *      <li><b>Default:</b> <code>{}</code>
+        *      <li><b>Session-overridable:</b> <jk>false</jk>
+        * </ul>
+        * <p>
+        * Specifies to only include the specified list of properties for the 
specified bean classes.
+        * <p>
+        * The keys are either fully-qualified or simple class names, and the 
values are comma-delimited lists of property
+        *      names.
+        * The key <js>"*"</js> means all bean classes.
+        * <p>
+        * For example, <code>{Bean1:<js>'foo,bar'</js>}</code> means only 
serialize the <code>foo</code> and <code>bar</code>
+        *      properties on the specified bean.
+        * <p>
+        * Setting applies to specified class and all subclasses.
+        */
+       public static final String BEAN_includeProperties = 
"BeanContext.includeProperties.map";
+
+       /**
+        * <b>Configuration property:</b>  Explicitly specify visible bean 
properties.
+        */
+       public static final String BEAN_includeProperties_put = 
"BeanContext.includeProperties.map.put";
+
+       /**
+        * <b>Configuration property:</b>  Exclude specified properties from 
beans.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"BeanContext.excludeProperties"</js>
+        *      <li><b>Data type:</b> <code>Map&lt;String,String&gt;</code>
+        *      <li><b>Default:</b> <code>{}</code>
+        *      <li><b>Session-overridable:</b> <jk>false</jk>
+        * </ul>
+        * <p>
+        * Specifies to exclude the specified list of properties for the 
specified bean class.
+        * <p>
+        * The keys are either fully-qualified or simple class names, and the 
values are comma-delimited lists of property
+        * names.
+        * The key <js>"*"</js> means all bean classes.
+        * <p>
+        * For example, <code>{Bean1:<js>'foo,bar'</js>}</code> means don't 
serialize the <code>foo</code> and <code>bar</code>
+        *      properties on the specified bean.
+        * <p>
+        * Setting applies to specified class and all subclasses.
+        */
+       public static final String BEAN_excludeProperties = 
"BeanContext.excludeProperties.map";
+
+       /**
+        * <b>Configuration property:</b>  Exclude specified properties from 
beans.
+        */
+       public static final String BEAN_excludeProperties_put = 
"BeanContext.excludeProperties.map.put";
+
+       /**
         * <b>Configuration property:</b>  Bean lookup dictionary.
         * <p>
         * <ul>
@@ -814,6 +871,7 @@ public class BeanContext extends Context {
        final Locale locale;
        final TimeZone timeZone;
        final MediaType mediaType;
+       final Map<String,String[]> includeProperties, excludeProperties;
 
        final Map<Class,ClassMeta> cmCache;
        final ClassMeta<Object> cmObject;  // Reusable ClassMeta that 
represents general Objects.
@@ -904,6 +962,11 @@ public class BeanContext extends Context {
                implKeyClasses = implClasses.keySet().toArray(new Class[0]);
                implValueClasses = implClasses.values().toArray(new Class[0]);
 
+               Map<String,String[]> m2 = pm.getMap(BEAN_includeProperties, 
String.class, String[].class, null);
+               includeProperties = m2 == null ? Collections.EMPTY_MAP : 
Collections.unmodifiableMap(m2);
+               m2 = pm.getMap(BEAN_excludeProperties, String.class, 
String[].class, null);
+               excludeProperties = m2 == null ? Collections.EMPTY_MAP : 
Collections.unmodifiableMap(m2);
+
                locale = pm.get(BEAN_locale, Locale.class, null);
                timeZone = pm.get(BEAN_timeZone, TimeZone.class, null);
                mediaType = pm.get(BEAN_mediaType, MediaType.class, null);
@@ -1472,6 +1535,50 @@ public class BeanContext extends Context {
        }
 
        /**
+        * Returns the {@link #BEAN_includeProperties} setting for the 
specified class.
+        *
+        * @param c The class.
+        * @return The properties to include for the specified class, or 
<jk>null</jk> if it's not defined for the class.
+        */
+       public String[] getIncludeProperties(Class<?> c) {
+               if (includeProperties.isEmpty())
+                       return null;
+               String[] s = null;
+               for (Iterator<Class<?>> i = ClassUtils.getParentClasses(c, 
false, true); i.hasNext();) {
+                       Class<?> c2 = i.next();
+                       s = includeProperties.get(c2.getName());
+                       if (s != null)
+                               return s;
+                       s = includeProperties.get(c2.getSimpleName());
+                       if (s != null)
+                               return s;
+               }
+               return includeProperties.get("*");
+       }
+
+       /**
+        * Returns the {@link #BEAN_excludeProperties} setting for the 
specified class.
+        *
+        * @param c The class.
+        * @return The properties to exclude for the specified class, or 
<jk>null</jk> if it's not defined for the class.
+        */
+       public String[] getExcludeProperties(Class<?> c) {
+               if (excludeProperties.isEmpty())
+                       return null;
+               String[] s = null;
+               for (Iterator<Class<?>> i = ClassUtils.getParentClasses(c, 
false, true); i.hasNext();) {
+                       Class<?> c2 = i.next();
+                       s = excludeProperties.get(c2.getName());
+                       if (s != null)
+                               return s;
+                       s = excludeProperties.get(c2.getSimpleName());
+                       if (s != null)
+                               return s;
+               }
+               return excludeProperties.get("*");
+       }
+
+       /**
         * 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

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
index bcbf705..770236b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
@@ -234,11 +234,13 @@ public class BeanMeta<T> {
 
                                // Explicitly defined property names in @Bean 
annotation.
                                Set<String> fixedBeanProps = new 
LinkedHashSet<String>();
+                               String[] includeProperties = 
ctx.getIncludeProperties(c);
+                               String[] excludeProperties = 
ctx.getExcludeProperties(c);
 
                                if (beanFilter != null) {
 
                                        // Get the 'properties' attribute if 
specified.
-                                       if (beanFilter.getProperties() != null)
+                                       if (beanFilter.getProperties() != null 
&& includeProperties == null)
                                                for (String p : 
beanFilter.getProperties())
                                                        fixedBeanProps.add(p);
 
@@ -246,6 +248,9 @@ public class BeanMeta<T> {
                                                propertyNamer = 
beanFilter.getPropertyNamer();
                                }
 
+                               if (includeProperties != null)
+                                       
fixedBeanProps.addAll(Arrays.asList(includeProperties));
+
                                if (propertyNamer == null)
                                        propertyNamer = new 
PropertyNamerDefault();
 
@@ -367,7 +372,7 @@ public class BeanMeta<T> {
                                        // Eliminated excluded properties if 
BeanFilter.excludeKeys is specified.
                                        String[] includeKeys = 
beanFilter.getProperties();
                                        String[] excludeKeys = 
beanFilter.getExcludeProperties();
-                                       if (excludeKeys != null) {
+                                       if (excludeKeys != null && 
excludeProperties == null) {
                                                for (String k : excludeKeys)
                                                        properties.remove(k);
 
@@ -383,6 +388,10 @@ public class BeanMeta<T> {
                                        }
                                }
 
+                               if (excludeProperties != null)
+                                       for (String ep : excludeProperties)
+                                               properties.remove(ep);
+
                                if (pNames != null) {
                                        Map<String,BeanPropertyMeta> 
properties2 = new LinkedHashMap<String,BeanPropertyMeta>();
                                        for (String k : pNames) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index fd0f8b9..a54ad8e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -30,6 +30,7 @@ import org.apache.juneau.internal.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
+import org.apache.juneau.transforms.*;
 import org.apache.juneau.utils.*;
 
 /**
@@ -222,6 +223,8 @@ public class BeanPropertyMeta {
                }
 
                private static PojoSwap getPropertyPojoSwap(BeanProperty p) 
throws Exception {
+                       if (! p.format().isEmpty())
+                               return newInstance(PojoSwap.class, 
StringFormatSwap.class, p.format());
                        Class<?> c = p.swap();
                        if (c == Null.class)
                                return null;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index a40881e..2e5ab64 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -22,6 +22,7 @@ import java.util.*;
 import java.util.concurrent.atomic.*;
 
 import org.apache.juneau.http.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
@@ -486,6 +487,8 @@ public class BeanSession extends Session {
                                        return (T)toArray(type, 
Arrays.asList((Object[])value));
                                else if (startsWith(value.toString(), '['))
                                        return (T)toArray(type, new 
ObjectList(value.toString()).setBeanSession(this));
+                               else
+                                       return (T)toArray(type, new 
ObjectList((Object[])StringUtils.split(value.toString(), 
',')).setBeanSession(this));
                        }
 
                        // Target type is some sort of Map that needs to be 
converted.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/CoreObjectBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/CoreObjectBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/CoreObjectBuilder.java
index 5c67e6d..8e00384 100644
--- a/juneau-core/src/main/java/org/apache/juneau/CoreObjectBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/CoreObjectBuilder.java
@@ -1153,6 +1153,146 @@ public abstract class CoreObjectBuilder {
        }
 
        /**
+        * <b>Configuration property:</b>  Explicitly specify visible bean 
properties.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"BeanContext.includeProperties"</js>
+        *      <li><b>Data type:</b> <code>Map&lt;String,String&gt;</code>
+        *      <li><b>Default:</b> <code>{}</code>
+        *      <li><b>Session-overridable:</b> <jk>false</jk>
+        * </ul>
+        * <p>
+        * Specifies to only include the specified list of properties for the 
specified bean classes.
+        * <p>
+        * The keys are either fully-qualified or simple class names, and the 
values are comma-delimited lists of property
+        * names.
+        * The key <js>"*"</js> means all bean classes.
+        * <p>
+        * For example, <code>{Bean1:<js>"foo,bar"</js>}</code> means only 
serialize the <code>foo</code> and <code>bar</code>
+        *      properties on the specified bean.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>BEAN_includeProperties</jsf>, values)</code>.
+        * </ul>
+        *
+        * @param values The new value for this property.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        */
+       public CoreObjectBuilder includeProperties(Map<String,String> values) {
+               return property(BEAN_includeProperties, values);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Explicitly specify visible bean 
properties.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>putToProperty(<jsf>BEAN_includeProperties</jsf>, beanClassName, 
properties)</code>
+        *              or 
<code>property(<jsf>BEAN_includeProperties_put</jsf>, beanClassName, 
properties)</code>.
+        * </ul>
+        *
+        * @param beanClassName The bean class name.  Can be a simple name, 
fully-qualified name, or <js>"*"</js>.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        * @see BeanContext#BEAN_includeProperties_put
+        */
+       public CoreObjectBuilder includeProperties(String beanClassName, String 
properties) {
+               return putToProperty(BEAN_includeProperties, beanClassName, 
properties);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Explicitly specify visible bean 
properties.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>putToProperty(<jsf>BEAN_includeProperties</jsf>, beanClass.getName(), 
properties)</code>
+        *              or 
<code>property(<jsf>BEAN_includeProperties_put</jsf>, beanClass.getName(), 
properties)</code>.
+        * </ul>
+        *
+        * @param beanClass The bean class.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        * @see BeanContext#BEAN_includeProperties_put
+        */
+       public CoreObjectBuilder includeProperties(Class<?> beanClass, String 
properties) {
+               return putToProperty(BEAN_includeProperties, 
beanClass.getName(), properties);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Exclude specified properties from 
beans.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"BeanContext.excludeProperties"</js>
+        *      <li><b>Data type:</b> <code>Map&lt;String,String&gt;</code>
+        *      <li><b>Default:</b> <code>{}</code>
+        *      <li><b>Session-overridable:</b> <jk>false</jk>
+        * </ul>
+        * <p>
+        * Specifies to exclude the specified list of properties for the 
specified bean classes.
+        * <p>
+        * The keys are either fully-qualified or simple class names, and the 
values are comma-delimited lists of property
+        * names.
+        * The key <js>"*"</js> means all bean classes.
+        * <p>
+        * For example, <code>{Bean1:<js>"foo,bar"</js>}</code> means don't 
serialize the <code>foo</code> and <code>bar</code>
+        *      properties on the specified bean.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>BEAN_excludeProperties</jsf>, values)</code>.
+        * </ul>
+        *
+        * @param values The new value for this property.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        */
+       public CoreObjectBuilder excludeProperties(Map<String,String> values) {
+               return property(BEAN_excludeProperties, values);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Exclude specified properties from 
beans.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>putToProperty(<jsf>BEAN_excludeProperties</jsf>, beanClassName, 
properties)</code>
+        *              or 
<code>property(<jsf>BEAN_excludeProperties_put</jsf>, beanClassName, 
properties)</code>.
+        * </ul>
+        *
+        * @param beanClassName The bean class name.  Can be a simple name, 
fully-qualified name, or <js>"*"</js>.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        * @see BeanContext#BEAN_excludeProperties_put
+        */
+       public CoreObjectBuilder excludeProperties(String beanClassName, String 
properties) {
+               return putToProperty(BEAN_excludeProperties, beanClassName, 
properties);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Exclude specified properties from 
beans.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>putToProperty(<jsf>BEAN_excludeProperties</jsf>, beanClass.getName(), 
properties)</code>
+        *              or 
<code>property(<jsf>BEAN_excludeProperties_put</jsf>, beanClass.getName(), 
properties)</code>.
+        * </ul>
+        *
+        * @param beanClass The bean class.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        * @see BeanContext#BEAN_excludeProperties_put
+        */
+       public CoreObjectBuilder excludeProperties(Class<?> beanClass, String 
properties) {
+               return putToProperty(BEAN_excludeProperties, 
beanClass.getName(), properties);
+       }
+
+       /**
         * <b>Configuration property:</b>  Bean lookup dictionary.
         * <p>
         * <ul>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java 
b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
index d574f21..fbd8f3d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
+++ b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
@@ -249,4 +249,20 @@ public @interface BeanProperty {
         * </ul>
         */
        Class<?>[] beanDictionary() default {};
+
+       /**
+        * Specifies a String format for converting the bean property value to 
a formatted string.
+        * <p>
+        * Note that this is usually a one-way conversion during serialization.
+        * <p>
+        * During parsing, we will attempt to convert the value to the original 
form by using the {@link BeanSession#convertToType(Object, Class)}
+        *      but there is no guarantee that this will succeed.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@BeanProperty</ja>(format=<js>"$%.2f"</js>)
+        *      <jk>public float</jk> <jf>price</jf>;
+        * </p>
+        */
+       String format() default "";
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
index c09fd02..d35d7cd 100644
--- a/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
@@ -433,6 +433,42 @@ public class CsvSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CsvSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public CsvSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index f227456..bbd5050 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -22,6 +22,7 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.apache.juneau.xml.*;
@@ -272,6 +273,10 @@ public class HtmlSerializer extends XmlSerializer {
                        }
 
                        HtmlClassMeta html = 
sType.getExtendedMeta(HtmlClassMeta.class);
+                       HtmlRender render = html.getRender();
+
+                       if (o != null && render != null)
+                               return serializeAnything(session, out, 
render.getContent(session, o), null, typeName, 2, pMeta, false);
 
                        if (html.isAsXml() || (pMeta != null && 
pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class).isAsXml())) {
                                super.serializeAnything(session, out, o, null, 
null, null, false, XmlFormat.MIXED, false, false, null);
@@ -384,9 +389,19 @@ public class HtmlSerializer extends XmlSerializer {
                                session.onError(t, "Could not call getValue() 
on property ''{0}'', {1}", e.getKey(), t.getLocalizedMessage());
                        }
 
+                       String link = getLink(ppMeta);
+                       String style = getStyle(session, ppMeta, value);
+
                        out.sTag(i+1, "tr").nl(i+2);
-                       out.sTag(i+2, "td");
+                       out.oTag(i+2, "td");
+                       if (style != null)
+                               out.attr("style", style);
+                       out.cTag();
+                       if (link != null)
+                               out.oTag(i+3, "a").attrUri("href", 
link.replace("{#}", StringUtils.toString(value))).cTag();
                        ContentResult cr = serializeAnything(session, out, key, 
keyType, null, 2, null, false);
+                       if (link != null)
+                               out.eTag("a");
                        if (cr == CR_NORMAL)
                                out.i(i+2);
                        out.eTag("td").nl(i+2);
@@ -400,7 +415,6 @@ public class HtmlSerializer extends XmlSerializer {
                out.ie(i).eTag("table").nl(i);
        }
 
-       @SuppressWarnings({ "rawtypes", "unchecked" })
        private void serializeBeanMap(HtmlSerializerSession session, HtmlWriter 
out, BeanMap<?> m, ClassMeta<?> eType, BeanPropertyMeta ppMeta) throws 
Exception {
                int i = session.getIndent();
 
@@ -421,11 +435,6 @@ public class HtmlSerializer extends XmlSerializer {
                for (BeanPropertyValue p : m.getValues(session.isTrimNulls())) {
                        BeanPropertyMeta pMeta = p.getMeta();
                        ClassMeta<?> cMeta = p.getClassMeta();
-                       HtmlBeanPropertyMeta hbpMeta = 
pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class);
-                       String link = hbpMeta.getLink();
-                       HtmlRender render = hbpMeta.getRender();
-                       if (render == null)
-                               render = 
cMeta.getExtendedMeta(HtmlClassMeta.class).getRender();
 
                        String key = p.getName();
                        Object value = p.getValue();
@@ -436,10 +445,12 @@ public class HtmlSerializer extends XmlSerializer {
                        if (session.canIgnoreValue(cMeta, key, value))
                                continue;
 
+                       String link = cMeta.isCollectionOrArray() ? null : 
getLink(pMeta);
+
                        out.sTag(i+1, "tr").nl(i+1);
                        out.sTag(i+2, "td").text(key).eTag("td").nl(i+2);
                        out.oTag(i+2, "td");
-                       String style = render == null ? null : 
render.getStyle(session, value);
+                       String style = getStyle(session, pMeta, value);
                        if (style != null)
                                out.attr("style", style);
                        out.cTag();
@@ -447,7 +458,7 @@ public class HtmlSerializer extends XmlSerializer {
                        try {
                                if (link != null)
                                        out.oTag(i+3, "a").attrUri("href", 
m.resolveVars(link)).cTag();
-                               ContentResult cr = serializeAnything(session, 
out, render == null ? value : render.getContent(session, value), cMeta, key, 2, 
pMeta, false);
+                               ContentResult cr = serializeAnything(session, 
out, value, cMeta, key, 2, pMeta, false);
                                if (cr == CR_NORMAL)
                                        out.i(i+2);
                                if (link != null)
@@ -548,24 +559,16 @@ public class HtmlSerializer extends XmlSerializer {
                                        for (Object k : th) {
                                                BeanMapEntry p = 
m2.getProperty(session.toString(k));
                                                BeanPropertyMeta pMeta = 
p.getMeta();
-                                               HtmlBeanPropertyMeta hpMeta = 
pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class);
-                                               String link = hpMeta.getLink();
-
+                                               String link = 
pMeta.getClassMeta().isCollectionOrArray() ? null : getLink(pMeta);
                                                Object value = p.getValue();
-                                               ClassMeta<?> cMeta = 
session.getClassMetaForObject(value);
-
-                                               HtmlRender render = 
hpMeta.getRender();
-                                               if (render == null && cMeta != 
null)
-                                                       render = 
cMeta.getExtendedMeta(HtmlClassMeta.class).getRender();
-
+                                               String style = 
getStyle(session, pMeta, value);
                                                out.oTag(i+2, "td");
-                                               String style = render == null ? 
null : render.getStyle(session, value);
                                                if (style != null)
                                                        out.attr("style", 
style);
                                                out.cTag();
                                                if (link != null)
                                                        out.oTag(i+3, 
"a").attrUri("href", m2.resolveVars(link)).cTag();
-                                               ContentResult cr = 
serializeAnything(session, out, render == null ? value : 
render.getContent(session, value), pMeta.getClassMeta(), p.getKey().toString(), 
2, pMeta, false);
+                                               ContentResult cr = 
serializeAnything(session, out, value, pMeta.getClassMeta(), 
p.getKey().toString(), 2, pMeta, false);
                                                if (cr == CR_NORMAL)
                                                        out.i(i+2);
                                                if (link != null)
@@ -583,8 +586,17 @@ public class HtmlSerializer extends XmlSerializer {
                                out.attr(btpn, type2);
                        out.append('>').nl(i+1);
                        for (Object o : c) {
-                               out.sTag(i+1, "li");
+                               out.oTag(i+1, "li");
+                               String style = getStyle(session, ppMeta, o);
+                               String link = getLink(ppMeta);
+                               if (style != null)
+                                       out.attr("style", style);
+                               out.cTag();
+                               if (link != null)
+                                       out.oTag(i+2, "a").attrUri("href", 
link.replace("{#}", StringUtils.toString(o))).cTag();
                                ContentResult cr = serializeAnything(session, 
out, o, eType.getElementType(), name, 1, null, false);
+                               if (link != null)
+                                       out.eTag("a");
                                if (cr == CR_NORMAL)
                                        out.ie(i+1);
                                out.eTag("li").nl(i+1);
@@ -593,6 +605,28 @@ public class HtmlSerializer extends XmlSerializer {
                }
        }
 
+       private static HtmlRender<?> getRender(HtmlSerializerSession session, 
BeanPropertyMeta pMeta, Object value) {
+               if (pMeta == null)
+                       return null;
+               HtmlBeanPropertyMeta hpMeta = 
pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class);
+               HtmlRender<?> render = hpMeta.getRender();
+               if (render != null)
+                       return render;
+               ClassMeta<?> cMeta = session.getClassMetaForObject(value);
+               render = cMeta == null ? null : 
cMeta.getExtendedMeta(HtmlClassMeta.class).getRender();
+               return render;
+       }
+
+       @SuppressWarnings({"rawtypes","unchecked"})
+       private static String getStyle(HtmlSerializerSession session, 
BeanPropertyMeta pMeta, Object value) {
+               HtmlRender render = getRender(session, pMeta, value);
+               return render == null ? null : render.getStyle(session, value);
+       }
+
+       private static String getLink(BeanPropertyMeta pMeta) {
+               return pMeta == null ? null : 
pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class).getLink();
+       }
+
        /*
         * Returns the table column headers for the specified collection of 
objects.
         * Returns null if collection should not be serialized as a 
2-dimensional table.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
index 13aa762..5073f67 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -605,6 +605,42 @@ public class HtmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public HtmlSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
index 39a4d63..5bb072d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
@@ -433,6 +433,42 @@ public class JsoSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsoSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public JsoSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
index e9ee47f..df08b02 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -445,6 +445,42 @@ public class JsonSchemaSerializerBuilder extends 
JsonSerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder includeProperties(String 
beanClassName, String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder includeProperties(Class<?> 
beanClass, String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder excludeProperties(String 
beanClassName, String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder excludeProperties(Class<?> 
beanClass, String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public JsonSchemaSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
index 97e0daa..1454d67 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
@@ -498,6 +498,42 @@ public class JsonSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public JsonSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
index 6eb01fe..330ad04 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
@@ -433,6 +433,42 @@ public class MsgPackSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public MsgPackSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public MsgPackSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
index 222e502..dd61eeb 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
@@ -433,6 +433,42 @@ public class PlainTextSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder includeProperties(String 
beanClassName, String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder excludeProperties(String 
beanClassName, String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public PlainTextSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public PlainTextSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index a1ee7c8..3a7ec4f 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -861,6 +861,42 @@ public class SerializerBuilder extends CoreObjectBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder includeProperties(Map<String,String> values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder includeProperties(String beanClassName, String 
properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder includeProperties(Class<?> beanClass, String 
properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder excludeProperties(Map<String,String> values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder excludeProperties(String beanClassName, String 
properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public CoreObjectBuilder excludeProperties(Class<?> beanClass, String 
properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public SerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index 9601e94..a29449b 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -907,6 +907,80 @@ public class SerializerGroupBuilder {
        }
 
        /**
+        * Sets the {@link BeanContext#BEAN_includeProperties} property on all 
serializers in this group.
+        *
+        * @param values The new value for this property.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        */
+       public SerializerGroupBuilder includeProperties(Map<String,String> 
values) {
+               return property(BEAN_includeProperties, values);
+       }
+
+       /**
+        * Sets the {@link BeanContext#BEAN_includeProperties_put} property on 
all serializers in this group.
+        *
+        * @param beanClassName The bean class name.  Can be a simple name, 
fully-qualified name, or <js>"*"</js>.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        * @see BeanContext#BEAN_includeProperties_put
+        */
+       public SerializerGroupBuilder includeProperties(String beanClassName, 
String properties) {
+               return putToProperty(BEAN_includeProperties, beanClassName, 
properties);
+       }
+
+       /**
+        * Sets the {@link BeanContext#BEAN_includeProperties_put} property on 
all serializers in this group.
+        *
+        * @param beanClass The bean class.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_includeProperties
+        * @see BeanContext#BEAN_includeProperties_put
+        */
+       public SerializerGroupBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               return putToProperty(BEAN_includeProperties, 
beanClass.getName(), properties);
+       }
+
+       /**
+        * Sets the {@link BeanContext#BEAN_excludeProperties} property on all 
serializers in this group.
+        *
+        * @param values The new value for this property.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        */
+       public SerializerGroupBuilder excludeProperties(Map<String,String> 
values) {
+               return property(BEAN_excludeProperties, values);
+       }
+
+       /**
+        * Sets the {@link BeanContext#BEAN_excludeProperties_put} property on 
all serializers in this group.
+        *
+        * @param beanClassName The bean class name.  Can be a simple name, 
fully-qualified name, or <js>"*"</js>.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        * @see BeanContext#BEAN_excludeProperties_put
+        */
+       public SerializerGroupBuilder excludeProperties(String beanClassName, 
String properties) {
+               return putToProperty(BEAN_excludeProperties, beanClassName, 
properties);
+       }
+
+       /**
+        * Sets the {@link BeanContext#BEAN_excludeProperties_put} property on 
all serializers in this group.
+        *
+        * @param beanClass The bean class.
+        * @param properties Comma-delimited list of property names.
+        * @return This object (for method chaining).
+        * @see BeanContext#BEAN_excludeProperties
+        * @see BeanContext#BEAN_excludeProperties_put
+        */
+       public SerializerGroupBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               return putToProperty(BEAN_excludeProperties, 
beanClass.getName(), properties);
+       }
+
+       /**
         * Sets the {@link BeanContext#BEAN_beanDictionary_add} property on all 
serializers in this group.
         *
         * @param values The new value for this property.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
index c95c349..0b6e50e 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
@@ -489,6 +489,42 @@ public class SoapXmlSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public SoapXmlSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public SoapXmlSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java
new file mode 100644
index 0000000..842b261
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/transforms/StringFormatSwap.java
@@ -0,0 +1,45 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.transforms;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.transform.*;
+
+/**
+ * Built-in POJO swap implementation class for the {@link 
BeanProperty#format()} annotation.
+ */
+public class StringFormatSwap extends StringSwap<Object> {
+
+       private final String format;
+
+       /**
+        * Constructor.
+        * @param format The string format string.
+        */
+       public StringFormatSwap(String format) {
+               this.format = format;
+       }
+
+       @Override /* PojoSwap */
+       public String swap(BeanSession session, Object o) throws 
SerializeException {
+               return String.format(format, o);
+       }
+
+       @Override /* PojoSwap */
+       public Object unswap(BeanSession session, String f, ClassMeta<?> hint) 
throws ParseException {
+               return session.convertToType(f, hint);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
index bc1d18b..8443578 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
@@ -475,6 +475,42 @@ public class UonSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UonSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public UonSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
index 4c307b5..0af49c0 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
@@ -532,6 +532,42 @@ public class UrlEncodingSerializerBuilder extends 
UonSerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder 
includeProperties(Map<String,String> values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder includeProperties(String 
beanClassName, String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder includeProperties(Class<?> 
beanClass, String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder 
excludeProperties(Map<String,String> values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder excludeProperties(String 
beanClassName, String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public UrlEncodingSerializerBuilder excludeProperties(Class<?> 
beanClass, String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public UrlEncodingSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerBuilder.java
index 7fba517..dcb590c 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializerBuilder.java
@@ -469,6 +469,42 @@ public class XmlSchemaSerializerBuilder extends 
XmlSerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder includeProperties(String 
beanClassName, String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder excludeProperties(String 
beanClassName, String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSchemaSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public XmlSchemaSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
index bcf450f..56b2fff 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
@@ -621,6 +621,42 @@ public class XmlSerializerBuilder extends 
SerializerBuilder {
        }
 
        @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder includeProperties(Map<String,String> 
values) {
+               super.includeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder includeProperties(String beanClassName, 
String properties) {
+               super.includeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder includeProperties(Class<?> beanClass, 
String properties) {
+               super.includeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder excludeProperties(Map<String,String> 
values) {
+               super.excludeProperties(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder excludeProperties(String beanClassName, 
String properties) {
+               super.excludeProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public XmlSerializerBuilder excludeProperties(Class<?> beanClass, 
String properties) {
+               super.excludeProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
        public XmlSerializerBuilder beanDictionary(Class<?>...values) {
                super.beanDictionary(values);
                return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html 
b/juneau-core/src/main/javadoc/overview.html
index f9eafcc..a2c57dd 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -6318,6 +6318,12 @@
                                </ul>
                        <li>{@link org.apache.juneau.annotation.NameProperty 
@NameProperty} and {@link org.apache.juneau.annotation.ParentProperty 
@ParentProperty}
                                can now be applied to fields.  
+                       <li>New properties on {@link 
org.apache.juneau.BeanContext}:
+                               <ul>
+                                       <li>{@link 
org.apache.juneau.BeanContext#BEAN_includeProperties BEAN_includeProperties}
+                                       <li>{@link 
org.apache.juneau.BeanContext#BEAN_excludeProperties BEAN_excludeProperties}
+                               </ul>
+                       <li>New annotation property: {@link 
org.apache.juneau.annotation.BeanProperty#format()}.
                </ul>
 
                <h6 class='topic'>org.apache.juneau.rest</h6>
@@ -6433,8 +6439,10 @@
                                at the end of the HTTP call.
                        <li>New anntotations added to {@link 
org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
                                <ul>
-                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#defaultQuery defaultQuery()}
-                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#defaultFormData defaultFormData()}
+                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#defaultQuery() defaultQuery()}
+                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#defaultFormData() 
defaultFormData()}
+                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#bpIncludes() bpIncludes()}
+                                       <li>{@link 
org.apache.juneau.rest.annotation.RestMethod#bpExcludes() bpExcludes()}
                                </ul>
                        <li>Default values on header, query, and form-data 
annotations:
                                <ul>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStore.json
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStore.json
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStore.json
new file mode 100644
index 0000000..e8d3800
--- /dev/null
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStore.json
@@ -0,0 +1,17 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+{
+       1: {kind:'CAT',name:'Mr. 
Frisky',price:39.99,breed:'Persian',getsAlongWith:['CAT','FISH','RABBIT']},
+       2: 
{kind:'DOG',name:'Kibbles',price:99.99,breed:'Husky',getsAlongWith:['DOG','BIRD','FISH','MOUSE','RABBIT']},
+       3: 
{kind:'RABBIT',name:'Hoppy',price:49.99,breed:'Angora',getsAlongWith:['DOG','BIRD','FISH','MOUSE']}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
new file mode 100644
index 0000000..381c897
--- /dev/null
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
@@ -0,0 +1,108 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.examples.rest;
+
+import java.util.*;
+import java.util.Map;
+
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.dto.html5.*;
+import org.apache.juneau.html.*;
+import org.apache.juneau.html.annotation.Html;
+import org.apache.juneau.json.*;
+import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
+import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Sample REST resource that renders summary and detail views of the same bean.
+ */
+@RestResource(
+       title="Pet Store",
+       description="An example of a typical REST resource where beans are 
rendered in summary and details views.",
+       path="/petstore",
+       htmldoc=@HtmlDoc(
+               
links="{up:'request:/..',options:'servlet:/?method=OPTIONS',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java'}",
+               aside=""
+                       + "<div style='max-width:400px' class='text'>"
+                       + "     <p>This page shows a standard REST resource 
that renders bean summaries and details.</p>"
+                       + "     <p>It shows how different properties can be 
rendered on the same bean in different views.</p>"
+                       + "     <p>It also shows examples of HtmlRender classes 
and @BeanProperty(format) annotations.</p>"
+                       + "</div>"
+       )
+)
+public class PetStoreResource extends Resource {
+       private static final long serialVersionUID = 1L;
+
+       // Our database.
+       private Map<Integer,Pet> petDB;
+       
+       @Override /* Servlet */
+       public synchronized void init(RestConfig config) throws Exception {
+               // Load our database from a local JSON file.
+               petDB = 
JsonParser.DEFAULT.parse(getClass().getResourceAsStream("PetStore.json"), 
LinkedHashMap.class, Integer.class, Pet.class);
+               super.init(config);
+       }
+       
+       // Exclude the 'breed' and 'getsAlongWith' properties from the beans.
+       @RestMethod(name="GET", path="/", summary="The complete list of pets in 
the store", bpExcludes="{Pet:'breed,getsAlongWith'}")
+       public Collection<Pet> getPets() {
+               return petDB.values();
+       }
+
+       // Shows all bean properties.
+       @RestMethod(name="GET", path="/{id}", summary="Pet details")
+       public Pet getPet(@Path("id") Integer id) {
+               return petDB.get(id);
+       }
+
+       // Our bean class.
+       public static class Pet {
+               
+               @Html(link="servlet:/{id}")  // Creates a hyperlink in HTML 
view.
+               @NameProperty                // Links the parent key to this 
bean.
+               public int id;
+               
+               public String name;
+               public Kind kind;
+               public String breed;
+               public List<Kind> getsAlongWith;
+               
+               @BeanProperty(format="$%.2f")  // Renders price in dollars.
+               public float price;
+       }
+       
+       @Html(render=KindRender.class)  // Render as an icon in HTML.
+       public static enum Kind {
+               CAT, 
+               DOG, 
+               BIRD,
+               FISH,
+               MOUSE,
+               RABBIT,
+               SNAKE
+       }
+
+       public static class KindRender extends HtmlRender<Kind> {
+               @Override
+               public Object getContent(SerializerSession session, Kind value) 
{
+                       return new 
Img().src("servlet:/htdocs/"+value.toString().toLowerCase()+".png");
+               }
+               @Override
+               public String getStyle(SerializerSession session, Kind value) {
+                       return "background-color:#FDF2E9";
+               }
+       }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
index 14adedc..d829209 100644
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
@@ -44,6 +44,7 @@ import org.apache.juneau.rest.widget.*;
        },
        children={
                HelloWorldResource.class,
+               PetStoreResource.class,
                SystemPropertiesResource.class,
                MethodExampleResource.class,
                RequestEchoResource.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/bird.png
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/bird.png
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/bird.png
new file mode 100644
index 0000000..636ecf8
Binary files /dev/null and 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/bird.png
 differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/cat.png
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/cat.png
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/cat.png
new file mode 100644
index 0000000..917abc6
Binary files /dev/null and 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/cat.png
 differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/dog.png
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/dog.png
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/dog.png
new file mode 100644
index 0000000..e100eb2
Binary files /dev/null and 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/dog.png
 differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/1a4670de/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/fish.png
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/fish.png
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/fish.png
new file mode 100644
index 0000000..ca76a46
Binary files /dev/null and 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/htdocs/fish.png
 differ


Reply via email to