code: public void addChannel(
              T channel,
              String functionalityName,
              String requesterID,
              String conversationID)
      {
          T oldCh = null;
          synchronized (this.channelsWithId)
          {
              oldCh = this.channelsWithId.get(calculateId(functionalityName, requesterID, conversationID));
              this.channelsWithId.put(calculateId(functionalityName, requesterID, conversationID), channel);
          }
          synchronized (this.channelsWithFunctionalityName)
          {
              Collection<T> channelsForFunctionalityName = this.channelsWithFunctionalityName.get(functionalityName);
              if (null == channelsForFunctionalityName)
              {
                  channelsForFunctionalityName = new ArrayList<T>();
              }
              // channels are stored in
              if (null != oldCh)
              {
                  channelsForFunctionalityName.remove(oldCh);
              }
              channelsForFunctionalityName = this.removeInternalChannels(channelsForFunctionalityName);
              channelsForFunctionalityName.add(channel);
              this.channelsWithFunctionalityName.put(functionalityName, channelsForFunctionalityName);
          }
      }
docs: /*
  Adds a channel with identification.
  @requesterID and @conversationID are optional.