Package tigase.cluster

## Class VirtualComponent

- java.lang.Object
- - tigase.cluster.VirtualComponent

- All Implemented Interfaces:
    `Configurable`, `XMPPService`, `DisableDisco`, `ServerComponent`, `VHostListener`

      public class VirtualComponent
      extends java.lang.Object
      implements ServerComponent, XMPPService, Configurable, DisableDisco, VHostListener

  The purpose of this component implementation is to forward packets to a target real component implementation in the cluster installation. Let's say you have a cluster installation with full Tigase server installed on each node and you also want to use a component which doesn't have clustered implementation yet. In such case you deploy the component on one of the cluster nodes and put the virtual component on all other nodes. With proper configuration they pretend to be the component returning a correct service disco information and forward all packets for this component to a cluster node with real component running.
  This is a very lightweight implementation which doesn't use much resources either memory or CPU.
  It can work well for any kind of a component: MUC, PubSub, transport either native Tigase components or third-party components connected via XEP-0114 - external protocol component.
  Basic configuration parameters are actually the same as for a real component. You set a real component name as a name for the virtual component and a vritual component class name to load. Let's say we want to deploy MUC component this way. The MUC component is visible as `muc.domain.our` in our installation. Thus the name of the component is: `muc`:

       --comp-name-1=muc
       --comp-class-1=tigase.cluster.VirtualComponent

  This is pretty much all you need to load a virtual component. A few other options are needed to point to correct destination addresses for forwarded packets and to set correct service discovery parameters:

       muc/redirect-to=muc@cluster-node-with-real-muc.domain.our
       muc/disco-name=Multi User Chat
       muc/disco-node=
       muc/disco-type=text
       muc/disco-category=conference
       muc/disco-features=http://jabber.org/protocol/muc
       muc/fixed-domain=example.com

  Above options set all possible parameters to setup virtual MUC component. Created: Dec 13, 2008 7:44:35 PM
  Author:
    Artur Hefczyc

- - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static java.lang.String` | `DISCO_CATEGORY_PROP_KEY` | Parameter to set service discovery item category name for the virtual component.
    `static java.lang.String` | `DISCO_CATEGORY_PROP_VAL` |
    `static java.lang.String` | `DISCO_FEATURES_PROP_KEY` | Comma separated list of features for the service discovery item represented by this virtual component.
    `static java.lang.String` | `DISCO_FEATURES_PROP_VAL` |
    `static java.lang.String` | `DISCO_NAME_PROP_KEY` | Parameter to set service discovery item name for the virtual component instance.
    `static java.lang.String` | `DISCO_NAME_PROP_VAL` |
    `static java.lang.String` | `DISCO_NODE_PROP_KEY` | Parameter to set service discovery node name.
    `static java.lang.String` | `DISCO_NODE_PROP_VAL` |
    `static java.lang.String` | `DISCO_TYPE_PROP_KEY` | Parameter to set service discovery item type for the virtual component.
    `static java.lang.String` | `DISCO_TYPE_PROP_VAL` | A default value for service discovery item type, which is 'text'
    `static java.lang.String` | `FIXED_DOMAIN_PROP_KEY` | If set, then it is used as the component domain name part.
    `static java.lang.String` | `REDIRECT_TO_PROP_KEY` | Virtual component parameter setting packet redirect destination address.
    `protected VHostManagerIfc` | `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_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, 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 | Description
    --- | ---
    `VirtualComponent()` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `JID` | `getComponentId()` | Method returns component jid in form of the component name followed by server hostname as a domain.
    `ComponentInfo` | `getComponentInfo()` | Allows to obtain various informations about components
    `java.util.Map<java.lang.String,​java.lang.Object>` | `getDefaults​(java.util.Map<java.lang.String,​java.lang.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.
    `java.util.List<Element>` | `getDiscoFeatures​(JID from)` | Returns features for top level disco info
    `Element` | `getDiscoInfo​(java.lang.String node, JID jid, JID from)` | Returns service discovery info for the component.
    `java.util.List<Element>` | `getDiscoItems​(java.lang.String node, JID jid, JID from)` | Returns service discovery items for the component.
    `java.lang.String` | `getName()` | Method returns name of the component.
    `boolean` | `handlesLocalDomains()` | Indicates whether the component accepts packets to all local domains.
    `boolean` | `handlesNameSubdomains()` | Indicates whether the component can handle packets to 'name' subdomain.
    `boolean` | `handlesNonLocalDomains()` | Indicates whether the component can handle all packets to non-local domains.
    `void` | `initializationCompleted()` | Method is called by `MessageRouter` when all the startup components of the server have been loaded and configured through setProperties(...) call.
    `boolean` | `isInitializationComplete()` | Method returns information about whether the initialization process (initializationCompleted()) method has been called.
    `void` | `processPacket​(Packet packet, java.util.Queue<Packet> results)` | `processPacket` is a blocking processing method implemented by all components.
    `void` | `release()` | Method called when component is being stopped and unloaded.
    `void` | `setName​(java.lang.String name)` | Method used to assign component name (localpart of the component)
    `void` | `setProperties​(java.util.Map<java.lang.String,​java.lang.Object> properties)` | Sets all configuration properties for the object.
    `void` | `setVHostManager​(VHostManagerIfc manager)` | Sets the VHostManager which works on this server installation.

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

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

- - ### Field Detail

    - #### DISCO_CATEGORY_PROP_KEY

          public static final java.lang.String DISCO_CATEGORY_PROP_KEY

      Parameter to set service discovery item category name for the virtual component. Please refer to service discovery documentation for a correct category or check what is returned by your real component instance.
      See Also:
        Constant Field Values

    - #### DISCO_CATEGORY_PROP_VAL

          public static final java.lang.String DISCO_CATEGORY_PROP_VAL

      See Also:
        Constant Field Values

    - #### DISCO_FEATURES_PROP_KEY

          public static final java.lang.String DISCO_FEATURES_PROP_KEY

      Comma separated list of features for the service discovery item represented by this virtual component. Please check with the real component to obtain a correct list of features.
      See Also:
        Constant Field Values

    - #### DISCO_FEATURES_PROP_VAL

          public static final java.lang.String DISCO_FEATURES_PROP_VAL

      See Also:
        Constant Field Values

    - #### DISCO_NAME_PROP_KEY

          public static final java.lang.String DISCO_NAME_PROP_KEY

      Parameter to set service discovery item name for the virtual component instance. You should refer to service discovery documentation for a proper name for your component.
      See Also:
        Constant Field Values

    - #### DISCO_NAME_PROP_VAL

          public static final java.lang.String DISCO_NAME_PROP_VAL

      See Also:
        Constant Field Values

    - #### DISCO_NODE_PROP_KEY

          public static final java.lang.String DISCO_NODE_PROP_KEY

      Parameter to set service discovery node name. In most cases you should leave it empty unless you really know what you are doing.
      See Also:
        Constant Field Values

    - #### DISCO_NODE_PROP_VAL

          public static final java.lang.String DISCO_NODE_PROP_VAL

      See Also:
        Constant Field Values

    - #### DISCO_TYPE_PROP_KEY

          public static final java.lang.String DISCO_TYPE_PROP_KEY

      Parameter to set service discovery item type for the virtual component. You should refer to a service discovery documentation for a correct type for your component. Or, alternatively you can have a look what returns your real component.
      See Also:
        Constant Field Values

    - #### DISCO_TYPE_PROP_VAL

          public static final java.lang.String DISCO_TYPE_PROP_VAL

      A default value for service discovery item type, which is 'text'
      See Also:
        Constant Field Values

    - #### FIXED_DOMAIN_PROP_KEY

          public static final java.lang.String FIXED_DOMAIN_PROP_KEY

      If set, then it is used as the component domain name part. This domains is displayed on the service discovery information, instead of virtual host based on the user's query.
      See Also:
        Constant Field Values

    - #### REDIRECT_TO_PROP_KEY

          public static final java.lang.String REDIRECT_TO_PROP_KEY

      Virtual component parameter setting packet redirect destination address.
      See Also:
        Constant Field Values

    - #### vHostManager

          protected VHostManagerIfc vHostManager

  - ### Constructor Detail

    - #### VirtualComponent

          public VirtualComponent()

  - ### Method Detail

    - #### handlesLocalDomains

          public boolean handlesLocalDomains()

      Description copied from interface: `VHostListener`
      Indicates whether the component accepts packets to all local domains. The best example would be SM component which usually handles all requests sent to any local domain.
      Specified by:
        `handlesLocalDomains` in interface `VHostListener`
      Returns:
        'true' if the component accepts packets to local domains 'false' otherwise.

    - #### handlesNameSubdomains

          public boolean handlesNameSubdomains()

      Description copied from interface: `VHostListener`
      Indicates whether the component can handle packets to 'name' subdomain. Name subdomain is an artificial domain created from the component name and the domain name. The best example would be a 'MUC' component or a 'PubSub' component. They are usually named respectively 'muc' and 'pubsub' and they accept requests sent to domains 'muc.tigase.org' or 'pubsub.tigase.org', even though a local domain is just 'tigase.org'.
      Specified by:
        `handlesNameSubdomains` in interface `VHostListener`
      Returns:
        'true' if the component accepts packets to 'name' subdomains 'false' otherwise.

    - #### handlesNonLocalDomains

          public boolean handlesNonLocalDomains()

      Description copied from interface: `VHostListener`
      Indicates whether the component can handle all packets to non-local domains. S2s connection manager component is the best example of the component which handles all requests sent to non-local domains.
      Specified by:
        `handlesNonLocalDomains` in interface `VHostListener`
      Returns:
        'true' if the component accepts packets to non-local domains 'false' otherwise.

    - #### initializationCompleted

          public void initializationCompleted()

      Description copied from interface: `ServerComponent`
      Method is called by `MessageRouter` when all the startup components of the server have been loaded and configured through setProperties(...) call. At this point the whole server should be loaded and functional, except initializations taking place in this routine.
      Specified by:
        `initializationCompleted` in interface `ServerComponent`

    - #### processPacket

          public void processPacket​(Packet packet,
                                    java.util.Queue<Packet> results)

      Description copied from interface: `ServerComponent`
      `processPacket` is a blocking processing method implemented by all components. This method processes packet and returns results instantly without waiting for any resources.
      Specified by:
        `processPacket` in interface `ServerComponent`
      Parameters:
        `packet` - a `Packet` value

    - #### release

          public void release()

      Description copied from interface: `ServerComponent`
      Method called when component is being stopped and unloaded.
      Specified by:
        `release` in interface `ServerComponent`

    - #### getComponentId

          public JID getComponentId()

      Description copied from interface: `ServerComponent`
      Method returns component jid in form of the component name followed by server hostname as a domain.
      Specified by:
        `getComponentId` in interface `ServerComponent`
      Returns:
        jid

    - #### getComponentInfo

          public ComponentInfo getComponentInfo()

      Description copied from interface: `ServerComponent`
      Allows to obtain various informations about components
      Specified by:
        `getComponentInfo` in interface `ServerComponent`
      Returns:
        information about particular component

    - #### getDefaults

          public java.util.Map<java.lang.String,​java.lang.Object> getDefaults​(java.util.Map<java.lang.String,​java.lang.Object> params)

      Description copied from interface: `Configurable`
      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`
      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 java.util.List<Element> getDiscoFeatures​(JID from)

      Description copied from interface: `XMPPService`
      Returns features for top level disco info
      Specified by:
        `getDiscoFeatures` in interface `XMPPService`
      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​(java.lang.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`
      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 java.util.List<Element> getDiscoItems​(java.lang.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`
      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.

    - #### getName

          public java.lang.String getName()

      Description copied from interface: `ServerComponent`
      Method returns name of the component.
      Specified by:
        `getName` in interface `ServerComponent`
      Returns:
        name of the component

    - #### setName

          public void setName​(java.lang.String name)

      Description copied from interface: `ServerComponent`
      Method used to assign component name (localpart of the component)
      Specified by:
        `setName` in interface `ServerComponent`
      Parameters:
        `name` - to be assigned

    - #### isInitializationComplete

          public boolean isInitializationComplete()

      Description copied from interface: `ServerComponent`
      Method returns information about whether the initialization process (initializationCompleted()) method has been called.
      Specified by:
        `isInitializationComplete` in interface `ServerComponent`
      Returns:
        `true` if initialization of the object has been completed `false` otherwise

    - #### setProperties

          public void setProperties​(java.util.Map<java.lang.String,​java.lang.Object> properties)

      Description copied from interface: `Configurable`
      Sets all configuration properties for the object.
      Specified by:
        `setProperties` in interface `Configurable`
      Parameters:
        `properties` - `Map` with the configuration

    - #### setVHostManager

          public void setVHostManager​(VHostManagerIfc manager)

      Description copied from interface: `VHostListener`
      Sets the VHostManager which works on this server installation. The VHostManager allows for accessing vritual domain data.
      Specified by:
        `setVHostManager` in interface `VHostListener`
      Parameters:
        `manager` - is a reference to VHostManager available on the server installation.