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}