Source: subscriber/subscriber.js

/**
 * This module represents a Subscriber.
 * 
 * @module Subscriber
 */
define(['attributeList', 'callbackList', 'condition', 'conditionList'],
 	function(AttributeList, CallbackList, Condition, ConditionList)  {
		return (function() {
			/**
			 * Constructor: Initializes the subscriptionCallbacks, subscriptionCallbacks and conditions.
			 *
			 * @classdesc Subscriber defines the name and the ID of the Subscriber and the Callbacks (with possible restrictions) what the subscriber is interested in.
			 * @constructs Subscriber
			 */
			function Subscriber() {
				/**
				 * Name of the subscriber.
				 *
				 * @type {string}
				 * @private
				 */
				this._subscriberName = '';

				/**
				 * ID of the Subscriber.
				 *
				 * @private
				 * @type {string}
				 */
				this._subscriberId = '';

				/**
				 * Callbacks that should be subscribed.
				 *
				 * @private
				 * @type {CallbackList}
				 */
				this._subscriptionCallbacks = new CallbackList();

				/**
				 * Restricts the associated Attributes of the callback to a subset
				 * 		(i.e: the subscriber wants a subset from the available the context data).
				 * 		If no attributes are specified, all available attributes will returned.
				 *
				 * @private
				 * @type {AttributeList}
				 */
				this._attributesSubset = new AttributeList();

				/**
				 * Defines special conditions for notification.
				 *
				 * @private
				 * @type {ConditionList}
				 */
				this._conditions = new ConditionList();

				return this;
			}

			/**
			 * Builder for subscriberName.
			 *
			 * @param {String} subscriberName subscriberName
			 * @returns {Subscriber}
			 */
			Subscriber.prototype.withSubscriberName = function(subscriberName) {
				this.setSubscriberName(subscriberName);
				return this;
			};

			/**
			 * Builder for subscriberId.
			 *
			 * @param {String} subscriberId subscriberId
			 * @returns {Subscriber}
			 */
			Subscriber.prototype.withSubscriberId = function(subscriberId) {
				this.setSubscriberId(subscriberId);
				return this;
			};

			/**
			 * Builder for subscriptionCallbacks.
			 *
			 * @param {CallbackList} subscriptionCallbacks subscriptionCallbacks
			 * @returns {Subscriber}
			 */
			Subscriber.prototype.withSubscriptionCallbacks = function(subscriptionCallbacks) {
				this.setSubscriptionCallbacks(subscriptionCallbacks);
				return this;
			};

			/**
			 * Builder for attributesSubset.
			 *
			 * @param {AttributeList} attributesSubset attributesSubset
			 * @returns {Subscriber}
			 */
			Subscriber.prototype.withAttributesSubset = function(attributesSubset) {
				this.setAttributesSubset(attributesSubset);
				return this;
			};

			/**
			 * Builder for conditions.
			 *
			 * @param {(ConditionList|Array)} conditionListOrArray conditions
			 * @returns {Subscriber}
			 */
			Subscriber.prototype.withConditions = function(conditionListOrArray) {
				this.setConditions(conditionListOrArray);
				return this;
			};

			/**
			 * Returns the name.
			 *
			 * @returns {string}
			 */
			Subscriber.prototype.getSubscriberName = function() {
				return this._subscriberName;
			};

			/**
			 * Sets the setSubscriberName.
			 *
			 * @param {string} subscriberName subscriberName
			 */
			Subscriber.prototype.setSubscriberName = function(subscriberName) {
				if(typeof subscriberName === 'string'){
					this._subscriberName = subscriberName;
				}
			};

			/**
			 * Returns the subscriberId.
			 *
			 * @returns {string}
			 */
			Subscriber.prototype.getSubscriberId = function() {
				return this._subscriberId;
			};

			/**
			 * Sets the subscriberId.
			 *
			 * @param {string} subscriberId subscriberId
			 */
			Subscriber.prototype.setSubscriberId = function(subscriberId){
				if(typeof subscriberId === 'string'){
					this._subscriberId = subscriberId;
				}
			};

			/**
			 * Returns the subscriptionCallbacks.
			 *
			 * @returns {CallbackList}
			 */
			Subscriber.prototype.getSubscriptionCallbacks = function() {
				return this._subscriptionCallbacks;
			};

			/**
			 * Sets the subscriptionCallbacks.
			 *
			 * @param {CallbackList} subscriptionCallbacks subscriptionCallbacks
			 */
			Subscriber.prototype.setSubscriptionCallbacks = function(subscriptionCallbacks) {
				if(subscriptionCallbacks.constructor === CallbackList) {
					this._subscriptionCallbacks = subscriptionCallbacks;
				}
			};

			/**
			 * Returns the attributesSubset.
			 *
			 * @returns {string}
			 */
			Subscriber.prototype.getAttributesSubset = function() {
				return this._attributesSubset;
			};

			/**
			 * Sets the attributesSubset.
			 *
			 * @param {AttributeList} attributesSubset attributesSubset
			 */
			Subscriber.prototype.setAttributesSubset = function(attributesSubset){
				if(attributesSubset && attributesSubset.constructor === AttributeList) {
					this._attributesSubset = attributesSubset;
				}
			};

			/**
			 * Returns the conditions.
			 *
			 * @returns {string}
			 */
			Subscriber.prototype.getConditions = function() {
				return this._conditions;
			};

			/**
			 * Sets the conditions.
			 *
			 * @param {(ConditionList|Array)} conditionListOrArray conditions
			 */
			Subscriber.prototype.setConditions = function(conditionListOrArray) {
				var list = [];
				if(conditionListOrArray instanceof Array){
					list = conditionListOrArray;
				} else if (conditionListOrArray && conditionListOrArray.constructor === ConditionList) {
					list = conditionListOrArray.getItems();
				}
				for(var i in list) {
					this.addCondition(list[i]);
				}
			};

			/**
			 * Adds a condition.
			 *
			 * @param {Condition} condition Condition
			 */
			Subscriber.prototype.addCondition = function(condition) {
				if (condition.constructor === Condition) {
					if (!this._conditions.contains(condition)) {
						this._conditions.put(condition);
					}
				}
			};

			/**
			 * Removes a condition.
			 *
			 * @param {Condition} condition Condition
			 */
			Subscriber.prototype.removeCondition = function(condition) {
				if (condition.constructor === Condition) {
					this._conditions.removeItem(condition);
				}
			};

			/**
			 * Compares this instance with the given one.
			 *
			 * @param {Subscriber} subscriber Subscriber that should be compared.
			 * @returns {boolean}
			 */
			Subscriber.prototype.equals = function(subscriber) {
				if(subscriber.constructor === Subscriber){
					if(subscriber.getSubscriberName() == this.getSubscriberName()
						&& subscriber.getSubscriberId() == this.getSubscriberId()
						&& subscriber.getSubscriptionCallbacks().equals(this.getSubscriptionCallbacks())
						&& subscriber.getAttributesSubset().equals(this.getAttributesSubset())
						&& subscriber.getConditions().equals(this.getConditions())){
						return true;
					}
				}
				return false;
			};

			return Subscriber;
		})();
	}
);