content: /**
   * JBoss, Home of Professional Open Source
   * Copyright Red Hat, Inc., and individual contributors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.jboss.aerogear.unifiedpush.message.configuration;
  
  import org.jboss.aerogear.unifiedpush.api.validation.DeviceTokenValidator;
  import org.jboss.aerogear.unifiedpush.message.sender.PushNotificationSender;
  
  /**
   * Push Network specific configuration for UPS message sending mechanism.
   *
   * Allows to configure how are messages loaded and treated inside of UPS messaging system.
   *
   * Configurations for Push Networks are loaded by {@link SenderConfigurationProvider}.
   *
   * @see SenderConfigurationProvider
   */
  public class SenderConfiguration {
  
      private int batchesToLoad;
      private int batchSize;
  
      public SenderConfiguration() {
      }
  
      /**
       * Creates a new configuration with the configuration values provided
       *
       * @param batchesToLoad specifies how many batches should be loaded in one transaction (see {@link #batchesToLoad()}
       * @param batchSize specifies how many devices will be loaded and delivered in one batch (see {@link #batchSize()}
       */
      public SenderConfiguration(int batchesToLoad, int batchSize) {
          this.batchesToLoad = batchesToLoad;
          this.batchSize = batchSize;
      }
  
      /**
       * Specifies how many batches should be loaded in one token-loading transaction.
       *
       * UPS splits device tokens loaded from database into batches and loads at most {@link #batchesToLoad()} in one transaction.
       *
       * This avoids long transactions and enables fail-over procedures.
       *
       * @return the number of batches to load
       */
      public int batchesToLoad() {
          return batchesToLoad;
      }
  
      void setBatchesToLoad(int batchesToLoad) {
          this.batchesToLoad = batchesToLoad;
      }
  
      /**
       * Batch size specifies how many devices will be loaded and delivered in one batch.
       *
       * One batch is a unit of work for the final {@link PushNotificationSender} implementation.
       *
       * Smaller batches allows better fail-over, but can be unfriendly to the Push Network, since it has to allow UPS establish more connections.
       *
       * Larger batches allows for more effective communication, however you must be aware of memory limits configured for UPS message queues.
       *
       * One device token theoretically requires 2 * (upper-bound limit of its length) bytes of memory.
       * The minimum or maximum lengths of specific push networks are partially listed in {@link DeviceTokenValidator}.
       *
       * @return the size (number of device tokens) of the batch
       */
      public int batchSize() {
          return batchSize;
      }
  
      void setBatchSize(int batchSize) {
          this.batchSize = batchSize;
      }
  
      /**
       * This is a derived property, computed as a product of {@link #batchesToLoad()} and {@link #batchSize()}.
       *
       * It configures how many tokens will be loaded in one token-loading transaction.
       *
       * @return int value, computed as a product of {@link #batchesToLoad()} and {@link #batchSize()}.
       */
      public int tokensToLoad() {
          return batchesToLoad * batchSize;
      }
  }
  