+ /**
+ * Gets the list of metadata currently registered with this match
+ *
+ * @return List of metadata currently registered
+ */
+ public List <Property> getMetadatas() {
+ if (this.props != null) {
+ // Return all the values in the map
+ Collection res = this.props.values();
+ if (res == null) {
+ return Collections.emptyList();
+ }
+ return new ArrayList<Property>(res);
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * Gets the metadata registered with a name if present
+ *
+ * @param name the name of the property to be extracted
+ *
+ * @return List of metadata currently registered
+ */
+ public Property getMetadata(String name) {
+ if (name == null) {
+ return null;
+ }
+ if (this.props != null) {
+ // Return the Property associated to the name
+ return this.props.get(name);
+ }
+ return null;
+ }
+
+ /**
+ * Sets the metadata associated to a name. If the name or prop is NULL,
+ * an exception NullPointerException will be raised.
+ *
+ * @param name the name of the property to be set
+ * @param prop, property to be set
+ */
+ public void setMetadata(String name, Property prop) {
+ if (this.props == null) {
+ props = new ConcurrentHashMap<String, Property>();
+ }
+
+ if (this.props != null) {
+ this.props.put(name, prop);
+ }
+ }
+
+ /**
+ * Remove the metadata associated to a name. If the name is NULL,
+ * nothing will be removed.
+ *
+ * @param name the name of the property to be set
+ * @param prop, property to be set
+ *
+ * @return List of metadata currently registered
+ */
+ public void removeMetadata(String name) {
+ if (this.props == null) {
+ return;
+ }
+
+ if (this.props != null) {
+ this.props.remove(name);
+ }
+ // It's intentional to keep the this.props still allocated
+ // till the parent data structure will be alive, so to avoid
+ // unnecessary allocation/deallocation, even if it's holding
+ // nothing
+ }
+