X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsal%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fmatch%2FMatch.java;fp=opendaylight%2Fsal%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fmatch%2FMatch.java;h=a00c3dcb3422d6e20c619bd35d616b62fb6bbab3;hp=910695c1e9cbc0ebcfb121b621fb7187305aff37;hb=a37de3862829ea430f032662a457efeb835d9b43;hpb=e062c06cd7ca669e3fc2200a43c11c5ed3b20f04 diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java index 910695c1e9..a00c3dcb34 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -15,18 +14,22 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentHashMap; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.utils.EtherTypes; import org.opendaylight.controller.sal.utils.IPProtocols; import org.opendaylight.controller.sal.utils.NetUtils; @@ -52,7 +55,9 @@ public class Match implements Cloneable, Serializable { reversableMatches = Collections.unmodifiableMap(map); } private Map fields; - private int matches; // concise way to tell which fields the match is set for (may remove if not needed) + private int matches; // concise way to tell which fields the match + // is set for (may remove if not needed) + private ConcurrentMap props; public Match() { fields = new HashMap(); @@ -64,6 +69,81 @@ public class Match implements Cloneable, Serializable { matches = match.matches; } + /** + * Gets the list of metadata currently registered with this match + * + * @return List of metadata currently registered + */ + public List 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(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(); + } + + 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 + } + /** * Generic setter for frame/packet/message's header fields against which to match * Note: For MAC addresses, please pass the cloned value to this function