001    /**
002     *   GRANITE DATA SERVICES
003     *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004     *
005     *   This file is part of the Granite Data Services Platform.
006     *
007     *   Granite Data Services is free software; you can redistribute it and/or
008     *   modify it under the terms of the GNU Lesser General Public
009     *   License as published by the Free Software Foundation; either
010     *   version 2.1 of the License, or (at your option) any later version.
011     *
012     *   Granite Data Services is distributed in the hope that it will be useful,
013     *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015     *   General Public License for more details.
016     *
017     *   You should have received a copy of the GNU Lesser General Public
018     *   License along with this library; if not, write to the Free Software
019     *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020     *   USA, or see <http://www.gnu.org/licenses/>.
021     */
022    package org.granite.gravity;
023    
024    import javax.servlet.ServletContext;
025    
026    import org.granite.config.GraniteConfig;
027    import org.granite.config.GraniteConfigReloadListener;
028    import org.granite.util.XMap;
029    
030    /**
031     * @author Franck WOLFF
032     */
033    public class GravityConfig implements GraniteConfigReloadListener {
034    
035            public static final String DEFAULT_GRAVITY_FACTORY = DefaultGravityFactory.class.getName();
036            public static final long DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS = 30 * 60000L;
037            public static final long DEFAULT_LONG_POLLING_TIMEOUT_MILLIS = 20000L;
038            public static final boolean DEFAULT_RETRY_ON_ERROR = true;
039            public static final int DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL = Integer.MAX_VALUE;
040            public static final long DEFAULT_RECONNECT_INTERVAL_MILLIS = 30000L;
041            public static final int DEFAULT_RECONNECT_MAX_ATTEMPTS = 60;
042            public static final boolean DEFAULT_ENCODE_MESSAGE_BODY = false;
043            public static final int DEFAULT_CORE_POOL_SIZE = 5;
044            public static final int DEFAULT_MAXIMUM_POOL_SIZE = 20;
045            public static final long DEFAULT_KEEP_ALIVE_TIME_MILLIS = 10000L;
046            public static final int DEFAULT_QUEUE_CAPACITY = Integer.MAX_VALUE;
047            
048            public static final int DEFAULT_UDP_SEND_BUFFER_SIZE = 64 * 1024; // 64K.
049            
050        // General Gravity configuration.
051            private String gravityFactory = DEFAULT_GRAVITY_FACTORY;
052    
053            // Channel configuration.
054            private long channelIdleTimeoutMillis = DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS;
055        private long longPollingTimeoutMillis = DEFAULT_LONG_POLLING_TIMEOUT_MILLIS;
056            private boolean retryOnError = DEFAULT_RETRY_ON_ERROR;
057            private int maxMessagesQueuedPerChannel = DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL;
058    
059        // Client advices.
060        private long reconnectIntervalMillis = DEFAULT_RECONNECT_INTERVAL_MILLIS;
061        private int reconnectMaxAttempts = DEFAULT_RECONNECT_MAX_ATTEMPTS;
062        private boolean encodeMessageBody = DEFAULT_ENCODE_MESSAGE_BODY;
063        
064        // Free configuration options.
065        private XMap extra = null;
066    
067        // Thread pool configuration.
068        private int corePoolSize = DEFAULT_CORE_POOL_SIZE;
069        private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE;
070        private long keepAliveTimeMillis = DEFAULT_KEEP_ALIVE_TIME_MILLIS;
071        private int queueCapacity = DEFAULT_QUEUE_CAPACITY;
072    
073        // UDP configuration.
074        private boolean useUdp = false;
075        private int udpPort = 0;
076        private boolean udpNio = true;
077        private boolean udpConnected = true;
078        private int udpSendBufferSize = DEFAULT_UDP_SEND_BUFFER_SIZE;
079    
080            public GravityConfig(GraniteConfig graniteConfig) {
081                    parseConfig(graniteConfig.getGravityConfig());
082            }
083            
084            private void parseConfig(XMap config) {
085                    if (config != null) {
086                            gravityFactory = config.get("@factory", String.class, DEFAULT_GRAVITY_FACTORY);
087    
088                            // Channel configuration.
089                            channelIdleTimeoutMillis = config.get("@channel-idle-timeout-millis", Long.TYPE, DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS);
090                            longPollingTimeoutMillis = config.get("@long-polling-timeout-millis", Long.TYPE, DEFAULT_LONG_POLLING_TIMEOUT_MILLIS);
091                            retryOnError = config.get("@retry-on-error", Boolean.TYPE, DEFAULT_RETRY_ON_ERROR);
092                            maxMessagesQueuedPerChannel = config.get("@max-messages-queued-per-channel", Integer.TYPE, DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL);
093    
094                            // Advices sent to clients.
095                            reconnectIntervalMillis = config.get("@reconnect-interval-millis", Long.TYPE, DEFAULT_RECONNECT_INTERVAL_MILLIS);
096                            reconnectMaxAttempts = config.get("@reconnect-max-attempts", Integer.TYPE, DEFAULT_RECONNECT_MAX_ATTEMPTS);
097                            encodeMessageBody = config.get("@encode-message-body", Boolean.TYPE, DEFAULT_ENCODE_MESSAGE_BODY);
098                            
099                            // Free configuration options.
100                            extra = config.getOne("configuration");
101                            
102                            // Thread pool configuration.
103                            corePoolSize = config.get("thread-pool/@core-pool-size", Integer.TYPE, DEFAULT_CORE_POOL_SIZE);
104                            maximumPoolSize = config.get("thread-pool/@maximum-pool-size", Integer.TYPE, DEFAULT_MAXIMUM_POOL_SIZE);
105                            keepAliveTimeMillis = config.get("thread-pool/@keep-alive-time-millis", Long.TYPE, DEFAULT_KEEP_ALIVE_TIME_MILLIS);
106                            queueCapacity = config.get("thread-pool/@queue-capacity", Integer.TYPE, DEFAULT_QUEUE_CAPACITY);
107                            
108                            // UDP configuration.
109                            useUdp = config.containsKey("udp");
110                            if (useUdp) {
111                                    udpPort = config.get("udp/@port", Integer.TYPE, 0);
112                                    udpNio = config.get("udp/@nio", Boolean.TYPE, true);
113                                    udpConnected = config.get("udp/@connected", Boolean.TYPE, true);
114                                    udpSendBufferSize = config.get("udp/@send-buffer-size", Integer.TYPE, DEFAULT_UDP_SEND_BUFFER_SIZE);
115                            }
116                    }
117            }
118    
119            public void onReload(ServletContext context, GraniteConfig config) {
120                    parseConfig(config.getGravityConfig());
121                    GravityManager.reconfigure(context, this);
122            }
123    
124            public String getGravityFactory() {
125                    return gravityFactory;
126            }
127    
128            public long getChannelIdleTimeoutMillis() {
129                    return channelIdleTimeoutMillis;
130            }
131            public void setChannelIdleTimeoutMillis(long channelIdleTimeoutMillis) {
132                    this.channelIdleTimeoutMillis = channelIdleTimeoutMillis;
133            }
134    
135            public long getLongPollingTimeoutMillis() {
136                    return longPollingTimeoutMillis;
137            }
138            public void setLongPollingTimeoutMillis(long longPollingTimeoutMillis) {
139                    this.longPollingTimeoutMillis = longPollingTimeoutMillis;
140            }
141    
142            public boolean isRetryOnError() {
143                    return retryOnError;
144            }
145            public void setRetryOnError(boolean retryOnError) {
146                    this.retryOnError = retryOnError;
147            }
148    
149            public int getMaxMessagesQueuedPerChannel() {
150                    return maxMessagesQueuedPerChannel;
151            }
152            public void setMaxMessagesQueuedPerChannel(int maxMessagesQueuedPerChannel) {
153                    this.maxMessagesQueuedPerChannel = maxMessagesQueuedPerChannel;
154            }
155    
156            public long getReconnectIntervalMillis() {
157                    return reconnectIntervalMillis;
158            }
159            public void setReconnectIntervalMillis(long reconnectIntervalMillis) {
160                    this.reconnectIntervalMillis = reconnectIntervalMillis;
161            }
162    
163            public int getReconnectMaxAttempts() {
164                    return reconnectMaxAttempts;
165            }
166            public void setReconnectMaxAttempts(int reconnectMaxAttempts) {
167                    this.reconnectMaxAttempts = reconnectMaxAttempts;
168            }
169    
170            public boolean isEncodeMessageBody() {
171                    return encodeMessageBody;
172            }
173    
174            public void setEncodeMessageBody(boolean encodeMessageBody) {
175                    this.encodeMessageBody = encodeMessageBody;
176            }
177    
178            public XMap getExtra() {
179                    return (extra != null ? extra : XMap.EMPTY_XMAP);
180            }
181    
182            public int getCorePoolSize() {
183                    return corePoolSize;
184            }
185            public void setCorePoolSize(int corePoolSize) {
186                    this.corePoolSize = corePoolSize;
187            }
188    
189            public int getMaximumPoolSize() {
190                    return maximumPoolSize;
191            }
192            public void setMaximumPoolSize(int maximumPoolSize) {
193                    this.maximumPoolSize = maximumPoolSize;
194            }
195    
196            public long getKeepAliveTimeMillis() {
197                    return keepAliveTimeMillis;
198            }
199            public void setKeepAliveTimeMillis(long keepAliveTimeMillis) {
200                    this.keepAliveTimeMillis = keepAliveTimeMillis;
201            }
202    
203            public int getQueueCapacity() {
204                    return queueCapacity;
205            }
206            public void setQueueCapacity(int queueCapacity) {
207                    this.queueCapacity = queueCapacity;
208            }
209    
210            public boolean isUseUdp() {
211                    return useUdp;
212            }
213            public void setUseUdp(boolean useUdp) {
214                    this.useUdp = useUdp;
215            }
216    
217            public int getUdpPort() {
218                    return udpPort;
219            }
220            public void setUdpPort(int udpPort) {
221                    this.udpPort = udpPort;
222            }
223    
224            public boolean isUdpNio() {
225                    return udpNio;
226            }
227            public void setUdpNio(boolean udpNio) {
228                    this.udpNio = udpNio;
229            }
230    
231            public boolean isUdpConnected() {
232                    return udpConnected;
233            }
234            public void setUdpConnected(boolean udpConnected) {
235                    this.udpConnected = udpConnected;
236            }
237    
238            public int getUdpSendBufferSize() {
239                    return udpSendBufferSize;
240            }
241            public void setUdpSendBufferSize(int udpBufferSize) {
242                    this.udpSendBufferSize = udpBufferSize;
243            }
244    }