androidpn server 启动日志分析

时间:2021-11-21 17:29:52

androidpn (Android Push Notification)是一个基于XMPP协议的java开源Android push notification实现。

它包含了完整的客户端和服务器端。

本文是在Tomcat下部署 androidpn server的启动日志的分析。


# tail -f logs/catalina.out 


#启动Tomcat的服务:对应tomcat/conf/server.xml中的    <Service name="Catalina">
May 04, 2014 2:55:59 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina


#启动 Tomcat servlet 引擎:对应 tomcat/conf/server.xml中的  <Engine name="Catalina" defaultHost="localhost">
May 04, 2014 2:55:59 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.39


#部署ROOT目录

May 04, 2014 2:56:03 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /app/apache-tomcat-7.0.39/webapps/ROOT

#验证jar包
May 04, 2014 2:56:03 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/app/apache-tomcat-7.0.39/webapps/ROOT/WEB-INF/lib/el-api-6.0.29.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class


May 04, 2014 2:56:03 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/app/apache-tomcat-7.0.39/webapps/ROOT/WEB-INF/lib/jsp-api-2.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class


May 04, 2014 2:56:03 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/app/apache-tomcat-7.0.39/webapps/ROOT/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

#Spring ContextLoaderListener初始化开始
{INFO } [2014-05-04 14:56:04,977] <org.springframework.web.context.ContextLoader> : Root WebApplicationContext: initialization started

#使用 XmlWebApplicationContext ,XmlWebApplicationContext实现了WebApplicationContext接口,当前的servlet用它来创建上下文。

如果之后还有其他继承的上下文的时候,这里创建的context作为内容上下文的根,称为 ROOT

#实际名称为  org.springframework.web.context.WebApplicationContext.ROOT

{INFO } [2014-05-04 14:56:05,001] <org.springframework.web.context.support.XmlWebApplicationContext> : Refreshing Root WebApplicationContext: startup date [Sun May 04 14:56:05 CST 2014]; root of context hierarchy


#开始加载web.xml 中 <context-param>标签 contextConfigLocation 配置的文件 
{INFO } [2014-05-04 14:56:05,035] <org.springframework.beans.factory.xml.XmlBeanDefinitionReader> : Loading XML bean definitions from class path resource [conf/application-context.xml]


#开始加载 application-context.xml 中import引用的配置文件
{INFO } [2014-05-04 14:56:05,219] <org.springframework.beans.factory.xml.XmlBeanDefinitionReader> : Loading XML bean definitions from class path resource [conf/rest/rest-component-config.xml]

#IoC容器的实现类,列出所有的spring中配置的bean id,这些bean在 ROOT context上下文中
{INFO } [2014-05-04 14:56:05,326] <org.springframework.beans.factory.support.DefaultListableBeanFactory> : Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@14562294: defining beans [component,application,router,get,post]; root of factory hierarchy

#Spring ContextLoaderListener初始化完成
{INFO } [2014-05-04 14:56:05,408] <org.springframework.web.context.ContextLoader> : Root WebApplicationContext: initialization completed in 430 ms

#开始初始化 dispatcher
{INFO } [2014-05-04 14:56:05,446] <org.springframework.web.servlet.DispatcherServlet> : FrameworkServlet 'dispatcher': initialization started

#使用 XmlWebApplicationContext ,XmlWebApplicationContext实现了WebApplicationContext接口,当前的servlet用它来创建上下文。

#上级context上下文是 Root WebApplicationContext
{INFO } [2014-05-04 14:56:05,448] <org.springframework.web.context.support.XmlWebApplicationContext> : Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun May 04 14:56:05 CST 2014]; parent: Root WebApplicationContext

#加载 dispatcher-servlet.xml
{INFO } [2014-05-04 14:56:05,448] <org.springframework.beans.factory.xml.XmlBeanDefinitionReader> : Loading XML bean definitions from ServletContext resource [/WEB-INF/dispatcher-servlet.xml]


IoC容器的实现类,列出所有的dispatcher-servlet中配置的bean id,上级的Ioc容器是在Spring中创建的。

{INFO } [2014-05-04 14:56:05,500] <org.springframework.beans.factory.support.DefaultListableBeanFactory> : Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2604a07d: defining beans [urlMapping,filenameController,userController,sessionController,notificationController,paramResolver,viewResolver,messageSource]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@14562294

#发现NotificationController中的方法
{DEBUG} [2014-05-04 14:56:05,526] <org.androidpn.server.console.controller.NotificationController> : Found action method [public org.springframework.web.servlet.ModelAndView org.androidpn.server.console.controller.NotificationController.send(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]
{DEBUG} [2014-05-04 14:56:05,526] <org.androidpn.server.console.controller.NotificationController> : Found action method [public org.springframework.web.servlet.ModelAndView org.androidpn.server.console.controller.NotificationController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]


#此处实例化NotificationController ,调用 NotificationController 的无参数构造方法。

NotificationController无参构造方法实例化 NotificationManager

NotificationManager无参构造方法实例化  SessionManager

#SessionManager无参数构造方法实例化 XmppServer

XmppServer 无参构造方法实例化并调用start()方法,初始化服务的路径读取配置文件.

#通过 Config 代理并实例化 ConfigManager 加载 config.xml

{DEBUG} [2014-05-04 14:56:05,580] <org.apache.commons.configuration.ConfigurationUtils> : ConfigurationUtils.locate(): base is /app/apache-tomcat-7.0.39, name is config.xml
{DEBUG} [2014-05-04 14:56:05,596] <org.apache.commons.configuration.ConfigurationUtils> : Loading configuration from the context classpath (config.xml)


#加载  config.xml中的配置文件 config.properties
{DEBUG} [2014-05-04 14:56:05,693] <org.apache.commons.configuration.ConfigurationUtils> : ConfigurationUtils.locate(): base is /app/apache-tomcat-7.0.39, name is config.properties
{DEBUG} [2014-05-04 14:56:05,693] <org.apache.commons.configuration.ConfigurationUtils> : Loading configuration from the context classpath (config.properties)


#config.xml加载完毕

{INFO } [2014-05-04 14:56:05,702] <org.androidpn.server.util.ConfigManager> : Configuration loaded: config.xml


#用 ClassPathXmlApplicationContext 加载 spring-config.xml配置文件
{INFO } [2014-05-04 14:56:05,712] <org.springframework.context.support.ClassPathXmlApplicationContext> : Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@359d9606: startup date [Sun May 04 14:56:05 CST 2014]; root of context hierarchy
{INFO } [2014-05-04 14:56:05,713] <org.springframework.beans.factory.xml.XmlBeanDefinitionReader> : Loading XML bean definitions from class path resource [spring-config.xml]


#加载 spring-config.xml 文件中的 jdbc.properties 配置文件。
{INFO } [2014-05-04 14:56:05,813] <org.springframework.beans.factory.config.PropertyPlaceholderConfigurer> : Loading properties file from class path resource [jdbc.properties]


# MINA Socket 配置
{WARN } [2014-05-04 14:56:05,830] <org.springframework.beans.factory.config.CustomEditorConfigurer> : Passing PropertyEditor instances into CustomEditorConfigurer is deprecated: use PropertyEditorRegistrars or PropertyEditor class names instead. Offending key [java.net.SocketAddress; offending editor instance: org.apache.mina.integration.beans.InetSocketAddressEditor@67b7d0fb


# Ioc 列表Spring beans id

{INFO } [2014-05-04 14:56:05,838] <org.springframework.beans.factory.support.DefaultListableBeanFactory> : Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@243e2c21: defining beans [propertyConfigurer,dataSource,sessionFactory,transactionManager,userDao,userService,org.springframework.beans.factory.config.CustomEditorConfigurer#0,xmppHandler,filterChainBuilder,ioAcceptor]; root of factory hierarchy

(这里的Spring applicationContext 与前面的applicationContext没有任何关系,是独立的。两个上下文中的bean不可见,修改的方法见 http://blog.csdn.net/teamlet/article/details/26476671 )

#实例化beans
{INFO } [2014-05-04 14:56:05,928] <org.hibernate.cfg.annotations.Version> : Hibernate Annotations 3.4.0.GA
{INFO } [2014-05-04 14:56:05,936] <org.hibernate.cfg.Environment> : Hibernate 3.3.1.GA
{INFO } [2014-05-04 14:56:05,939] <org.hibernate.cfg.Environment> : hibernate.properties not found
{INFO } [2014-05-04 14:56:05,942] <org.hibernate.cfg.Environment> : Bytecode provider name : javassist
{INFO } [2014-05-04 14:56:05,945] <org.hibernate.cfg.Environment> : using JDK 1.4 java.sql.Timestamp handling
{INFO } [2014-05-04 14:56:06,020] <org.hibernate.annotations.common.Version> : Hibernate Commons Annotations 3.1.0.GA
{INFO } [2014-05-04 14:56:06,031] <org.hibernate.cfg.Configuration> : configuring from url: file:/data/apache-tomcat-7.0.39/webapps/ROOT/WEB-INF/classes/hibernate.cfg.xml
{INFO } [2014-05-04 14:56:06,122] <org.hibernate.cfg.Configuration> : Configured SessionFactory: null
{INFO } [2014-05-04 14:56:06,156] <org.hibernate.cfg.AnnotationBinder> : Binding entity from annotated class: org.androidpn.server.model.User
{INFO } [2014-05-04 14:56:06,184] <org.hibernate.cfg.annotations.EntityBinder> : Bind entity org.androidpn.server.model.User on table apn_user
{INFO } [2014-05-04 14:56:06,221] <org.hibernate.cfg.AnnotationConfiguration> : Hibernate Validator not found: ignoring
{INFO } [2014-05-04 14:56:06,222] <org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean> : Building new Hibernate SessionFactory
{INFO } [2014-05-04 14:56:06,224] <org.hibernate.cfg.search.HibernateSearchEventListenerRegister> : Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
{INFO } [2014-05-04 14:56:06,263] <org.hibernate.connection.ConnectionProviderFactory> : Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
{INFO } [2014-05-04 14:56:06,439] <org.hibernate.cfg.SettingsFactory> : RDBMS: MySQL, version: 5.5.33-log
{INFO } [2014-05-04 14:56:06,439] <org.hibernate.cfg.SettingsFactory> : JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
{INFO } [2014-05-04 14:56:06,449] <org.hibernate.dialect.Dialect> : Using dialect: org.hibernate.dialect.MySQLDialect
{INFO } [2014-05-04 14:56:06,452] <org.hibernate.transaction.TransactionFactoryFactory> : Transaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.transaction.TransactionManagerLookupFactory> : No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.cfg.SettingsFactory> : Automatic flush during beforeCompletion(): disabled
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.cfg.SettingsFactory> : Automatic session close at end of transaction: disabled
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.cfg.SettingsFactory> : JDBC batch size: 15
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.cfg.SettingsFactory> : JDBC batch updates for versioned data: disabled
{INFO } [2014-05-04 14:56:06,453] <org.hibernate.cfg.SettingsFactory> : Scrollable result sets: enabled
{INFO } [2014-05-04 14:56:06,454] <org.hibernate.cfg.SettingsFactory> : JDBC3 getGeneratedKeys(): enabled
{INFO } [2014-05-04 14:56:06,454] <org.hibernate.cfg.SettingsFactory> : Connection release mode: auto
{INFO } [2014-05-04 14:56:06,454] <org.hibernate.cfg.SettingsFactory> : Maximum outer join fetch depth: 2
{INFO } [2014-05-04 14:56:06,454] <org.hibernate.cfg.SettingsFactory> : Default batch fetch size: 1
{INFO } [2014-05-04 14:56:06,454] <org.hibernate.cfg.SettingsFactory> : Generate SQL with comments: enabled
{INFO } [2014-05-04 14:56:06,455] <org.hibernate.cfg.SettingsFactory> : Order SQL updates by primary key: disabled
{INFO } [2014-05-04 14:56:06,455] <org.hibernate.cfg.SettingsFactory> : Order SQL inserts for batching: disabled
{INFO } [2014-05-04 14:56:06,455] <org.hibernate.cfg.SettingsFactory> : Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
{INFO } [2014-05-04 14:56:06,456] <org.hibernate.hql.ast.ASTQueryTranslatorFactory> : Using ASTQueryTranslatorFactory
{INFO } [2014-05-04 14:56:06,456] <org.hibernate.cfg.SettingsFactory> : Query language substitutions: {}
{INFO } [2014-05-04 14:56:06,456] <org.hibernate.cfg.SettingsFactory> : JPA-QL strict compliance: disabled
{INFO } [2014-05-04 14:56:06,456] <org.hibernate.cfg.SettingsFactory> : Second-level cache: enabled
{INFO } [2014-05-04 14:56:06,457] <org.hibernate.cfg.SettingsFactory> : Query cache: disabled
{INFO } [2014-05-04 14:56:06,460] <org.hibernate.cfg.SettingsFactory> : Cache region factory : org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge
{INFO } [2014-05-04 14:56:06,460] <org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge> : Cache provider: net.sf.ehcache.hibernate.EhCacheProvider
{INFO } [2014-05-04 14:56:06,462] <org.hibernate.cfg.SettingsFactory> : Optimize cache for minimal puts: disabled
{INFO } [2014-05-04 14:56:06,462] <org.hibernate.cfg.SettingsFactory> : Structured second-level cache entries: disabled
{INFO } [2014-05-04 14:56:06,465] <org.hibernate.cfg.SettingsFactory> : Echoing all SQL to stdout
{INFO } [2014-05-04 14:56:06,466] <org.hibernate.cfg.SettingsFactory> : Statistics: disabled
{INFO } [2014-05-04 14:56:06,466] <org.hibernate.cfg.SettingsFactory> : Deleted entity synthetic identifier rollback: disabled
{INFO } [2014-05-04 14:56:06,466] <org.hibernate.cfg.SettingsFactory> : Default entity-mode: pojo
{INFO } [2014-05-04 14:56:06,466] <org.hibernate.cfg.SettingsFactory> : Named query checking : enabled
{INFO } [2014-05-04 14:56:06,488] <org.hibernate.impl.SessionFactoryImpl> : building session factory
{INFO } [2014-05-04 14:56:06,659] <org.hibernate.impl.SessionFactoryObjectFactory> : Not binding factory to JNDI, no JNDI name configured
{INFO } [2014-05-04 14:56:06,664] <org.hibernate.tool.hbm2ddl.SchemaUpdate> : Running hbm2ddl schema update
{INFO } [2014-05-04 14:56:06,664] <org.hibernate.tool.hbm2ddl.SchemaUpdate> : fetching database metadata
{INFO } [2014-05-04 14:56:06,665] <org.hibernate.tool.hbm2ddl.SchemaUpdate> : updating schema
{INFO } [2014-05-04 14:56:06,678] <org.hibernate.tool.hbm2ddl.TableMetadata> : table found: apn.apn_user
{INFO } [2014-05-04 14:56:06,678] <org.hibernate.tool.hbm2ddl.TableMetadata> : columns: [created_date, id, username, updated_date, email, name, password]
{INFO } [2014-05-04 14:56:06,678] <org.hibernate.tool.hbm2ddl.TableMetadata> : foreign keys: []
{INFO } [2014-05-04 14:56:06,678] <org.hibernate.tool.hbm2ddl.TableMetadata> : indexes: [username, primary]
{INFO } [2014-05-04 14:56:06,679] <org.hibernate.tool.hbm2ddl.SchemaUpdate> : schema update complete
{INFO } [2014-05-04 14:56:06,703] <org.springframework.orm.hibernate3.HibernateTransactionManager> : Using DataSource [org.apache.commons.dbcp.BasicDataSource@588d16eb] of Hibernate SessionFactory for HibernateTransactionManager
{DEBUG} [2014-05-04 14:56:06,802] <org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder> : LinkedHashMap is an ordered map.
{INFO } [2014-05-04 14:56:06,836] <org.androidpn.server.xmpp.XmppServer> : Spring Configuration loaded.
{INFO } [2014-05-04 14:56:06,836] <org.androidpn.server.xmpp.XmppServer> : XmppServer started: 127.0.0.1
{INFO } [2014-05-04 14:56:06,836] <org.androidpn.server.xmpp.XmppServer> : Androidpn Server v0.5.0
{DEBUG} [2014-05-04 14:56:06,892] <org.androidpn.server.console.controller.UserController> : Found action method [public org.springframework.web.servlet.ModelAndView org.androidpn.server.console.controller.UserController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]
{DEBUG} [2014-05-04 14:56:06,906] <org.androidpn.server.console.controller.SessionController> : Found action method [public org.springframework.web.servlet.ModelAndView org.androidpn.server.console.controller.SessionController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception]

dispatcher 初始化完毕。
{INFO } [2014-05-04 14:56:06,937] <org.springframework.web.servlet.DispatcherServlet> : FrameworkServlet 'dispatcher': initialization completed in 1490 ms

# 对应 tomcat/conf/server.xml中的 Connector 8080端口
May 04, 2014 2:56:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]

# 对应 tomcat/conf/server.xml中的 Connector 8009端口
May 04, 2014 2:56:09 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]

# 对应 tomcat/conf/server.xml中的 Server
May 04, 2014 2:56:09 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 9459 ms


<启动完成>


web.xml中的部分内容:


        <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:conf/application-context.xml
                 </param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

dispatcher-servlet.xml内容:

	<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<value>
				/index.do=filenameController
				/user.do=userController
				/session.do=sessionController
				/notification.do=notificationController				
			</value>
		</property>
		<property name="order" value="1" />
	</bean>

	<bean id="filenameController"
		class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

	<bean id="userController" class="org.androidpn.server.console.controller.UserController">
		<property name="methodNameResolver" ref="paramResolver" />
	</bean>

	<bean id="sessionController"
		class="org.androidpn.server.console.controller.SessionController">
		<property name="methodNameResolver" ref="paramResolver" />
	</bean>

	<bean id="notificationController"
		class="org.androidpn.server.console.controller.NotificationController">
		<property name="methodNameResolver" ref="paramResolver" />
	</bean>

	<bean id="paramResolver"
		class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
		<property name="paramName" value="action" />
		<property name="defaultMethodName" value="list" />
	</bean>

	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="requestContextAttribute" value="rc" />
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/page/" />
		<property name="suffix" value=".jsp" />
	</bean>

	<!--
		<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings"> <props> <prop
		key="java.lang.Exception">error</prop> </props> </property> </bean>
	-->

	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages" />
		<property name="useCodeAsDefaultMessage" value="true" />
	</bean>

config.xml内容

<configuration>
	<system />
	<properties fileName="config.properties" />
</configuration>

spring-config.xml内容:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">


	<!-- =============================================================== -->
	<!-- Resources                                                       -->
	<!-- =============================================================== -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
	</bean>

	<!-- =============================================================== -->
	<!-- Data Source                                                     -->
	<!-- =============================================================== -->

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbcDriverClassName}" />
		<property name="url" value="${jdbcUrl}" />
		<property name="username" value="${jdbcUsername}" />
		<property name="password" value="${jdbcPassword}" />
		<property name="maxActive" value="${jdbcMaxActive}" />
		<property name="maxIdle" value="${jdbcMaxIdle}" />
		<property name="maxWait" value="${jdbcMaxWait}" />
		<property name="defaultAutoCommit" value="true" />
	</bean>

	<!-- =============================================================== -->
	<!-- Hibernate                                                       -->
	<!-- =============================================================== -->

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:hibernate.cfg.xml" />
	</bean>

	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- =============================================================== -->
	<!-- Data Access Objects                                             -->
	<!-- =============================================================== -->

	<bean id="userDao" class="org.androidpn.server.dao.hibernate.UserDaoHibernate">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- =============================================================== -->
	<!-- Services                                                        -->
	<!-- =============================================================== -->

	<bean id="userService" class="org.androidpn.server.service.impl.UserServiceImpl">
		<property name="userDao" ref="userDao" />
	</bean>

	<!-- =============================================================== -->
	<!-- SSL                                                             -->
	<!-- =============================================================== -->

	<!--
	<bean id="tlsContextFactory"
		class="org.androidpn.server.ssl2.ResourceBasedTLSContextFactory">
		<constructor-arg value="classpath:bogus_mina_tls.cert" />
		<property name="password" value="boguspw" />
		<property name="trustManagerFactory">
			<bean class="org.androidpn.server.ssl2.BogusTrustManagerFactory" />
		</property>
	</bean>
	-->

	<!-- =============================================================== -->
	<!-- MINA                                                            -->
	<!-- =============================================================== -->

	<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.net.SocketAddress">
					<bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
				</entry>
			</map>
		</property>
	</bean>

	<bean id="xmppHandler" class="org.androidpn.server.xmpp.net.XmppIoHandler" />

	<bean id="filterChainBuilder"
		class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
		<property name="filters">
			<map>
				<entry key="executor">
					<bean class="org.apache.mina.filter.executor.ExecutorFilter" />
				</entry>
				<entry key="codec">
					<bean class="org.apache.mina.filter.codec.ProtocolCodecFilter">
						<constructor-arg>
							<bean class="org.androidpn.server.xmpp.codec.XmppCodecFactory" />
						</constructor-arg>
					</bean>
				</entry>
				<!--
				<entry key="logging">
					<bean class="org.apache.mina.filter.logging.LoggingFilter" />
				</entry>
				-->
			</map>
		</property>
	</bean>

	<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
		init-method="bind" destroy-method="unbind">
		<property name="defaultLocalAddress" value=":5222" />
		<property name="handler" ref="xmppHandler" />
		<property name="filterChainBuilder" ref="filterChainBuilder" />
		<property name="reuseAddress" value="true" />
	</bean>

</beans>