private void pushChannel(
      IPushChannel channel, IPreferences prefs, Notification notification, boolean ignoreFrequency)
      throws PushException, RenderException {

    IPushChannelPreferences cPrefs = prefs.getChannelPrefs().get(channel.getId());
    if (cPrefs == null) {
      cPrefs = channel.newDefaultPreferences();
      if (cPrefs == null) {
        // don't flood user after he configures this channel
        throw new PushException("channel not configured for user", false);
      }
    }

    if (!channel.getNotificationTypes().contains(notification.getType())) {
      // channel not applicable for type
      throw new PushException("channel not applicable for type " + notification.getType(), false);
    }

    Dispatch dispatch = _dispatchService.create(notification, prefs, cPrefs);

    if (!channel.isConfigured(dispatch.getParams())) {
      // don't flood user after he configures this channel
      throw new PushException("channel not configured for user", false);
    }

    if (!ignoreFrequency && !Frequency.INSTANT.equals(cPrefs.getFrequency())) {
      // temporary as other dispatcher will handle this
      throw new PushException("channel not configured for this frequency", true);
    }

    channel.push(dispatch);
  }
 @Override
 public Map<String, IPushChannelPreferences> newDefaultPreferences() {
   Map<String, IPushChannelPreferences> map = Maps.newHashMap();
   for (IPushChannel channel : _pushChannels) {
     IPushChannelPreferences cPrefs = channel.newDefaultPreferences();
     if (cPrefs != null) {
       map.put(channel.getId(), cPrefs);
     }
   }
   return map;
 }