Class ChannelId


  • public class ChannelId
    extends Object

    Reification of a channel id with methods to test properties and compare with other ChannelIds.

    A ChannelId breaks the channel id into path segments so that, for example, /foo/bar breaks into ["foo","bar"].

    ChannelId can be wild, when they end with one or two wild characters "*"; a ChannelId is shallow wild if it ends with one wild character (for example /foo/bar/*) and deep wild if it ends with two wild characters (for example /foo/bar/**).

    ChannelId can be a template, when a segment contains variable names surrounded by braces, for example /foo/{var_name}. Variable names can only be made of characters defined by the \w regular expression character class.

    • Constructor Detail

      • ChannelId

        public ChannelId​(String id)
        Constructs a new ChannelId with the given id
        Parameters:
        id - the channel id in string form
    • Method Detail

      • getId

        public String getId()

        Returns the normalized channel id string.

        Normalization involves trimming white spaces and removing trailing slashes.

        Returns:
        the normalized channel id string
      • isShallowWild

        public boolean isShallowWild()

        Shallow wild ChannelIds end with a single wild character "*" and match non wild channels with the same depth.

        Example: /foo/* matches /foo/bar, but not /foo/bar/baz.

        Returns:
        whether this ChannelId is a shallow wild channel id
      • isDeepWild

        public boolean isDeepWild()

        Deep wild ChannelIds end with a double wild character "**" and match non wild channels with the same or greater depth.

        Example: /foo/** matches /foo/bar and /foo/bar/baz.

        Returns:
        whether this ChannelId is a deep wild channel id
      • isMeta

        public boolean isMeta()

        A ChannelId is a meta ChannelId if it starts with "/meta/".

        Returns:
        whether the first segment is "meta"
      • isService

        public boolean isService()

        A ChannelId is a service ChannelId if it starts with "/service/".

        Returns:
        whether the first segment is "service"
      • isBroadcast

        public boolean isBroadcast()
        Returns:
        whether this ChannelId is neither meta nor service
      • isTemplate

        public boolean isTemplate()
        Returns:
        whether this ChannelId is a template, that is it contains segments that identify a variable name between braces, such as /foo/{var_name}.
        See Also:
        bind(ChannelId), getParameters()
      • getParameters

        public List<String> getParameters()
        Returns:
        the list of variable names if this ChannelId is a template, otherwise an empty list.
        See Also:
        isTemplate()
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class Object
      • matches

        public boolean matches​(ChannelId channelId)

        Tests whether this ChannelId matches the given ChannelId.

        If the given ChannelId is wild, then it matches only if it is equal to this ChannelId.

        If this ChannelId is non-wild, then it matches only if it is equal to the given ChannelId.

        Otherwise, this ChannelId is either shallow or deep wild, and matches ChannelIds with the same number of equal segments (if it is shallow wild), or ChannelIds with the same or a greater number of equal segments (if it is deep wild).

        Parameters:
        channelId - the channelId to match
        Returns:
        true if this ChannelId matches the given ChannelId
      • bind

        public Map<String,​String> bind​(ChannelId target)

        If this ChannelId is a template, and the given target ChannelId is non-wild and non-template, and the two have the same depth(), then binds the variable(s) defined in this template with the values of the segments defined by the target ChannelId.

        For example:

         // template and target match.
         Map<String, String> bindings = new ChannelId("/a/{var1}/c/{var2}").bind(new ChannelId("/a/foo/c/bar"));
         bindings: {"var1": "foo", "var2": "bar"}
        
         // template has 2 segments, target has only 1 segment.
         bindings = new ChannelId("/a/{var1}").bind(new ChannelId("/a"))
         bindings = {}
        
         // template has 2 segments, target too many segments.
         bindings = new ChannelId("/a/{var1}").bind(new ChannelId("/a/b/c"))
         bindings = {}
        
         // same number of segments, but no match on non-variable segments.
         bindings = new ChannelId("/a/{var1}").bind(new ChannelId("/b/c"))
         bindings = {}
         

        The returned map may not preserve the order of variables present in the template ChannelId.

        Parameters:
        target - the non-wild, non-template ChannelId to bind
        Returns:
        a map withe the bindings, or an empty map if no binding was possible
        See Also:
        isTemplate()
      • depth

        public int depth()
        Returns:
        how many segments this ChannelId is made of
        See Also:
        getSegment(int)
      • isAncestorOf

        public boolean isAncestorOf​(ChannelId id)
        Parameters:
        id - the channel to test
        Returns:
        whether this ChannelId is an ancestor of the given ChannelId
        See Also:
        isParentOf(ChannelId)
      • isParentOf

        public boolean isParentOf​(ChannelId id)
        Parameters:
        id - the channel to test
        Returns:
        whether this ChannelId is the parent of the given ChannelId
        See Also:
        isAncestorOf(ChannelId)
      • getParent

        public String getParent()
        Returns:
        the channel string parent of this ChannelId, or null if this ChannelId has only one segment
        See Also:
        isParentOf(ChannelId)
      • getSegment

        public String getSegment​(int i)
        Parameters:
        i - the segment index
        Returns:
        the i-nth segment of this channel, or null if no such segment exist
        See Also:
        depth()
      • getWilds

        public List<String> getWilds()
        Returns:
        The list of wilds channels that match this channel, or the empty list if this channel is already wild.
      • getRegularPart

        public String getRegularPart()

        Returns the regular part of this ChannelId: the part of the channel id from the beginning until the first occurrence of a parameter or a wild character.

        Examples:

        ChannelId.regularPart Examples
        Channel Regular Part
        /foo /foo
        /foo/* /foo
        /foo/bar/** /foo/bar
        /foo/{p} /foo
        /foo/bar/{p} /foo/bar
        /* null
        /** null
        /{p} null
        Returns:
        the regular part of this channel
      • isMeta

        public static boolean isMeta​(String channelId)

        Helper method to test if the string form of a ChannelId represents a meta ChannelId.

        Parameters:
        channelId - the channel id to test
        Returns:
        whether the given channel id is a meta channel id
      • isService

        public static boolean isService​(String channelId)

        Helper method to test if the string form of a ChannelId represents a service ChannelId.

        Parameters:
        channelId - the channel id to test
        Returns:
        whether the given channel id is a service channel id
      • isBroadcast

        public static boolean isBroadcast​(String channelId)

        Helper method to test if the string form of a ChannelId represents a broadcast ChannelId.

        Parameters:
        channelId - the channel id to test
        Returns:
        whether the given channel id is a broadcast channel id