<?xml version="1.0"  encoding="windows-1251"?>
<!-- -->
<module name="IChat server configuration" description="IChat server configuration file">
<body>
	<!-- Базовые настройки. Создает экземпляр com.web_visage.ichatserv.admin.AdminConfig с пометкой, что данный экземпляр
	должен являться единственным в контейнере -->
	<bean id='configuration' class='com.web_visage.ichatserv.admin.AdminConfig'  autowire="false" singleton='true'>	
		<!-- Раскоментируйте строчку ниже если вам нужна "привязка" сервера к определенному IP-адресу 
		(интерфейсу). По умолчанию сервер привязывается к "любому адресу" (0.0.0.0) -->
		<!--prop key='hostName' val='127.0.0.1'/-->
		<!-- Порт, на котором сервер будет ожидать соединения от клиентов -->
		<prop key='port' val='6666' />
		<!-- Фабрика сообщений, используемая для создания сообщений ичата.
		Использование альтернативной фабрики необходимо в случае работы с
		видоизмененными клиентами, такими как "антихак" версия от John Do.  -->
		<prop key='messageFactory' val='$MessageFactory' />
		<!-- Хранилище клиентских соединений -->
		<prop key='clientRegistry' val='$ClientRegistry' />
		<!-- Хранилище зарегестрированных (корректно подсоединившихся) клиентов -->
		<prop key='registeredClientsRegistry' val='$RegisteredClientsRegistry' />
		<!-- Обработчик сообщений. Альтернативные обработчики могут использоваться для
		 изменения поведения сервера (смотри реализацию мат-фильтра) -->
		<prop key='messageHandler' val='$MessageHandler' />
		<!-- Максимальный размер пула рабочих потоков -->
		<prop key='maxThreadPoolSize' val='10' />
		<!-- Минимальный размер активных рабочих потоков -->
		<prop key='coreThreadPoolSize' val='5' />
		<!-- Время в секундах, через которое при осутствии активности в потоке
		дополнительный поток устраняется из пула -->
		<prop key='threadKeepAliveTime' val='60' />
		<!-- Размер очереди, по пресыщении которой в пуле создается новый рабочий поток -->
		<prop key='threadPoolQueueCapacity' val='3000' />
		<!-- Путь к файлу, содержащему список заблокированных IP адресов -->
		<prop key='bannedListPath' val='./banned.txt' />
		<!-- Время в миллисекундах, через которое будут проверяться изменения в конфигурационных файлах.
		 (при отсутствии изменений в файле файл НЕ ПЕРЕЧИТЫВАЕТСЯ )-->
		<prop key='fileMonitorRefreshTime' val='10000' />
		<!-- Путь к файлу настроек логирования -->
		<prop key='logIniPath' val='./logging.ini' />
		<!-- Настройки, специфичные для расширенной (администрируемой версии сервера) -->
		<!-- не используется -->
		<prop key='fakeAdminUserName' val='Admin' />
		<!-- не используется -->
		<prop key='fakeAdminUserSender' val='xxxx/admin-hi/admin-lo' />
		<!-- не используется -->
		<prop key='adminPassword' val='test' />
		<!-- Путь к файлу с регулярными выражениями мат-фильтра -->
		<prop key='wordPatternFilePath' val='./wordpatterns.txt' />
		<!-- Путь к файлу с исключениями из обработки мат-фильтра -->
		<prop key='wordExclusionsFilePath' val='./wordexclusions.txt' />
		<!-- Компонент, следящий за изменениями списка паттернов мат-фильтра -->
		<prop key='wordPatternsList' val='$UpdatableCensorFilter' />
		<!-- Компонент, следящий за изменениями списка исключений -->
		<prop key='wordExclusionsList' val='$UpdatableCensorFilter' />
	</bean>
	
	<!-- 
			Секция расширенной настройки
	 -->
	 
	<!-- Главный компонент сервера. Этот компонент следит за жизненным циклом и производит дополнительную
	настройку сервера -->
	<ctor id='ServerComponent' class='com.web_visage.ichatserv.admin.AdministratableIChatServer' initializer='init' starter='start' stopper='stop' disposer='dispose' singleton='true'>
		<arg ind='0' val='$configuration' />
	</ctor>

	<!-- Компонент обновляемого списка паттернов -->
	<ctor id='WordPatternsList' class='com.web_visage.ichatserv.censor.WordPatternsList' singleton='true'>
		<arg ind='0' val='./wordpatterns.txt'/>
	</ctor>	
    
	<!-- Используемая фабрика сообщений -->
	<method id='MessageFactory' class='com.web_visage.ichat.DefaultMessageFactory' name='getSingleton' />
	<!-- Для версии от John Do эта строчка может выглядеть так (необходимо раскомментировать перед
	использованием): -->
	<!-- ctor id='MessageFactory' class='com.web_visage.ichat.JohnDoFactory' /-->
	
	<!-- Таблица связей для хранений клиентских соединений, должна быть подвидом Map<ClientDescriptor, ClientHandler> -->
	<ctor id='ClientRegistry' class='java.util.concurrent.ConcurrentHashMap' params='int,float,int'>
		<!-- начальная ёмкость таблицы -->
		<arg ind='0' val='50' />
		<!-- коэффициент загрузки (по достижении которого в таблице резервируются новые ячейки) -->
		<arg ind='1' val='0.75' />
		<!-- ожидаемоме количество использующих таблицу потоков,
		должно быть равным maxThreadPoolSize + 1 -->
		<arg ind='2' val='11' />
	</ctor>
	
	<!-- Таблица связей для хранения зарегестрированных соединений, должна быть подвидом Map<IChatSender, ClientDescriptor> -->
	<ctor id='RegisteredClientsRegistry' class='java.util.concurrent.ConcurrentHashMap' params='int,float,int'>
		<!-- начальная ёмкость таблицы -->
		<arg ind='0' val='50' />
		<!-- коэффициент загрузки (по достижении которого в таблице резервируются новые ячейки) -->
		<arg ind='1' val='0.75' />
		<!-- ожидаемоме количество использующих таблицу потоков,
		должно быть равным maxThreadPoolSize + 1 -->
		<arg ind='2' val='11' />
	</ctor>
	
	<!-- Обработчик входящих сообщений -->
	<ctor id='MessageHandler' class='com.web_visage.ichatserv.admin.RemoteAdminMessageHandler'>
		<arg ind='0' val='$configuration' />
		<arg ind='1' val='$MessageFactory' />
		<arg ind='2' val='$ClientRegistry' />
		<arg ind='3' val='$RegisteredClientsRegistry' />
		<arg ind='4' val='$SpecificationToActionMapper' />
	</ctor>
	
	<!-- 
		Компонент мат-фильтра. Получает из файла список паттернов нецензурной брани, в случае
		совпадения заменяет на указанную строку
	 -->
	<ctor id='UpdatableCensorFilter' class='com.web_visage.ichatserv.censor.UpdatableCensorFilter' >
		<!-- Строка, на которую будет заменено нецензурное выражение -->
		<arg ind='0' val=':censored:' />		
		<!-- файл с паттернами нецензурной брани -->
		<arg ind='1' val='./wordpatterns.txt' />
	</ctor>
	
	<!--
		Карта соответствия спецификация->компонент. Описывает выполнение условий какой спецификации
		должно приводить к запуску которого компонента
		
		map(
	      spec-> {action ( filter, filter, ..., filter ) , ..., action(..) },
	      spec-> { action(...), ... , action(...)}
	     )
	-->
	<sequence id='SpecificationToActionMapper'>
		<ctor var='Spec' class='com.web_visage.ichatserv.action.DummySpec' />
		<ctor var='SpecMap' class='java.util.HashMap' params='' />
		<array var='ActionArr' type='com.web_visage.ichatserv.action.MessageAction[]'>
			<ctor class='com.web_visage.ichatserv.action.FilterAction' >
				<arg ind='0' val='$UpdatableCensorFilter' />
			</ctor>
		</array>
		<method name='put' args='$Spec,$ActionArr' component='SpecMap' />
		<return val='$SpecMap' />
	</sequence>
	

</body>
</module>