Oracle® Fusion Middleware C++ API Reference for Oracle Coherence
12c (12.1.3.0.0)

E47891-01

coherence/net/ConfigurableAddressProvider.hpp

00001 /*
00002 * ConfigurableAddressProvider.hpp
00003 *
00004 * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
00005 *
00006 * Oracle is a registered trademarks of Oracle Corporation and/or its
00007 * affiliates.
00008 *
00009 * This software is the confidential and proprietary information of Oracle
00010 * Corporation. You shall not disclose such confidential and proprietary
00011 * information and shall use it only in accordance with the terms of the
00012 * license agreement you entered into with Oracle.
00013 *
00014 * This notice may not be removed or altered.
00015 */
00016 #ifndef COH_CONFIGURABLE_ADDRESS_PROVIDER_HPP
00017 #define COH_CONFIGURABLE_ADDRESS_PROVIDER_HPP
00018 
00019 #include "coherence/lang.ns"
00020 
00021 #include "coherence/lang/IndexOutOfBoundsException.hpp"
00022 #include "coherence/net/AddressProvider.hpp"
00023 #include "coherence/run/xml/XmlElement.hpp"
00024 #include "coherence/util/List.hpp"
00025 
00026 COH_OPEN_NAMESPACE2(coherence,net)
00027 
00028 using coherence::run::xml::XmlElement;
00029 using coherence::util::List;
00030 
00031 /**
00032 * ConfigurableAddressProvider is an implementation of the AddressProvider
00033 * interface based on a static list of addresses configured in an XML element
00034 * that contains one or more items in the following format:
00035 * <pre>
00036 * &lt;socket-address&gt;
00037 * &nbsp;&nbsp;&lt;address&gt;...&lt;/address&gt;
00038 * &nbsp;&nbsp;&lt;port&gt;...&lt;/port&gt;
00039 * &lt;/socket-address&gt;
00040 * </pre>
00041 * The order of items in the configured list will be randomized to provide
00042 * basic load balancing.
00043 * This implementation is not thread safe.
00044 *
00045 * @author gg 2008-08-18
00046 * @author gm 2008-08-25
00047 * @since Coherence 3.4
00048 */
00049 class COH_EXPORT ConfigurableAddressProvider
00050     : public class_spec<ConfigurableAddressProvider,
00051         extends<Object>,
00052         implements<AddressProvider> >
00053     {
00054     friend class factory<ConfigurableAddressProvider>;
00055 
00056     // ----- constructors ---------------------------------------------------
00057 
00058     protected:
00059         /**
00060         * Create a new ConfigurableAddressProvider instance.
00061         */
00062         ConfigurableAddressProvider();
00063 
00064         /**
00065         * Construct an instance of ConfigurableAddressProvider based on the
00066         * specified XML element.
00067         *
00068         * @param vXml   the XML element that contains the configuration info
00069         * @param fSafe  true if the provider is skips unresolved addresses
00070         */
00071         ConfigurableAddressProvider(XmlElement::View vXml, bool fSafe = true);
00072 
00073 
00074     // ----- AddressProvider interface --------------------------------------
00075 
00076     public:
00077         /**
00078         * {@inheritDoc}
00079         */
00080         virtual InetSocketAddress::View getNextAddress();
00081 
00082         /**
00083         * {@inheritDoc}
00084         */
00085         virtual void accept();
00086 
00087         /**
00088         * {@inheritDoc}
00089         */
00090         virtual void reject(Exception::Holder oheCause);
00091 
00092 
00093     // ----- helpers --------------------------------------------------------
00094 
00095     protected:
00096         /**
00097         * Configure this ConfigurableAddressProvider based on the specified
00098         * XML.
00099         *
00100         * @param xmlConfig  the XML element that contains the configuration
00101         *                   info
00102         */
00103         virtual void configure(XmlElement::View vXml);
00104 
00105         /**
00106         * Make all addresses iterable, starting at the first address.
00107         */
00108         virtual void reset();
00109 
00110         /**
00111         * Make all addresses iterable, starting at the index after the specified
00112         * one.
00113         *
00114         * @param iLast  the index of the last address returned
00115         */
00116         virtual void reset(size32_t iLast);
00117 
00118         /**
00119         * Sort the holders in the order to be returned by the getNextAddress
00120         * method.  This implementation randomizes the holder lists for
00121         * simple load balancing.
00122         *
00123         * @param list  the original list retrieved from the configuration
00124         *
00125         * @return the re-ordered list
00126         */
00127         virtual List::Handle sortHolders(List::Handle hList);
00128 
00129 
00130     // ----- Object methods -------------------------------------------------
00131 
00132     public:
00133         /**
00134         * {@inheritDoc}
00135         */
00136         virtual void toStream(std::ostream& out) const;
00137 
00138 
00139     // ----- inner class: AddressHolder -------------------------------------
00140 
00141     protected:
00142         /**
00143         * A stateful holder for an InetSocketAddress object.
00144         */
00145         class COH_EXPORT AddressHolder
00146             : public class_spec<AddressHolder>
00147             {
00148             friend class factory<AddressHolder>;
00149             friend class ConfigurableAddressProvider;
00150 
00151             // ----- constructors ---------------------------------------
00152 
00153             protected:
00154                 /**
00155                 * Construct an AddressHolder for the specified
00156                 * InetSocketAddress.
00157                 *
00158                 * @param sHost  the hostname
00159                 * @param nPort  the port number
00160                 */
00161                 AddressHolder(String::View vsHost, int32_t nPort);
00162 
00163                 /**
00164                 * Create a new AddressHolder instance.
00165                 */
00166                 AddressHolder();
00167 
00168             // ----- accessors ------------------------------------------
00169 
00170             public:
00171                 /**
00172                 * Obtain the underlying address.
00173                 *
00174                 * @return the underlying InetSocketAddress object
00175                 */
00176                 InetSocketAddress::View getAddress() const;
00177 
00178             protected:
00179                 /**
00180                 * Check whether or not the underlying address has been accepted.
00181                 *
00182                 * @return true iff the underlying address has not yet been
00183                 *         accepted
00184                 */
00185                 virtual bool isPending() const;
00186 
00187                 /**
00188                 * Set or clear the "pending" flag.
00189                 *
00190                 * @param fPending  the flag value
00191                 */
00192                 virtual void setPending(bool fPending);
00193 
00194                 /**
00195                 * Check whether or not the underlying address has been reported
00196                 * as unresolveable.
00197                 *
00198                 * @return true iff the underlying address has been reported as
00199                 *         unresolveable
00200                 */
00201                 virtual bool isReported() const;
00202 
00203                 /**
00204                 * Set of clear the "reported" flag.
00205                 *
00206                 * @param fReported  the flag value
00207                 */
00208                 virtual void setReported(bool fReported);
00209 
00210             // ----- data members -------------------------------------------
00211 
00212             protected:
00213                 /**
00214                 * The configured address, either hostname or IP address.
00215                 */
00216                 FinalView<String> f_vsHost;
00217 
00218                 /**
00219                 * The configured port.
00220                 */
00221                 const uint16_t m_nPort;
00222 
00223                 /**
00224                 * A flag indicating that the underlying address has been
00225                 * provided to a client, but has not yet been accepted.
00226                 */
00227                 bool m_fPending;
00228 
00229                 /**
00230                 * Specifies if this address has already been reported as
00231                 * unresolved.
00232                 */
00233                 bool m_fReported;
00234             };
00235 
00236 
00237     // ----- data members ---------------------------------------------------
00238 
00239     protected:
00240         /**
00241         * A list of AddressHolder objects.
00242         */
00243         FinalView<List> f_vListHolders;
00244 
00245         /**
00246         * Index of the last returned address.
00247         */
00248         size32_t m_iLast;
00249 
00250         /**
00251         * Specifies if the provider is only to return resolved addresses.
00252         */
00253         bool m_fSafe;
00254 
00255 
00256     // ----- constants ------------------------------------------------------
00257 
00258     public:
00259         /**
00260         * The largest possible value of type size32_t.
00261         */
00262         static const size32_t npos = size32_t(-1);
00263     };
00264 
00265 COH_CLOSE_NAMESPACE2
00266 
00267 #endif // COH_CONFIGURABLE_ADDRESS_PROVIDER_HPP
Copyright © 2000, 2014, Oracle and/or its affiliates. All rights reserved.