001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.gravity;
022
023import javax.servlet.ServletContext;
024
025import org.granite.config.GraniteConfig;
026import org.granite.config.GraniteConfigReloadListener;
027import org.granite.util.XMap;
028
029/**
030 * @author Franck WOLFF
031 */
032public class GravityConfig implements GraniteConfigReloadListener {
033
034        public static final String DEFAULT_GRAVITY_FACTORY = DefaultGravityFactory.class.getName();
035        public static final long DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS = 30 * 60000L;
036        public static final long DEFAULT_LONG_POLLING_TIMEOUT_MILLIS = 20000L;
037        public static final boolean DEFAULT_RETRY_ON_ERROR = true;
038        public static final int DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL = Integer.MAX_VALUE;
039        public static final long DEFAULT_RECONNECT_INTERVAL_MILLIS = 30000L;
040        public static final int DEFAULT_RECONNECT_MAX_ATTEMPTS = 60;
041        public static final int DEFAULT_CORE_POOL_SIZE = 5;
042        public static final int DEFAULT_MAXIMUM_POOL_SIZE = 20;
043        public static final long DEFAULT_KEEP_ALIVE_TIME_MILLIS = 10000L;
044        public static final int DEFAULT_QUEUE_CAPACITY = Integer.MAX_VALUE;
045        
046    // General Gravity configuration.
047        private String gravityFactory = DEFAULT_GRAVITY_FACTORY;
048
049        // Channel configuration.
050        private long channelIdleTimeoutMillis = DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS;
051    private long longPollingTimeoutMillis = DEFAULT_LONG_POLLING_TIMEOUT_MILLIS;
052        private boolean retryOnError = DEFAULT_RETRY_ON_ERROR;
053        private int maxMessagesQueuedPerChannel = DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL;
054
055    // Client advices.
056    private long reconnectIntervalMillis = DEFAULT_RECONNECT_INTERVAL_MILLIS;
057    private int reconnectMaxAttempts = DEFAULT_RECONNECT_MAX_ATTEMPTS;
058    
059    // Free configuration options.
060    private XMap extra = null;
061
062    // Thread pool configuration.
063    private int corePoolSize = DEFAULT_CORE_POOL_SIZE;
064    private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE;
065    private long keepAliveTimeMillis = DEFAULT_KEEP_ALIVE_TIME_MILLIS;
066    private int queueCapacity = DEFAULT_QUEUE_CAPACITY;
067
068        public GravityConfig(GraniteConfig graniteConfig) {
069                
070                parseConfig(graniteConfig.getGravityConfig());
071        }
072        
073        private void parseConfig(XMap config) {
074                if (config != null) {
075                        gravityFactory = config.get("@factory", String.class, DEFAULT_GRAVITY_FACTORY);
076
077                        // Channel configuration.
078                        channelIdleTimeoutMillis = config.get("@channel-idle-timeout-millis", Long.TYPE, DEFAULT_CHANNEL_IDLE_TIMEOUT_MILLIS);
079                        longPollingTimeoutMillis = config.get("@long-polling-timeout-millis", Long.TYPE, DEFAULT_LONG_POLLING_TIMEOUT_MILLIS);
080                        retryOnError = config.get("@retry-on-error", Boolean.TYPE, DEFAULT_RETRY_ON_ERROR);
081                        maxMessagesQueuedPerChannel = config.get("@max-messages-queued-per-channel", Integer.TYPE, DEFAULT_MAX_MESSAGES_QUEUED_PER_CHANNEL);
082
083                        // Advices sent to clients.
084                        reconnectIntervalMillis = config.get("@reconnect-interval-millis", Long.TYPE, DEFAULT_RECONNECT_INTERVAL_MILLIS);
085                        reconnectMaxAttempts = config.get("@reconnect-max-attempts", Integer.TYPE, DEFAULT_RECONNECT_MAX_ATTEMPTS);
086                        
087                        // Free configuration options.
088                        extra = config.getOne("configuration");
089                        
090                        // Thread pool configuration.
091                        corePoolSize = config.get("thread-pool/@core-pool-size", Integer.TYPE, DEFAULT_CORE_POOL_SIZE);
092                        maximumPoolSize = config.get("thread-pool/@maximum-pool-size", Integer.TYPE, DEFAULT_MAXIMUM_POOL_SIZE);
093                        keepAliveTimeMillis = config.get("thread-pool/@keep-alive-time-millis", Long.TYPE, DEFAULT_KEEP_ALIVE_TIME_MILLIS);
094                        queueCapacity = config.get("thread-pool/@queue-capacity", Integer.TYPE, DEFAULT_QUEUE_CAPACITY);
095                }
096        }
097
098        public void onReload(ServletContext context, GraniteConfig config) {
099                parseConfig(config.getGravityConfig());
100                GravityManager.reconfigure(context, this);
101        }
102
103        public String getGravityFactory() {
104                return gravityFactory;
105        }
106
107        public long getChannelIdleTimeoutMillis() {
108                return channelIdleTimeoutMillis;
109        }
110        public void setChannelIdleTimeoutMillis(long channelIdleTimeoutMillis) {
111                this.channelIdleTimeoutMillis = channelIdleTimeoutMillis;
112        }
113
114        public long getLongPollingTimeoutMillis() {
115                return longPollingTimeoutMillis;
116        }
117        public void setLongPollingTimeoutMillis(long longPollingTimeoutMillis) {
118                this.longPollingTimeoutMillis = longPollingTimeoutMillis;
119        }
120
121        public boolean isRetryOnError() {
122                return retryOnError;
123        }
124        public void setRetryOnError(boolean retryOnError) {
125                this.retryOnError = retryOnError;
126        }
127
128        public int getMaxMessagesQueuedPerChannel() {
129                return maxMessagesQueuedPerChannel;
130        }
131        public void setMaxMessagesQueuedPerChannel(int maxMessagesQueuedPerChannel) {
132                this.maxMessagesQueuedPerChannel = maxMessagesQueuedPerChannel;
133        }
134
135        public long getReconnectIntervalMillis() {
136                return reconnectIntervalMillis;
137        }
138        public void setReconnectIntervalMillis(long reconnectIntervalMillis) {
139                this.reconnectIntervalMillis = reconnectIntervalMillis;
140        }
141
142        public int getReconnectMaxAttempts() {
143                return reconnectMaxAttempts;
144        }
145        public void setReconnectMaxAttempts(int reconnectMaxAttempts) {
146                this.reconnectMaxAttempts = reconnectMaxAttempts;
147        }
148
149        public XMap getExtra() {
150                return (extra != null ? extra : XMap.EMPTY_XMAP);
151        }
152
153        public int getCorePoolSize() {
154                return corePoolSize;
155        }
156        public void setCorePoolSize(int corePoolSize) {
157                this.corePoolSize = corePoolSize;
158        }
159
160        public int getMaximumPoolSize() {
161                return maximumPoolSize;
162        }
163        public void setMaximumPoolSize(int maximumPoolSize) {
164                this.maximumPoolSize = maximumPoolSize;
165        }
166
167        public long getKeepAliveTimeMillis() {
168                return keepAliveTimeMillis;
169        }
170        public void setKeepAliveTimeMillis(long keepAliveTimeMillis) {
171                this.keepAliveTimeMillis = keepAliveTimeMillis;
172        }
173
174        public int getQueueCapacity() {
175                return queueCapacity;
176        }
177        public void setQueueCapacity(int queueCapacity) {
178                this.queueCapacity = queueCapacity;
179        }
180}