JUNEAU-169 Dynamic annotations.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
new file mode 100644
index 0000000..6bdd5e2
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
@@ -0,0 +1,18 @@
+// ***************************************************************************************************************************
+// * 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;
+
+/**
+ * Parent interface for all class/method language-specific metadata providers.
+ */
+public interface MetaProvider {}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
new file mode 100644
index 0000000..2dca01b
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.csv;

+

+import org.apache.juneau.*;

+import org.apache.juneau.csv.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the CSV serializers and parsers pulled from the {@link Csv @Csv}

+ * annotation on the bean property.

+ */

+public final class CsvBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final CsvBeanPropertyMeta DEFAULT = new CsvBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).

+	 */

+	public CsvBeanPropertyMeta(BeanPropertyMeta bpm, CsvMetaProvider csvMetaProvider) {

+		super(bpm);

+	}

+

+	private CsvBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
new file mode 100644
index 0000000..ebbcdee
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.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.csv;

+

+import org.apache.juneau.*;

+import org.apache.juneau.csv.annotation.*;

+

+/**

+ * Metadata on classes specific to the CSV serializers and parsers pulled from the {@link Csv @Csv} annotation on

+ * the class.

+ */

+public class CsvClassMeta extends ExtendedClassMeta {

+

+	private final Csv csv;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).

+	 */

+	public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider csvMetaProvider) {

+		super(cm);

+		this.csv = cm.getInfo().getAnnotation(Csv.class);

+	}

+

+	/**

+	 * Returns the {@link Csv @Csv} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected Csv getAnnotation() {

+		return csv;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java
new file mode 100644
index 0000000..edc336f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.csv;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link CsvClassMeta} and {@link CsvBeanPropertyMeta} objects.
+ */
+public interface CsvMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	CsvClassMeta getCsvClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	CsvBeanPropertyMeta getCsvBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
index 3073f39..d8442ca 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.csv;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.parser.*;

@@ -20,7 +23,7 @@
  * TODO - Work in progress.  CSV parser.

  */

 @ConfigurableContext

-public class CsvParser extends ReaderParser implements CsvCommon {

+public class CsvParser extends ReaderParser implements CsvMetaProvider, CsvCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -40,6 +43,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,CsvClassMeta> csvClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,CsvBeanPropertyMeta> csvBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -78,6 +84,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* CsvMetaProvider */

+	public CsvClassMeta getCsvClassMeta(ClassMeta<?> cm) {

+		CsvClassMeta m = csvClassMetas.get(cm);

+		if (m == null) {

+			m = new CsvClassMeta(cm, this);

+			csvClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* CsvMetaProvider */

+	public CsvBeanPropertyMeta getCsvBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return CsvBeanPropertyMeta.DEFAULT;

+		CsvBeanPropertyMeta m = csvBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new CsvBeanPropertyMeta(bpm.getDelegateFor(), this);

+			csvBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
index 440dcc3..e62ea5d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.csv;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.serializer.*;

@@ -20,7 +23,7 @@
  * TODO - Work in progress.  CSV serializer.

  */

 @ConfigurableContext

-public final class CsvSerializer extends WriterSerializer implements CsvCommon {

+public final class CsvSerializer extends WriterSerializer implements CsvMetaProvider,CsvCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -40,6 +43,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,CsvClassMeta> csvClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,CsvBeanPropertyMeta> csvBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -81,6 +87,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* CsvMetaProvider */

+	public CsvClassMeta getCsvClassMeta(ClassMeta<?> cm) {

+		CsvClassMeta m = csvClassMetas.get(cm);

+		if (m == null) {

+			m = new CsvClassMeta(cm, this);

+			csvClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* CsvMetaProvider */

+	public CsvBeanPropertyMeta getCsvBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return CsvBeanPropertyMeta.DEFAULT;

+		CsvBeanPropertyMeta m = csvBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new CsvBeanPropertyMeta(bpm.getDelegateFor(), this);

+			csvBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
index 74c7949..a1f8fce 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
@@ -17,7 +17,7 @@
 /**
  * Interface for providing access to {@link HtmlClassMeta} and {@link HtmlBeanPropertyMeta} objects.
  */
-public interface HtmlMetaProvider {
+public interface HtmlMetaProvider extends MetaProvider {
 
 	/**
 	 * Returns the language-specific metadata on the specified class.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
new file mode 100644
index 0000000..006338e
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.jso;

+

+import org.apache.juneau.*;

+import org.apache.juneau.jso.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the JSO serializers and parsers pulled from the {@link Jso @Jso}

+ * annotation on the bean property.

+ */

+public final class JsoBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final JsoBeanPropertyMeta DEFAULT = new JsoBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).

+	 */

+	public JsoBeanPropertyMeta(BeanPropertyMeta bpm, JsoMetaProvider jsoMetaProvider) {

+		super(bpm);

+	}

+

+	private JsoBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
new file mode 100644
index 0000000..0d984d5
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.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.jso;

+

+import org.apache.juneau.*;

+import org.apache.juneau.jso.annotation.*;

+

+/**

+ * Metadata on classes specific to the JSO serializers and parsers pulled from the {@link Jso @Jso} annotation on

+ * the class.

+ */

+public class JsoClassMeta extends ExtendedClassMeta {

+

+	private final Jso jso;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).

+	 */

+	public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider jsoMetaProvider) {

+		super(cm);

+		this.jso = cm.getInfo().getAnnotation(Jso.class);

+	}

+

+	/**

+	 * Returns the {@link Jso @Jso} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected Jso getAnnotation() {

+		return jso;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoMetaProvider.java
new file mode 100644
index 0000000..beef60b
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.jso;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link JsoClassMeta} and {@link JsoBeanPropertyMeta} objects.
+ */
+public interface JsoMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	JsoClassMeta getJsoClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	JsoBeanPropertyMeta getJsoBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoParser.java
index b197364..4f13d57 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoParser.java
@@ -13,6 +13,8 @@
 package org.apache.juneau.jso;

 

 import java.io.*;

+import java.util.*;

+import java.util.concurrent.*;

 

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

@@ -26,7 +28,7 @@
  * Consumes <c>Content-Type</c> types:  <bc>application/x-java-serialized-object</bc>

  */

 @ConfigurableContext

-public final class JsoParser extends InputStreamParser implements JsoCommon {

+public final class JsoParser extends InputStreamParser implements JsoMetaProvider, JsoCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -45,6 +47,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,JsoClassMeta> jsoClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,JsoBeanPropertyMeta> jsoBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -86,6 +91,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* JsoMetaProvider */

+	public JsoClassMeta getJsoClassMeta(ClassMeta<?> cm) {

+		JsoClassMeta m = jsoClassMetas.get(cm);

+		if (m == null) {

+			m = new JsoClassMeta(cm, this);

+			jsoClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* JsoMetaProvider */

+	public JsoBeanPropertyMeta getJsoBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return JsoBeanPropertyMeta.DEFAULT;

+		JsoBeanPropertyMeta m = jsoBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new JsoBeanPropertyMeta(bpm.getDelegateFor(), this);

+			jsoBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializer.java
index 4fd10d2..a41850f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializer.java
@@ -13,6 +13,8 @@
 package org.apache.juneau.jso;

 

 import java.io.*;

+import java.util.*;

+import java.util.concurrent.*;

 

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

@@ -28,7 +30,7 @@
  * Produces <c>Content-Type</c> types:  <bc>application/x-java-serialized-object</bc>

  */

 @ConfigurableContext

-public class JsoSerializer extends OutputStreamSerializer implements JsoCommon {

+public class JsoSerializer extends OutputStreamSerializer implements JsoMetaProvider, JsoCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -47,6 +49,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,JsoClassMeta> jsoClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,JsoBeanPropertyMeta> jsoBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -88,6 +93,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* JsoMetaProvider */

+	public JsoClassMeta getJsoClassMeta(ClassMeta<?> cm) {

+		JsoClassMeta m = jsoClassMetas.get(cm);

+		if (m == null) {

+			m = new JsoClassMeta(cm, this);

+			jsoClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* JsoMetaProvider */

+	public JsoBeanPropertyMeta getJsoBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return JsoBeanPropertyMeta.DEFAULT;

+		JsoBeanPropertyMeta m = jsoBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new JsoBeanPropertyMeta(bpm.getDelegateFor(), this);

+			jsoBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
new file mode 100644
index 0000000..5237126
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.json;

+

+import org.apache.juneau.*;

+import org.apache.juneau.json.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the JSON serializers and parsers pulled from the {@link Json @Json}

+ * annotation on the bean property.

+ */

+public final class JsonBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final JsonBeanPropertyMeta DEFAULT = new JsonBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param jsonMetaProvider JSON metadata provider (for finding information about other artifacts).

+	 */

+	public JsonBeanPropertyMeta(BeanPropertyMeta bpm, JsonMetaProvider jsonMetaProvider) {

+		super(bpm);

+	}

+

+	private JsonBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
index 9d28c35..98b53c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
@@ -15,9 +15,9 @@
 import org.apache.juneau.*;
 
 /**
- * Interface for providing access to {@link JsonClassMeta} objects.
+ * Interface for providing access to {@link JsonClassMeta} and {@link JsonBeanPropertyMeta} objects.
  */
-public interface JsonMetaProvider {
+public interface JsonMetaProvider extends MetaProvider {
 
 	/**
 	 * Returns the language-specific metadata on the specified class.
@@ -26,4 +26,12 @@
 	 * @return The metadata.
 	 */
 	JsonClassMeta getJsonClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	JsonBeanPropertyMeta getJsonBeanPropertyMeta(BeanPropertyMeta bpm);
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
index 760a226..a023bd0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -200,6 +200,7 @@
 

 	private final boolean validateEnd;

 	private final Map<ClassMeta<?>,JsonClassMeta> jsonClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,JsonBeanPropertyMeta> jsonBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -266,6 +267,18 @@
 		return m;

 	}

 

+	@Override /* JsonMetaProvider */

+	public JsonBeanPropertyMeta getJsonBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return JsonBeanPropertyMeta.DEFAULT;

+		JsonBeanPropertyMeta m = jsonBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new JsonBeanPropertyMeta(bpm.getDelegateFor(), this);

+			jsonBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

 	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
index a8318d0..2637868 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -314,6 +314,7 @@
 		escapeSolidus,

 		addBeanTypes;

 	private final Map<ClassMeta<?>,JsonClassMeta> jsonClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,JsonBeanPropertyMeta> jsonBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	private volatile JsonSchemaSerializer schemaSerializer;

 

@@ -421,6 +422,18 @@
 		return m;

 	}

 

+	@Override /* JsonMetaProvider */

+	public JsonBeanPropertyMeta getJsonBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return JsonBeanPropertyMeta.DEFAULT;

+		JsonBeanPropertyMeta m = jsonBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new JsonBeanPropertyMeta(bpm.getDelegateFor(), this);

+			jsonBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

 	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
index 9f34b9e..a715f5c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
@@ -17,7 +17,7 @@
 /**
  * Interface for providing access to {@link JsonSchemaClassMeta} and {@link JsonSchemaBeanPropertyMeta} objects.
  */
-public interface JsonSchemaMetaProvider {
+public interface JsonSchemaMetaProvider extends MetaProvider  {
 
 	/**
 	 * Returns the language-specific metadata on the specified class.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
new file mode 100644
index 0000000..84782af
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.msgpack;

+

+import org.apache.juneau.*;

+import org.apache.juneau.msgpack.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the MessagePack serializers and parsers pulled from the {@link MsgPack @MsgPack}

+ * annotation on the bean property.

+ */

+public final class MsgPackBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final MsgPackBeanPropertyMeta DEFAULT = new MsgPackBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).

+	 */

+	public MsgPackBeanPropertyMeta(BeanPropertyMeta bpm, MsgPackMetaProvider msgPackMetaProvider) {

+		super(bpm);

+	}

+

+	private MsgPackBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
new file mode 100644
index 0000000..7298470
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.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.msgpack;

+

+import org.apache.juneau.*;

+import org.apache.juneau.msgpack.annotation.*;

+

+/**

+ * Metadata on classes specific to the MessagePack serializers and parsers pulled from the {@link MsgPack @MsgPack} annotation on

+ * the class.

+ */

+public class MsgPackClassMeta extends ExtendedClassMeta {

+

+	private final MsgPack msgPack;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).

+	 */

+	public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider msgPackMetaProvider) {

+		super(cm);

+		this.msgPack = cm.getInfo().getAnnotation(MsgPack.class);

+	}

+

+	/**

+	 * Returns the {@link MsgPack @MsgPack} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected MsgPack getAnnotation() {

+		return msgPack;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java
new file mode 100644
index 0000000..ca47478
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.msgpack;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link MsgPackClassMeta} and {@link MsgPackBeanPropertyMeta} objects.
+ */
+public interface MsgPackMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	MsgPackClassMeta getMsgPackClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	MsgPackBeanPropertyMeta getMsgPackBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index 34bfc93..b4264ec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.msgpack;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.parser.*;

@@ -24,7 +27,7 @@
  * Handles <c>Content-Type</c> types:  <bc>octal/msgpack</bc>

  */

 @ConfigurableContext

-public class MsgPackParser extends InputStreamParser implements MsgPackCommon {

+public class MsgPackParser extends InputStreamParser implements MsgPackMetaProvider, MsgPackCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -83,6 +86,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,MsgPackClassMeta> msgPackClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,MsgPackBeanPropertyMeta> msgPackBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -124,6 +130,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* MsgPackMetaProvider */

+	public MsgPackClassMeta getMsgPackClassMeta(ClassMeta<?> cm) {

+		MsgPackClassMeta m = msgPackClassMetas.get(cm);

+		if (m == null) {

+			m = new MsgPackClassMeta(cm, this);

+			msgPackClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* MsgPackMetaProvider */

+	public MsgPackBeanPropertyMeta getMsgPackBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return MsgPackBeanPropertyMeta.DEFAULT;

+		MsgPackBeanPropertyMeta m = msgPackBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new MsgPackBeanPropertyMeta(bpm.getDelegateFor(), this);

+			msgPackBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index 3093033..36924da 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.msgpack;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.serializer.*;

@@ -26,7 +29,7 @@
  * Produces <c>Content-Type</c> types: <bc>octal/msgpack</bc>

  */

 @ConfigurableContext

-public class MsgPackSerializer extends OutputStreamSerializer implements MsgPackCommon {

+public class MsgPackSerializer extends OutputStreamSerializer implements MsgPackMetaProvider, MsgPackCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -114,6 +117,8 @@
 

 	private final boolean

 		addBeanTypes;

+	private final Map<ClassMeta<?>,MsgPackClassMeta> msgPackClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,MsgPackBeanPropertyMeta> msgPackBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -157,6 +162,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* MsgPackMetaProvider */

+	public MsgPackClassMeta getMsgPackClassMeta(ClassMeta<?> cm) {

+		MsgPackClassMeta m = msgPackClassMetas.get(cm);

+		if (m == null) {

+			m = new MsgPackClassMeta(cm, this);

+			msgPackClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* MsgPackMetaProvider */

+	public MsgPackBeanPropertyMeta getMsgPackBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return MsgPackBeanPropertyMeta.DEFAULT;

+		MsgPackBeanPropertyMeta m = msgPackBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new MsgPackBeanPropertyMeta(bpm.getDelegateFor(), this);

+			msgPackBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
new file mode 100644
index 0000000..416e081
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.oapi;

+

+import org.apache.juneau.*;

+import org.apache.juneau.oapi.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the OpenAPI serializers and parsers pulled from the {@link OpenApi @OpenApi}

+ * annotation on the bean property.

+ */

+public final class OpenApiBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final OpenApiBeanPropertyMeta DEFAULT = new OpenApiBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).

+	 */

+	public OpenApiBeanPropertyMeta(BeanPropertyMeta bpm, OpenApiMetaProvider openApiMetaProvider) {

+		super(bpm);

+	}

+

+	private OpenApiBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
new file mode 100644
index 0000000..e65596b
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.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.oapi;

+

+import org.apache.juneau.*;

+import org.apache.juneau.oapi.annotation.*;

+

+/**

+ * Metadata on classes specific to the OpenApi serializers and parsers pulled from the {@link OpenApi @OpenApi} annotation on

+ * the class.

+ */

+public class OpenApiClassMeta extends ExtendedClassMeta {

+

+	private final OpenApi openApi;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).

+	 */

+	public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider openApiMetaProvider) {

+		super(cm);

+		this.openApi = cm.getInfo().getAnnotation(OpenApi.class);

+	}

+

+	/**

+	 * Returns the {@link OpenApi @OpenApi} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected OpenApi getAnnotation() {

+		return openApi;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java
new file mode 100644
index 0000000..d5f9f60
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.oapi;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link OpenApiClassMeta} and {@link OpenApiBeanPropertyMeta} objects.
+ */
+public interface OpenApiMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	OpenApiClassMeta getOpenApiClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	OpenApiBeanPropertyMeta getOpenApiBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
index 0a66fd8..7295f00 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.oapi;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.parser.*;

@@ -25,7 +28,7 @@
  * </ul>

  */

 @ConfigurableContext

-public class OpenApiParser extends UonParser implements OpenApiCommon {

+public class OpenApiParser extends UonParser implements OpenApiMetaProvider, OpenApiCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -45,6 +48,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,OpenApiClassMeta> openApiClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,OpenApiBeanPropertyMeta> openApiBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -102,6 +108,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* OpenApiMetaProvider */

+	public OpenApiClassMeta getOpenApiClassMeta(ClassMeta<?> cm) {

+		OpenApiClassMeta m = openApiClassMetas.get(cm);

+		if (m == null) {

+			m = new OpenApiClassMeta(cm, this);

+			openApiClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* OpenApiMetaProvider */

+	public OpenApiBeanPropertyMeta getOpenApiBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return OpenApiBeanPropertyMeta.DEFAULT;

+		OpenApiBeanPropertyMeta m = openApiBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new OpenApiBeanPropertyMeta(bpm.getDelegateFor(), this);

+			openApiBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
index f3ee5bd..5eb518a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.oapi;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.httppart.*;

@@ -26,7 +29,7 @@
  * </ul>

  */

 @ConfigurableContext

-public class OpenApiSerializer extends UonSerializer implements OpenApiCommon {

+public class OpenApiSerializer extends UonSerializer implements OpenApiMetaProvider, OpenApiCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -46,6 +49,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,OpenApiClassMeta> openApiClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,OpenApiBeanPropertyMeta> openApiBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -145,6 +151,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* OpenApiMetaProvider */

+	public OpenApiClassMeta getOpenApiClassMeta(ClassMeta<?> cm) {

+		OpenApiClassMeta m = openApiClassMetas.get(cm);

+		if (m == null) {

+			m = new OpenApiClassMeta(cm, this);

+			openApiClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* OpenApiMetaProvider */

+	public OpenApiBeanPropertyMeta getOpenApiBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return OpenApiBeanPropertyMeta.DEFAULT;

+		OpenApiBeanPropertyMeta m = openApiBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new OpenApiBeanPropertyMeta(bpm.getDelegateFor(), this);

+			openApiBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
new file mode 100644
index 0000000..812c67f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.plaintext;

+

+import org.apache.juneau.*;

+import org.apache.juneau.plaintext.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the PlainText serializers and parsers pulled from the {@link PlainText @PlainText}

+ * annotation on the bean property.

+ */

+public final class PlainTextBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final PlainTextBeanPropertyMeta DEFAULT = new PlainTextBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).

+	 */

+	public PlainTextBeanPropertyMeta(BeanPropertyMeta bpm, PlainTextMetaProvider plainTextMetaProvider) {

+		super(bpm);

+	}

+

+	private PlainTextBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
new file mode 100644
index 0000000..6c51b02
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.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.plaintext;

+

+import org.apache.juneau.*;

+import org.apache.juneau.plaintext.annotation.*;

+

+/**

+ * Metadata on classes specific to the PlainText serializers and parsers pulled from the {@link PlainText @PlainText} annotation on

+ * the class.

+ */

+public class PlainTextClassMeta extends ExtendedClassMeta {

+

+	private final PlainText plainText;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).

+	 */

+	public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider plainTextMetaProvider) {

+		super(cm);

+		this.plainText = cm.getInfo().getAnnotation(PlainText.class);

+	}

+

+	/**

+	 * Returns the {@link PlainText @PlainText} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected PlainText getAnnotation() {

+		return plainText;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java
new file mode 100644
index 0000000..f54d883
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.plaintext;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link PlainTextClassMeta} and {@link PlainTextBeanPropertyMeta} objects.
+ */
+public interface PlainTextMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	PlainTextClassMeta getPlainTextClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	PlainTextBeanPropertyMeta getPlainTextBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
index 7f7cd69..d6e47f5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.plaintext;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.parser.*;

@@ -39,7 +42,7 @@
  * defined on it.

  */

 @ConfigurableContext

-public class PlainTextParser extends ReaderParser implements PlainTextCommon {

+public class PlainTextParser extends ReaderParser implements PlainTextMetaProvider, PlainTextCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -59,6 +62,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,PlainTextClassMeta> plainTextClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,PlainTextBeanPropertyMeta> plainTextBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -112,6 +118,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* PlainTextMetaProvider */

+	public PlainTextClassMeta getPlainTextClassMeta(ClassMeta<?> cm) {

+		PlainTextClassMeta m = plainTextClassMetas.get(cm);

+		if (m == null) {

+			m = new PlainTextClassMeta(cm, this);

+			plainTextClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* PlainTextMetaProvider */

+	public PlainTextBeanPropertyMeta getPlainTextBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return PlainTextBeanPropertyMeta.DEFAULT;

+		PlainTextBeanPropertyMeta m = plainTextBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new PlainTextBeanPropertyMeta(bpm.getDelegateFor(), this);

+			plainTextBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
index fc9c17a..43c605e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.plaintext;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.serializer.*;

@@ -35,7 +38,7 @@
  * transform defined on it.

  */

 @ConfigurableContext

-public class PlainTextSerializer extends WriterSerializer implements PlainTextCommon {

+public class PlainTextSerializer extends WriterSerializer implements PlainTextMetaProvider, PlainTextCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -55,6 +58,9 @@
 	// Instance

 	//-------------------------------------------------------------------------------------------------------------------

 

+	private final Map<ClassMeta<?>,PlainTextClassMeta> plainTextClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,PlainTextBeanPropertyMeta> plainTextBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -128,6 +134,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* PlainTextMetaProvider */

+	public PlainTextClassMeta getPlainTextClassMeta(ClassMeta<?> cm) {

+		PlainTextClassMeta m = plainTextClassMetas.get(cm);

+		if (m == null) {

+			m = new PlainTextClassMeta(cm, this);

+			plainTextClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* PlainTextMetaProvider */

+	public PlainTextBeanPropertyMeta getPlainTextBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return PlainTextBeanPropertyMeta.DEFAULT;

+		PlainTextBeanPropertyMeta m = plainTextBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new PlainTextBeanPropertyMeta(bpm.getDelegateFor(), this);

+			plainTextBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Other methods

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
new file mode 100644
index 0000000..776c7b9
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.soap;

+

+import org.apache.juneau.*;

+import org.apache.juneau.soap.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the SOAP/XML serializers and parsers pulled from the {@link SoapXml @SoapXml}

+ * annotation on the bean property.

+ */

+public final class SoapXmlBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final SoapXmlBeanPropertyMeta DEFAULT = new SoapXmlBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).

+	 */

+	public SoapXmlBeanPropertyMeta(BeanPropertyMeta bpm, SoapXmlMetaProvider soapXmlMetaProvider) {

+		super(bpm);

+	}

+

+	private SoapXmlBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
new file mode 100644
index 0000000..3c47da9
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.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.soap;

+

+import org.apache.juneau.*;

+import org.apache.juneau.soap.annotation.*;

+

+/**

+ * Metadata on classes specific to the SOAP/XML serializers and parsers pulled from the {@link SoapXml @SoapXml} annotation on

+ * the class.

+ */

+public class SoapXmlClassMeta extends ExtendedClassMeta {

+

+	private final SoapXml soapXml;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).

+	 */

+	public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider soapXmlMetaProvider) {

+		super(cm);

+		this.soapXml = cm.getInfo().getAnnotation(SoapXml.class);

+	}

+

+	/**

+	 * Returns the {@link SoapXml @SoapXml} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected SoapXml getAnnotation() {

+		return soapXml;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java
new file mode 100644
index 0000000..1528965
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.soap;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link SoapXmlClassMeta} and {@link SoapXmlBeanPropertyMeta} objects.
+ */
+public interface SoapXmlMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	SoapXmlClassMeta getSoapXmlClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	SoapXmlBeanPropertyMeta getSoapXmlBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
index 1a7ca6a..7a76b6b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.soap;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.serializer.*;

@@ -31,7 +34,7 @@
  * Essentially the same output as {@link XmlDocSerializer}, except wrapped in a standard SOAP envelope.

  */

 @ConfigurableContext

-public final class SoapXmlSerializer extends XmlSerializer implements SoapXmlCommon {

+public final class SoapXmlSerializer extends XmlSerializer implements SoapXmlMetaProvider,SoapXmlCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -61,6 +64,8 @@
 	//-------------------------------------------------------------------------------------------------------------------

 

 	final String soapAction;

+	private final Map<ClassMeta<?>,SoapXmlClassMeta> soapXmlClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,SoapXmlBeanPropertyMeta> soapXmlBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -104,6 +109,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* SoapXmlMetaProvider */

+	public SoapXmlClassMeta getSoapXmlClassMeta(ClassMeta<?> cm) {

+		SoapXmlClassMeta m = soapXmlClassMetas.get(cm);

+		if (m == null) {

+			m = new SoapXmlClassMeta(cm, this);

+			soapXmlClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* SoapXmlMetaProvider */

+	public SoapXmlBeanPropertyMeta getSoapXmlBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return SoapXmlBeanPropertyMeta.DEFAULT;

+		SoapXmlBeanPropertyMeta m = soapXmlBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new SoapXmlBeanPropertyMeta(bpm.getDelegateFor(), this);

+			soapXmlBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
new file mode 100644
index 0000000..f07afb9
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.uon;

+

+import org.apache.juneau.*;

+import org.apache.juneau.uon.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the UON serializers and parsers pulled from the {@link Uon @Uon}

+ * annotation on the bean property.

+ */

+public final class UonBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final UonBeanPropertyMeta DEFAULT = new UonBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param uonMetaProvider UON metadata provider (for finding information about other artifacts).

+	 */

+	public UonBeanPropertyMeta(BeanPropertyMeta bpm, UonMetaProvider uonMetaProvider) {

+		super(bpm);

+	}

+

+	private UonBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
new file mode 100644
index 0000000..9ee9da7
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.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.uon;

+

+import org.apache.juneau.*;

+import org.apache.juneau.uon.annotation.*;

+

+/**

+ * Metadata on classes specific to the UON serializers and parsers pulled from the {@link Uon @Uon} annotation on

+ * the class.

+ */

+public class UonClassMeta extends ExtendedClassMeta {

+

+	private final Uon uon;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cm The class that this annotation is defined on.

+	 * @param uonMetaProvider Uon metadata provider (for finding information about other artifacts).

+	 */

+	public UonClassMeta(ClassMeta<?> cm, UonMetaProvider uonMetaProvider) {

+		super(cm);

+		this.uon = cm.getInfo().getAnnotation(Uon.class);

+	}

+

+	/**

+	 * Returns the {@link Uon @Uon} annotation defined on the class.

+	 *

+	 * @return The value of the annotation, or <jk>null</jk> if not specified.

+	 */

+	protected Uon getAnnotation() {

+		return uon;

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java
new file mode 100644
index 0000000..b7e6344
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.uon;
+
+import org.apache.juneau.*;
+
+/**
+ * Interface for providing access to {@link UonClassMeta} and {@link UonBeanPropertyMeta} objects.
+ */
+public interface UonMetaProvider extends MetaProvider {
+
+	/**
+	 * Returns the language-specific metadata on the specified class.
+	 *
+	 * @param cm The class to return the metadata on.
+	 * @return The metadata.
+	 */
+	UonClassMeta getUonClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	UonBeanPropertyMeta getUonBeanPropertyMeta(BeanPropertyMeta bpm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
index 68317f1..12296de 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
@@ -13,6 +13,8 @@
 package org.apache.juneau.uon;

 

 import java.lang.reflect.*;

+import java.util.*;

+import java.util.concurrent.*;

 

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

@@ -32,7 +34,7 @@
  * This parser uses a state machine, which makes it very fast and efficient.

  */

 @ConfigurableContext

-public class UonParser extends ReaderParser implements HttpPartParser, UonCommon {

+public class UonParser extends ReaderParser implements HttpPartParser, UonMetaProvider, UonCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -158,6 +160,8 @@
 

 	private final boolean

 		decoding, validateEnd;

+	private final Map<ClassMeta<?>,UonClassMeta> uonClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,UonBeanPropertyMeta> uonBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -258,6 +262,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* UonMetaProvider */

+	public UonClassMeta getUonClassMeta(ClassMeta<?> cm) {

+		UonClassMeta m = uonClassMetas.get(cm);

+		if (m == null) {

+			m = new UonClassMeta(cm, this);

+			uonClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* UonMetaProvider */

+	public UonBeanPropertyMeta getUonBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return UonBeanPropertyMeta.DEFAULT;

+		UonBeanPropertyMeta m = uonBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new UonBeanPropertyMeta(bpm.getDelegateFor(), this);

+			uonBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
index cd2525b..2ba44e4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
@@ -12,6 +12,9 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.uon;

 

+import java.util.*;

+import java.util.concurrent.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

 import org.apache.juneau.httppart.*;

@@ -116,7 +119,7 @@
  * </p>

  */

 @ConfigurableContext

-public class UonSerializer extends WriterSerializer implements HttpPartSerializer, UonCommon {

+public class UonSerializer extends WriterSerializer implements HttpPartSerializer, UonMetaProvider, UonCommon {

 

 	//-------------------------------------------------------------------------------------------------------------------

 	// Configurable properties

@@ -313,6 +316,9 @@
 	private final ParamFormat

 		paramFormat;

 

+	private final Map<ClassMeta<?>,UonClassMeta> uonClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,UonBeanPropertyMeta> uonBeanPropertyMetas = new ConcurrentHashMap<>();

+

 	/**

 	 * Constructor.

 	 *

@@ -413,6 +419,32 @@
 	}

 

 	//-----------------------------------------------------------------------------------------------------------------

+	// Extended metadata

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* UonMetaProvider */

+	public UonClassMeta getUonClassMeta(ClassMeta<?> cm) {

+		UonClassMeta m = uonClassMetas.get(cm);

+		if (m == null) {

+			m = new UonClassMeta(cm, this);

+			uonClassMetas.put(cm, m);

+		}

+		return m;

+	}

+

+	@Override /* UonMetaProvider */

+	public UonBeanPropertyMeta getUonBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return UonBeanPropertyMeta.DEFAULT;

+		UonBeanPropertyMeta m = uonBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new UonBeanPropertyMeta(bpm.getDelegateFor(), this);

+			uonBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
new file mode 100644
index 0000000..324dbd6
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
@@ -0,0 +1,42 @@
+// ***************************************************************************************************************************

+// * 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.urlencoding;

+

+import org.apache.juneau.*;

+import org.apache.juneau.urlencoding.annotation.*;

+

+/**

+ * Metadata on bean properties specific to the URL-Encoding serializers and parsers pulled from the {@link UrlEncoding @UrlEncoding}

+ * annotation on the bean property.

+ */

+public final class UrlEncodingBeanPropertyMeta extends ExtendedBeanPropertyMeta {

+

+	/**

+	 * Default instance.

+	 */

+	public static final UrlEncodingBeanPropertyMeta DEFAULT = new UrlEncodingBeanPropertyMeta();

+

+	/**

+	 * Constructor.

+	 *

+	 * @param bpm The metadata of the bean property of this additional metadata.

+	 * @param urlEncodingMetaProvider URL-Encoding metadata provider (for finding information about other artifacts).

+	 */

+	public UrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm, UrlEncodingMetaProvider urlEncodingMetaProvider) {

+		super(bpm);

+	}

+

+	private UrlEncodingBeanPropertyMeta() {

+		super(null);

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
index e7d5e2c..dd937c7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
@@ -15,9 +15,9 @@
 import org.apache.juneau.*;
 
 /**
- * Interface for providing access to {@link UrlEncodingClassMeta} objects.
+ * Interface for providing access to {@link UrlEncodingClassMeta} and {@link UrlEncodingBeanPropertyMeta} objects.
  */
-public interface UrlEncodingMetaProvider {
+public interface UrlEncodingMetaProvider extends MetaProvider {
 
 	/**
 	 * Returns the language-specific metadata on the specified class.
@@ -26,4 +26,12 @@
 	 * @return The metadata.
 	 */
 	UrlEncodingClassMeta getUrlEncodingClassMeta(ClassMeta<?> cm);
+
+	/**
+	 * Returns the language-specific metadata on the specified bean property.
+	 *
+	 * @param bpm The bean property to return the metadata on.
+	 * @return The metadata.
+	 */
+	UrlEncodingBeanPropertyMeta getUrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm);
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index 2bcd867..23331b3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -114,6 +114,7 @@
 

 	private final boolean expandedParams;

 	private final Map<ClassMeta<?>,UrlEncodingClassMeta> urlEncodingClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,UrlEncodingBeanPropertyMeta> urlEncodingBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -180,6 +181,18 @@
 		return m;

 	}

 

+	@Override /* UrlEncodingMetaProvider */

+	public UrlEncodingBeanPropertyMeta getUrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return UrlEncodingBeanPropertyMeta.DEFAULT;

+		UrlEncodingBeanPropertyMeta m = urlEncodingBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new UrlEncodingBeanPropertyMeta(bpm.getDelegateFor(), this);

+			urlEncodingBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

 	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index c25aa20..32ee9b2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -253,6 +253,7 @@
 	private final boolean

 		expandedParams;

 	private final Map<ClassMeta<?>,UrlEncodingClassMeta> urlEncodingClassMetas = new ConcurrentHashMap<>();

+	private final Map<BeanPropertyMeta,UrlEncodingBeanPropertyMeta> urlEncodingBeanPropertyMetas = new ConcurrentHashMap<>();

 

 	/**

 	 * Constructor.

@@ -351,6 +352,18 @@
 		return m;

 	}

 

+	@Override /* UrlEncodingMetaProvider */

+	public UrlEncodingBeanPropertyMeta getUrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm) {

+		if (bpm == null)

+			return UrlEncodingBeanPropertyMeta.DEFAULT;

+		UrlEncodingBeanPropertyMeta m = urlEncodingBeanPropertyMetas.get(bpm);

+		if (m == null) {

+			m = new UrlEncodingBeanPropertyMeta(bpm.getDelegateFor(), this);

+			urlEncodingBeanPropertyMetas.put(bpm, m);

+		}

+		return m;

+	}

+

 	//-----------------------------------------------------------------------------------------------------------------

 	// Properties

 	//-----------------------------------------------------------------------------------------------------------------

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
index 668763a..b0082db 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
@@ -17,7 +17,7 @@
 /**
  * Interface for providing access to {@link XmlClassMeta}, {@link XmlBeanMeta}, and {@link XmlBeanPropertyMeta} objects.
  */
-public interface XmlMetaProvider {
+public interface XmlMetaProvider extends MetaProvider  {
 
 	/**
 	 * Returns the language-specific metadata on the specified class.