tigase.server.sreceiver

## Class StanzaReceiver

- java.lang.Object
- - tigase.server.BasicComponent
  - - tigase.server.AbstractMessageReceiver
    - - tigase.server.sreceiver.StanzaReceiver

- All Implemented Interfaces:
    ClusteredComponentIfc, Configurable, XMPPService, MessageReceiver, ServerComponent, StanzaReceiverIfc, StatisticsContainer, StatisticsContainerIfc, VHostListener

      public class StanzaReceiver
      extends AbstractMessageReceiver
      implements Configurable, XMPPService, StanzaReceiverIfc

  This is a sibling to `StanzaSender` class and offers just an opposite functionality. It can receive XMPP packets to do something with them. And what to do it depends on the destination address. Destination address points to certain receiver task and this is up to task to decide what to do with the stanza. Task address is just a usual Jabber ID: task-short-name@srec.tigase.org.

  Like public chat rooms in MUC tasks can be preconfigured in the `StanzaReceiver` configuration or can be created on demand using `ad-hoc` commands and `service-discovery`. User can subscribe to some tasks and can add them to the roster just like a normal contacts. This allows to use the functionality from all existing clients without implementing any special protocols or extensions.

  Possible tasks are:

  - Interests groups - simple stanza (message) distribution to a group of interested ppl. To receive this information user has to subscribe to the task first. It is a bit like a MUC without a chat room or like a mailing list.
  - Persistent storage - which is like an archive of some information for group of ppl.
  - Web page publishing - this might be useful for web sites with kind of Short, instant news board where selected users can send information and they are published instantly. (Through the database for example.)
  - Forums integration - this might be useful for kind of forums where you can post messages from Web site as well as from your Jabber client.
  Task creation parameters:
  - Task short name - the nick name of the task which is used to create Jabber ID for the task.
  - Task description - description of the task what is the purpose of the task.
  - Task type - the server, through `ad-hoc` commands should present available tasks types which can be created. User can select a task to create. There may be some restrictions on tasks creation like certain types can be created only by server administrator or some tasks types can be created only once on single server and so on.
  - Subscription list - server admin should be able to add list of users who might be interested in subscription to the task. After task is created `subscribe` presence is sent to these users and they can accept the subscription or not.
  - Subscription restrictions - who may subscribe to the task like: public task - anybody can subscribe, local users only - users from the local server (domain) only can subscribe, by regex - regular expression matching JIDs, moderated subscription - anybody may request subscription but the creator of the task must approve the subscription.
  - On line only - the task may distribute packets to online users only.
  - Replace sender address - whether sender address should be replaced with task address. This might be useful depending where the responses should go. If the list is kind on announces board like new version release then maybe replies should go to the sender. If this is more like topic discussion group then the reply should go to all subscribers.
  - Message type - whether messages should be distributed as a `chat`, `headline` or `normal`.
  - Who can post - who can send a message for processing, possible options are: `all`, `subscribed`, `owner`, `list`
  There can be also some per task specific settings...
  Created: Wed May 9 08:27:22 2007
  Version:
    $Rev$
  Author:
    Artur Hefczyc

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `MY_DOMAIN_NAME_PROP_KEY` Field description
    `static String` | `MY_DOMAIN_NAME_PROP_VAL` Field description

    - ### Fields inherited from class tigase.server.AbstractMessageReceiver

      `HOUR, INCOMING_FILTERS_PROP_KEY, INCOMING_FILTERS_PROP_VAL, MAX_QUEUE_SIZE_PROP_KEY, MAX_QUEUE_SIZE_PROP_VAL, maxInQueueSize, maxOutQueueSize, maxQueueSize, MINUTE, OUTGOING_FILTERS_PROP_KEY, OUTGOING_FILTERS_PROP_VAL, PACKET_DELIVERY_RETRY_COUNT_PROP_KEY, SCHEDULER_THREADS_PROP_KEY, SECOND`

    - ### Fields inherited from class tigase.server.BasicComponent

      `ALL_PROP_KEY, COMMAND_PROP_NODE, scriptCommands, SCRIPTS_DIR_PROP_DEF, SCRIPTS_DIR_PROP_KEY, trusted, vHostManager`

    - ### Fields inherited from interface tigase.conf.Configurable

      `ADMINS_PROP_KEY, AMP_CLASS_NAME, AMP_CLUST_CLASS_NAME, AUTH_DOMAIN_POOL_CLASS, AUTH_REPO_DOMAINS_PROP_KEY, AUTH_REPO_PARAMS_NODE, AUTH_REPO_POOL_CLASS, AUTH_REPO_URL_PROP_KEY, BOSH_CLUST_COMP_CLASS_NAME, BOSH_COMP_CLASS_NAME, C2S_CLUST_COMP_CLASS_NAME, C2S_COMP_CLASS_NAME, CL_COMP_CLASS_NAME, CLUSTER_CONECT, CLUSTER_CONTR_CLASS_NAME, CLUSTER_LISTEN, CLUSTER_MODE, CLUSTER_NODES, CLUSTER_NODES_PROP_KEY, COMP_PROT_CLASS_NAME, COMPONENT_ID_PROP_KEY, DEF_AMP_NAME, DEF_BOSH_NAME, DEF_C2S_NAME, DEF_CL_COMP_NAME, DEF_CLUST_CONTR_NAME, DEF_COMP_PROT_NAME, DEF_EVENTBUS_NAME, DEF_EXT_COMP_NAME, DEF_HOSTNAME_PROP_KEY, DEF_MONITOR_NAME, DEF_S2S_NAME, DEF_SM_NAME, DEF_SRECV_NAME, DEF_SSEND_NAME, DEF_STATS_NAME, DEF_VHOST_MAN_NAME, DEF_WS2S_NAME, DERBY_REPO_CLASS_PROP_VAL, DERBY_REPO_URL_PROP_VAL, DRUPAL_REPO_URL_PROP_VAL, DRUPALWP_REPO_CLASS_PROP_VAL, DUMMY_REPO_CLASS_PROP_VAL, EVENTBUS_CLASS_NAME, EXT_COMP_CLASS_NAME, GEN_ADMINS, GEN_AUTH_DB, GEN_AUTH_DB_URI, GEN_COMP_CLASS, GEN_COMP_NAME, GEN_CONF, GEN_CONFIG, GEN_CONFIG_ALL, GEN_CONFIG_COMP, GEN_CONFIG_CS, GEN_CONFIG_DEF, GEN_CONFIG_SM, GEN_DEBUG, GEN_DEBUG_PACKAGES, GEN_EXT_COMP, GEN_MAX_QUEUE_SIZE, GEN_SCRIPT_DIR, GEN_SM_PLUGINS, GEN_SREC_ADMINS, GEN_SREC_DB, GEN_SREC_DB_URI, GEN_TEST, GEN_TRUSTED, GEN_USER_DB, GEN_USER_DB_URI, GEN_USER_DB_URI_PROP_KEY, GEN_VIRT_HOSTS, HOSTNAMES_PROP_KEY, LIBRESOURCE_REPO_CLASS_PROP_VAL, LIBRESOURCE_REPO_URL_PROP_VAL, MONITOR_CLASS_NAME, MONITOR_CLUST_CLASS_NAME, MONITORING, MYSQL_REPO_CLASS_PROP_VAL, MYSQL_REPO_URL_PROP_VAL, PGSQL_REPO_CLASS_PROP_VAL, PGSQL_REPO_URL_PROP_VAL, ROUTER_COMP_CLASS_NAME, S2S_CLUST_COMP_CLASS_NAME, S2S_COMP_CLASS_NAME, SHARED_AUTH_REPO_PARAMS_PROP_KEY, SHARED_AUTH_REPO_PROP_KEY, SHARED_USER_REPO_PARAMS_PROP_KEY, SHARED_USER_REPO_PROP_KEY, SM_CLUST_COMP_CLASS_NAME, SM_COMP_CLASS_NAME, SRECV_COMP_CLASS_NAME, SSEND_COMP_CLASS_NAME, STANZA_WHITE_CHAR_ACK, STANZA_XMPP_ACK, STATS_CLASS_NAME, STRINGPREP_PROCESSOR, TIGASE_AUTH_REPO_CLASS_PROP_VAL, TIGASE_AUTH_REPO_URL_PROP_VAL, TIGASE_CUSTOM_AUTH_REPO_CLASS_PROP_VAL, TRUSTED_PROP_KEY, USER_DOMAIN_POOL_CLASS, USER_REPO_DOMAINS_PROP_KEY, USER_REPO_PARAMS_NODE, USER_REPO_POOL_CLASS, USER_REPO_POOL_SIZE, USER_REPO_POOL_SIZE_PROP_KEY, USER_REPO_URL_PROP_KEY, VHOST_MAN_CLASS_NAME, VHOST_MAN_CLUST_CLASS_NAME, WS2S_CLASS_NAME, WS2S_CLUST_CLASS_NAME, XML_REPO_CLASS_PROP_VAL, XML_REPO_URL_PROP_VAL, XMPP_STANZA_ACK`

    - ### Fields inherited from interface tigase.disco.XMPPService

      `CMD_FEATURES, DEF_FEATURES, INFO_XMLNS, ITEMS_XMLNS`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `StanzaReceiver()` Constructs ...

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `addOutPacket(Packet packet)`
    `protected void` | `addTaskInstance(ReceiverTaskIfc task)` Describe `addTaskInstance` method here.
    `protected void` | `addTaskInstance(String task_type, String task_name, Map<String,Object> task_params)`
    `Map<String,Object>` | `getDefaults(Map<String,Object> params)` Returns default configuration settings for the component as a `Map` with keys as configuration property IDs and values as the configuration property values.
    `List<Element>` | `getDiscoFeatures(JID from)` Returns features for top level disco info
    `Element` | `getDiscoInfo(String node, JID jid, JID from)` Returns service discovery info for the component.
    `List<Element>` | `getDiscoItems(String node, JID jid, JID from)` Returns service discovery items for the component.
    `void` | `getStatistics(StatisticsList list)` Method returns component statistics.
    `ReceiverTaskIfc` | `getTask(String jidOrName)` Method description
    `protected Map<String,ReceiverTaskIfc>` | `getTaskInstances()`
    `protected Map<String,TaskType>` | `getTaskTypes()`
    `boolean` | `isAdmin(JID jid)` Method description
    `protected boolean` | `isAllowedCreate(JID jid, String task_type)`
    `void` | `processPacket(Packet packet)` This is the main `Packet` processing method.
    `protected void` | `removeTaskInstance(ReceiverTaskIfc task)`
    `protected void` | `removeTaskSubscribers(ReceiverTaskIfc task, JID... subscr)`
    `protected void` | `saveTaskToRepository(ReceiverTaskIfc task)`
    `void` | `setProperties(Map<String,Object> props)` Sets all configuration properties for the object.

    - ### Methods inherited from class tigase.server.AbstractMessageReceiver

      `addOutPacketNB, addOutPackets, addOutPacketWithTimeout, addPacket, addPacketNB, addPackets, addRegexRouting, addTimerTask, addTimerTask, addTimerTask, addTimerTask, addTimerTask, addTimerTaskWithTimeout, addTimerTaskWithTimeout, clearRegexRoutings, everyHour, everyMinute, everySecond, getMaxQueueSize, getRegexRoutings, hashCodeForPacket, isInRegexRoutings, newPacketId, processingInThreads, processingOutThreads, processingThreads, processOutPacket, processPacket, release, removeRegexRouting, schedulerThreads, setMaxQueueSize, setName, setParent, start, stop`

    - ### Methods inherited from class tigase.server.BasicComponent

      `addComponentDomain, canCallCommand, checkCommandAcl, getComponentId, getComponentInfo, getDefHostName, getDefVHostItem, getDiscoCategory, getDiscoCategoryType, getDiscoDescription, getDiscoFeatures, getDiscoInfo, getDiscoItems, getName, getNodesConnected, getNodesConnectedWithLocal, getScriptCommands, getScriptItems, getServiceEntity, getVHostItem, handlesLocalDomains, handlesNameSubdomains, handlesNonLocalDomains, initBindings, initializationCompleted, isInitializationComplete, isLocalDomain, isLocalDomainOrComponent, isNonAdminCommands, isSubdomain, isTrusted, isTrusted, nodeConnected, nodeDisconnected, onNodeConnected, onNodeDisconnected, processScriptCommand, removeComponentDomain, removeServiceDiscoveryItem, setClusterController, setVHostManager, updateServiceDiscoveryItem, updateServiceDiscoveryItem, updateServiceDiscoveryItem, updateServiceEntity`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface tigase.server.ServerComponent

      `getComponentId, getComponentInfo, getName, initializationCompleted, isInitializationComplete, processPacket, release, setName`

    - ### Methods inherited from interface tigase.server.sreceiver.StanzaReceiverIfc

      `getDefHostName, getName`

    - ### Methods inherited from interface tigase.stats.StatisticsContainerIfc

      `getName`

    - ### Methods inherited from interface tigase.server.MessageReceiver

      `getDefHostName`

- - ### Field Detail

    - #### MY_DOMAIN_NAME_PROP_KEY

          public static final String MY_DOMAIN_NAME_PROP_KEY

      Field description
      See Also:
        Constant Field Values

    - #### MY_DOMAIN_NAME_PROP_VAL

          public static final String MY_DOMAIN_NAME_PROP_VAL

      Field description
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### StanzaReceiver

          public StanzaReceiver()

      Constructs ...

  - ### Method Detail

    - #### addOutPacket

          public boolean addOutPacket(Packet packet)

      Specified by:
        `addOutPacket` in interface `StanzaReceiverIfc`
      Overrides:
        `addOutPacket` in class `AbstractMessageReceiver`

    - #### getDefaults

          public Map<String,Object> getDefaults(Map<String,Object> params)

      Description copied from class: `AbstractMessageReceiver`
      Returns default configuration settings for the component as a `Map` with keys as configuration property IDs and values as the configuration property values. All the default parameters returned from this method are later passed to the `setProperties(...)` method. Some of them may have changed value if they have been overwritten in the server configuration. The configuration property value can be of any of the basic types: `int`, `long`, `boolean`, `String`.
      Specified by:
        `getDefaults` in interface `Configurable`
      Overrides:
        `getDefaults` in class `AbstractMessageReceiver`
      Parameters:
        `params` - is a `Map` with some initial properties set for the starting up server. These parameters can be used as a hints to generate component's default configuration.
      Returns:
        a `Map` with the component default configuration.

    - #### getDiscoFeatures

          public List<Element> getDiscoFeatures(JID from)

      Description copied from interface: `XMPPService`
      Returns features for top level disco info
      Specified by:
        `getDiscoFeatures` in interface `XMPPService`
      Overrides:
        `getDiscoFeatures` in class `BasicComponent`
      Parameters:
        `from` - a request sender address. Some service disco elements are meant to be available only to system administrarors. The component is responsible to check whether the sender is the component administrator and return results appropriate.
      Returns:
        a list of elements with service discovery features.

    - #### getDiscoInfo

          public Element getDiscoInfo(String node,
                                      JID jid,
                                      JID from)

      Description copied from interface: `XMPPService`
      Returns service discovery info for the component. If the jid is null then this is info for the top level request. SM may return disco info on the top level. Other components should not.
      Specified by:
        `getDiscoInfo` in interface `XMPPService`
      Overrides:
        `getDiscoInfo` in class `BasicComponent`
      Parameters:
        `node` - is service discovery node for which the request is made. Is normally null for the component top level request.
        `jid` - is the jid to which the request has been made.
        `from` - is the request sender address. Some service discovery information is only meant for administrators.
      Returns:
        returns an XML Element with service discovery data.

    - #### getDiscoItems

          public List<Element> getDiscoItems(String node,
                                             JID jid,
                                             JID from)

      Description copied from interface: `XMPPService`
      Returns service discovery items for the component. If the JID is null then this is request for the top level request. SM may return disco items on the top level, other components should just return it's top level service discovery item for null node.
      Specified by:
        `getDiscoItems` in interface `XMPPService`
      Overrides:
        `getDiscoItems` in class `BasicComponent`
      Parameters:
        `node` - is a service discovery node for which the request has been made.
        `jid` - is the jid to which the request has been made.
        `from` - is the request sender address. Some service discovery information is only meant for administrators.
      Returns:
        a list of service discovery items for this component or the component itself disco item for the top level request.

    - #### getStatistics

          public void getStatistics(StatisticsList list)

      Description copied from class: `AbstractMessageReceiver`
      Method returns component statistics. Please note, the method can be called every second by the server monitoring system therefore no extensive or lengthy calculations are allowed. If there are some statistics requiring lengthy operations like database access they must have `Level.FINEST` assigned and must be put inside the level guard to prevent generating them by the system monitor. The system monitor does not collect `FINEST` statistics.
      Level guard code looks like the example below:

           if (list.checkLevel(Level.FINEST)) {
             // Some CPU intensive calculations or lengthy operations
             list.add(getName(), "Statistic description", stat_value, Level.FINEST);
           }

      This way you make sure your extensive operation is not executed every second by the monitoring system and does not affect the server performance.
      Specified by:
        `getStatistics` in interface `StatisticsContainerIfc`
      Overrides:
        `getStatistics` in class `AbstractMessageReceiver`
      Parameters:
        `list` - is a `StatistcsList` where all statistics are stored.

    - #### getTask

          public ReceiverTaskIfc getTask(String jidOrName)

      Method description
      Parameters:
        `jidOrName` -

    - #### isAdmin

          public boolean isAdmin(JID jid)

      Description copied from class: `BasicComponent`
      Method description
      Overrides:
        `isAdmin` in class `BasicComponent`
      Returns:
        a value of `boolean`

    - #### processPacket

          public void processPacket(Packet packet)

      Description copied from class: `AbstractMessageReceiver`
      This is the main `Packet` processing method. It is called concurrently from many threads so implementing it in thread save manner is essential. The method is called for each packet addressed to the component.
      Please note, the `Packet` instance may be processed by different parts of the server, different components or plugins at the same time. Therefore this is very important to tread the `Packet` instance as unmodifiable object.
      Processing in this method is asynchronous, therefore there is no result value. If there are some 'result' packets generated during processing, they should be passed back using `addOutPacket(Packet)` method.
      Specified by:
        `processPacket` in class `AbstractMessageReceiver`
      Parameters:
        `packet` - is an instance of the `Packet` class passed for processing.

    - #### setProperties

          public void setProperties(Map<String,Object> props)
                             throws ConfigurationException

      Description copied from interface: `Configurable`
      Sets all configuration properties for the object.
      Specified by:
        `setProperties` in interface `Configurable`
      Overrides:
        `setProperties` in class `AbstractMessageReceiver`
      Parameters:
        `props` - `Map` with the configuration
      Throws:
        `ConfigurationException` - - if setting configuration will fail which will make it unable to work

    - #### addTaskInstance

          protected void addTaskInstance(String task_type,
                                         String task_name,
                                         Map<String,Object> task_params)
                                  throws TigaseStringprepException

      Throws:
        `TigaseStringprepException`

    - #### addTaskInstance

          protected void addTaskInstance(ReceiverTaskIfc task)

      Describe `addTaskInstance` method here.
      Parameters:
        `task` - a `ReceiverTaskIfc` value

    - #### getTaskInstances

          protected Map<String,ReceiverTaskIfc> getTaskInstances()

    - #### getTaskTypes

          protected Map<String,TaskType> getTaskTypes()

    - #### isAllowedCreate

          protected boolean isAllowedCreate(JID jid,
                                            String task_type)

    - #### removeTaskInstance

          protected void removeTaskInstance(ReceiverTaskIfc task)

    - #### removeTaskSubscribers

          protected void removeTaskSubscribers(ReceiverTaskIfc task,
                                               JID... subscr)

    - #### saveTaskToRepository

          protected void saveTaskToRepository(ReceiverTaskIfc task)
                                       throws TigaseDBException

      Throws:
        `TigaseDBException`

Copyright © 2022 "Tigase, Inc.". All rights reserved.