JUNEAU-155 Split bpi/bpx into serializer and parser configuration
properties.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 7541d8d..1d4d968 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -864,6 +864,10 @@
 	 */
 	public static final String BEAN_bpx = PREFIX + ".bpx.sms";
 
+	public static final String BEAN_bpro = PREFIX + ".bpro.sms";
+
+	public static final String BEAN_bpwo = PREFIX + ".bpwo.sms";
+
 	/**
 	 * Configuration property:  Debug mode.
 	 *
@@ -1957,7 +1961,7 @@
 	private final Locale locale;
 	private final TimeZone timeZone;
 	private final MediaType mediaType;
-	private final Map<String,String[]> bpi, bpx;
+	private final Map<String,String[]> bpi, bpx, bpro, bpwo;
 	private final PropertyNamer propertyNamer;
 	private final String beanTypePropertyName;
 	private final int beanHashCode;
@@ -2067,6 +2071,16 @@
 			m2.put(e.getKey(), StringUtils.split(e.getValue()));
 		bpx = unmodifiableMap(m2);
 
+		m2 = new HashMap<>();
+		for (Map.Entry<String,String> e : getMapProperty(BEAN_bpro, String.class).entrySet())
+			m2.put(e.getKey(), StringUtils.split(e.getValue()));
+		bpro = unmodifiableMap(m2);
+
+		m2 = new HashMap<>();
+		for (Map.Entry<String,String> e : getMapProperty(BEAN_bpwo, String.class).entrySet())
+			m2.put(e.getKey(), StringUtils.split(e.getValue()));
+		bpwo = unmodifiableMap(m2);
+
 		locale = getInstanceProperty(BEAN_locale, Locale.class, Locale.getDefault());
 		timeZone = getInstanceProperty(BEAN_timeZone, TimeZone.class, null);
 		mediaType = getInstanceProperty(BEAN_mediaType, MediaType.class, null);
@@ -3017,6 +3031,46 @@
 		return bpx.get("*");
 	}
 
+	protected final Map<String,String[]> getBpro() {
+		return bpro;
+	}
+
+	protected String[] getBpro(Class<?> c) {
+		if (bpro.isEmpty())
+			return null;
+		String[] s = null;
+		ClassInfo ci = ClassInfo.of(c);
+		for (ClassInfo c2 : ci.getAllParents()) {
+			s = bpro.get(c2.getFullName());
+			if (s != null)
+				return s;
+			s = bpro.get(c2.getSimpleName());
+			if (s != null)
+				return s;
+		}
+		return bpro.get("*");
+	}
+
+	protected final Map<String,String[]> getBpwo() {
+		return bpwo;
+	}
+
+	protected String[] getBpwo(Class<?> c) {
+		if (bpwo.isEmpty())
+			return null;
+		String[] s = null;
+		ClassInfo ci = ClassInfo.of(c);
+		for (ClassInfo c2 : ci.getAllParents()) {
+			s = bpwo.get(c2.getFullName());
+			if (s != null)
+				return s;
+			s = bpwo.get(c2.getSimpleName());
+			if (s != null)
+				return s;
+		}
+		return bpwo.get("*");
+	}
+
 	/**
 	 * Configuration property:  Debug mode.
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 2c1eede..d0d9a3e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -257,17 +257,19 @@
 				Set<String> fixedBeanProps = new LinkedHashSet<>();

 				String[] bpi = ctx.getBpi(c);

 				String[] bpx = ctx.getBpx(c);

+				String[] bpro = ctx.getBpro(c);

+				String[] bpwo = ctx.getBpwo(c);

 

 				Set<String> filterProps = new HashSet<>();  // Names of properties defined in @Bean(properties)

 

 				if (beanFilter != null) {

 

-					if (beanFilter.getProperties() != null)

-						filterProps.addAll(Arrays.asList(beanFilter.getProperties()));

+					if (beanFilter.getBpi() != null)

+						filterProps.addAll(Arrays.asList(beanFilter.getBpi()));

 

 					// Get the 'properties' attribute if specified.

-					if (beanFilter.getProperties() != null && bpi == null)

-						for (String p : beanFilter.getProperties())

+					if (beanFilter.getBpi() != null && bpi == null)

+						for (String p : beanFilter.getBpi())

 							fixedBeanProps.add(p);

 

 					if (beanFilter.getPropertyNamer() != null)

@@ -423,17 +425,20 @@
 				if (beanFilter != null) {

 

 					// Eliminated excluded properties if BeanFilter.excludeKeys is specified.

-					String[] includeKeys = beanFilter.getProperties();

-					String[] excludeKeys = beanFilter.getExcludeProperties();

-					if (excludeKeys != null && bpx == null) {

-						for (String k : excludeKeys)

+					String[] bfbpi = beanFilter.getBpi();

+					String[] bfbpx = beanFilter.getBpx();

+					String[] bfbpro = beanFilter.getBpro();

+					String[] bfbpwo = beanFilter.getBpwo();

+

+					if (bfbpx != null && bpx == null) {

+						for (String k : bfbpx)

 							properties.remove(k);

 

 					// Only include specified properties if BeanFilter.includeKeys is specified.

 					// Note that the order must match includeKeys.

-					} else if (includeKeys != null) {

+					} else if (bfbpi != null) {

 						Map<String,BeanPropertyMeta> properties2 = new LinkedHashMap<>();

-						for (String k : includeKeys) {

+						for (String k : bfbpi) {

 							if (properties.containsKey(k))

 								properties2.put(k, properties.get(k));

 						}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
index 327aaa0..06ccfdb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
@@ -101,6 +101,10 @@
 	 */

 	String bpx() default "";

 

+	String bpro() default "";

+

+	String bpwo() default "";

+

 	/**

 	 * Bean dictionary.

 	 *

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
index ec66cbb..86ef9f4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
@@ -330,4 +330,7 @@
 	 * </p>

 	 */

 	String format() default "";

+

+	boolean ro() default false;

+	boolean wo() default false;

 }

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
index c79711d..c713998 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
@@ -66,6 +66,12 @@
 			if (! b.bpx().isEmpty())

 				bpx(split(b.bpx()));

 

+			if (! b.bpro().isEmpty())

+				bpro(split(b.bpro()));

+

+			if (! b.bpwo().isEmpty())

+				bpwo(split(b.bpwo()));

+

 			if (b.propertyNamer() != PropertyNamerDefault.class)

 				propertyNamer(b.propertyNamer());

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilter.java
index fdb7e55..bac9b4d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilter.java
@@ -35,7 +35,7 @@
 public final class BeanFilter {

 

 	private final Class<?> beanClass;

-	private final String[] bpi, bpx;

+	private final String[] bpi, bpx, bpro, bpwo;

 	private final PropertyNamer propertyNamer;

 	private final Class<?> interfaceClass, stopClass;

 	private final boolean sortProperties, fluentSetters;

@@ -51,6 +51,8 @@
 		this.typeName = builder.typeName;

 		this.bpi = split(builder.bpi, ',');

 		this.bpx = split(builder.bpx, ',');

+		this.bpro = split(builder.bpro, ',');

+		this.bpwo = split(builder.bpwo, ',');

 		this.interfaceClass = builder.interfaceClass;

 		this.stopClass = builder.stopClass;

 		this.sortProperties = builder.sortProperties;

@@ -85,17 +87,6 @@
 	}

 

 	/**

-	 * Returns the set and order of names of properties associated with a bean class.

-	 *

-	 * @return

-	 * 	The name of the properties associated with a bean class, or <jk>null</jk> if all bean properties should

-	 * 	be used.

-	 */

-	public String[] getProperties() {

-		return bpi;

-	}

-

-	/**

 	 * Returns the bean dictionary defined on this bean.

 	 *

 	 * @return The bean dictionary defined on this bean, or <jk>null</jk> if no bean dictionary is defined.

@@ -105,10 +96,38 @@
 	}

 

 	/**

+	 * Returns the set and order of names of properties associated with a bean class.

+	 *

+	 * @return

+	 * 	The name of the properties associated with a bean class, or <jk>null</jk> if all bean properties should

+	 * 	be used.

+	 */

+	public String[] getBpi() {

+		return bpi;

+	}

+

+	/**

+	 * Returns the list of properties to ignore on a bean.

+	 *

+	 * @return The name of the properties to ignore on a bean, or <jk>null</jk> to not ignore any properties.

+	 */

+	public String[] getBpx() {

+		return bpx;

+	}

+

+	public String[] getBpro() {

+		return bpro;

+	}

+

+	public String[] getBpwo() {

+		return bpwo;

+	}

+

+	/**

 	 * Returns <jk>true</jk> if the properties defined on this bean class should be ordered alphabetically.

 	 *

 	 * <p>

-	 * This method is only used when the {@link #getProperties()} method returns <jk>null</jk>.

+	 * This method is only used when the {@link #getBpi()} method returns <jk>null</jk>.

 	 * Otherwise, the ordering of the properties in the returned value is used.

 	 *

 	 * @return <jk>true</jk> if bean properties should be sorted.

@@ -127,15 +146,6 @@
 	}

 

 	/**

-	 * Returns the list of properties to ignore on a bean.

-	 *

-	 * @return The name of the properties to ignore on a bean, or <jk>null</jk> to not ignore any properties.

-	 */

-	public String[] getExcludeProperties() {

-		return bpx;

-	}

-

-	/**

 	 * Returns the {@link PropertyNamer} associated with the bean to tailor the names of bean properties.

 	 *

 	 * @return The property namer class, or <jk>null</jk> if no property namer is associated with this bean property.

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
index 56c059c..f6ab71f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
@@ -58,7 +58,7 @@
 
 	Class<?> beanClass;
 	String typeName;
-	String[] bpi, bpx;
+	String[] bpi, bpx, bpro, bpwo;
 	Class<?> interfaceClass, stopClass;
 	boolean sortProperties, fluentSetters;
 	Object propertyNamer;
@@ -541,6 +541,16 @@
 		return this;
 	}
 
+	public BeanFilterBuilder<T> bpro(String...value) {
+		this.bpro = value;
+		return this;
+	}
+
+	public BeanFilterBuilder<T> bpwo(String...value) {
+		this.bpwo = value;
+		return this;
+	}
+
 	/**
 	 * Configuration property:  Bean dictionary.
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
index dc9080e..a4ea82f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
@@ -63,9 +63,21 @@
 			if (! b.properties().isEmpty())

 				bpi(split(b.properties()));

 

+			if (! b.excludeProperties().isEmpty())

+				bpx(split(b.excludeProperties()));

+

 			if (! b.bpi().isEmpty())

 				bpi(split(b.bpi()));

 

+			if (! b.bpx().isEmpty())

+				bpx(split(b.bpx()));

+

+			if (! b.bpro().isEmpty())

+				bpro(split(b.bpro()));

+

+			if (! b.bpwo().isEmpty())

+				bpwo(split(b.bpwo()));

+

 			if (! b.typeName().isEmpty())

 				typeName(b.typeName());

 

@@ -75,12 +87,6 @@
 			if (b.fluentSetters())

 				fluentSetters(true);

 

-			if (! b.excludeProperties().isEmpty())

-				bpx(split(b.excludeProperties()));

-

-			if (! b.bpx().isEmpty())

-				bpx(split(b.bpx()));

-

 			try {

 				if (b.propertyNamer() != PropertyNamerDefault.class)

 					propertyNamer(b.propertyNamer());