<?xml version="1.0" encoding="UTF-8"?>
<beans
		xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
			http://www.springframework.org/schema/tx
			http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<!-- Enforce @Required annotations -->
	<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

	<bean id="testFormController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="test-form" />
	</bean>

	<bean id="aboutController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="legal-about" />
	</bean>

	<bean id="licenseController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="legal-license" />
	</bean>
	
	<bean id="articleAddValidator" class="com.randomcoder.article.ArticleAddValidator">
		<property name="articleDao" ref="articleDao" />
		<property name="contentFilter" ref="contentFilter" />
	</bean>

	<bean id="articleEditValidator" class="com.randomcoder.article.ArticleEditValidator" parent="articleAddValidator" />

	<bean id="commentValidator" class="com.randomcoder.article.CommentValidator">
		<property name="contentFilter" ref="contentFilter" />
	</bean>
	
	<bean id="abstractArticleListController" abstract="true">
		<property name="commandClass" value="com.randomcoder.article.ArticlePageCommand" />
		<property name="viewName" value="home" />
		<property name="articleDao" ref="articleDao" />
		<property name="defaultPageSize" value="10" />
		<property name="maximumPageSize" value="50" />
		<property name="contentFilter" ref="contentFilter" />	
		<property name="tagBusiness" ref="tagBusiness" />	
	</bean>
	
	<bean id="homeController" class="com.randomcoder.article.HomeController" parent="abstractArticleListController" />
		
	<bean id="articleTagListController" class="com.randomcoder.article.ArticleTagListController" parent="abstractArticleListController">
		<property name="commandClass" value="com.randomcoder.article.ArticleTagPageCommand" />
		<property name="tagDao" ref="tagDao" />
		<property name="urlPrefix" value="/tags/" />
		<property name="viewName" value="article-tag-list" />
	</bean>
	
	<bean id="abstractSingleArticleController" abstract="true">
		<property name="formView" value="article-view" />
		<property name="successView" value="article-view" />
		<property name="articleDao" ref="articleDao" />
		<property name="articleBusiness" ref="articleBusiness" />
		<property name="contentFilter" ref="contentFilter" />	
		<property name="commandClass" value="com.randomcoder.article.CommentCommand" />
		<property name="validator" ref="commentValidator" />
	</bean>
	
	<bean id="articleIdController" class="com.randomcoder.article.ArticleIdController" parent="abstractSingleArticleController">
		<property name="urlPrefix" value="/articles/id/" />
	</bean>

	<bean id="articlePermalinkController" class="com.randomcoder.article.ArticlePermalinkController" parent="abstractSingleArticleController">
		<property name="urlPrefix" value="/articles/" />
	</bean>

	<bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="login" />
	</bean>
	
	<bean id="loginErrorController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="login-error" />
	</bean>

	<bean id="logoutController" class="com.randomcoder.security.LogoutController">
		<property name="viewName" value="logout-done" />
	</bean>

	<bean id="abstractArticleController" abstract="true">
		<property name="successView" value="default" />
		<property name="cancelView" value="default" />
		<property name="cancelParamKey" value="cancel" />
		<property name="bindOnNewForm" value="true" />
		<property name="articleBusiness" ref="articleBusiness" />
		<property name="tagDao" ref="tagDao" />
	</bean>
	
	<bean id="articleAddController" class="com.randomcoder.article.ArticleAddController" parent="abstractArticleController">
		<property name="formView" value="article-add" />
		<property name="commandClass" value="com.randomcoder.article.ArticleAddCommand" />
		<property name="validator" ref="articleAddValidator" />
	</bean>

	<bean id="articleEditController" class="com.randomcoder.article.ArticleEditController" parent="abstractArticleController">
		<property name="formView" value="article-edit" />
		<property name="commandClass" value="com.randomcoder.article.ArticleEditCommand" />
		<property name="validator" ref="articleEditValidator" />
	</bean>
	
	<bean id="articleDeleteController" class="com.randomcoder.article.ArticleDeleteController">
		<property name="viewName" value="default" />
		<property name="commandClass" value="com.randomcoder.springmvc.IdCommand" />
		<property name="articleBusiness" ref="articleBusiness" />
	</bean>
	
	<bean id="userAddValidator" class="com.randomcoder.user.UserAddValidator">
		<property name="userDao" ref="userDao" />
	</bean>

	<bean id="userEditValidator" class="com.randomcoder.user.UserEditValidator" parent="userAddValidator" />
	
	<bean id="changePasswordController" class="com.randomcoder.user.ChangePasswordController">
		<property name="formView" value="change-password" />
		<property name="successView" value="default" />
		<property name="cancelView" value="default" />
		<property name="cancelParamKey" value="cancel" />
		<property name="bindOnNewForm" value="true" />
		<property name="commandClass" value="com.randomcoder.user.ChangePasswordCommand" />
		<property name="validator" ref="changePasswordValidator" />
		<property name="userDao" ref="userDao" />
		<property name="userBusiness" ref="userBusiness" />
	</bean>

	<bean id="changePasswordValidator" class="com.randomcoder.user.ChangePasswordValidator">
		<property name="minimumPasswordLength" value="5" />
	</bean>
	
	<bean id="userListController" class="com.randomcoder.user.UserListController">
		<property name="commandClass" value="com.randomcoder.user.UserListCommand" />
		<property name="viewName" value="user-list" />
		<property name="userDao" ref="userDao" />
	</bean>
		
	<bean id="abstractUserController" abstract="true">
		<property name="successView" value="user-list-redirect" />
		<property name="cancelView" value="user-list-redirect" />
		<property name="cancelParamKey" value="cancel" />
		<property name="bindOnNewForm" value="true" />
		<property name="userBusiness" ref="userBusiness" />
		<property name="roleDao" ref="roleDao" />
	</bean>
		
	<bean id="userAddController" class="com.randomcoder.user.UserAddController" parent="abstractUserController">
		<property name="formView" value="user-add" />
		<property name="commandClass" value="com.randomcoder.user.UserAddCommand" />
		<property name="validator" ref="userAddValidator" />
	</bean>
		
	<bean id="userEditController" class="com.randomcoder.user.UserEditController" parent="abstractUserController">
		<property name="formView" value="user-edit" />
		<property name="commandClass" value="com.randomcoder.user.UserEditCommand" />
		<property name="validator" ref="userEditValidator" />
	</bean>
			
	<bean id="userDeleteController" class="com.randomcoder.user.UserDeleteController">
		<property name="viewName" value="user-list-redirect" />
		<property name="commandClass" value="com.randomcoder.springmvc.IdCommand" />
		<property name="userBusiness" ref="userBusiness" />
	</bean>
	
	<bean id="tagAddValidator" class="com.randomcoder.tag.TagAddValidator">
		<property name="tagDao" ref="tagDao" />
	</bean>

	<bean id="tagEditValidator" class="com.randomcoder.tag.TagEditValidator" parent="tagAddValidator" />
	
	<bean id="tagListController" class="com.randomcoder.tag.TagListController">
		<property name="commandClass" value="com.randomcoder.tag.TagListCommand" />
		<property name="viewName" value="tag-list" />
		<property name="tagDao" ref="tagDao" />
	</bean>
		
	<bean id="abstractTagController" abstract="true">
		<property name="successView" value="tag-list-redirect" />
		<property name="cancelView" value="tag-list-redirect" />
		<property name="cancelParamKey" value="cancel" />
		<property name="bindOnNewForm" value="true" />
		<property name="tagBusiness" ref="tagBusiness" />
	</bean>

	<bean id="tagAddController" class="com.randomcoder.tag.TagAddController" parent="abstractTagController">
		<property name="formView" value="tag-add" />
		<property name="commandClass" value="com.randomcoder.tag.TagAddCommand" />
		<property name="validator" ref="tagAddValidator" />
	</bean>
		
	<bean id="tagEditController" class="com.randomcoder.tag.TagEditController" parent="abstractTagController">
		<property name="formView" value="tag-edit" />
		<property name="commandClass" value="com.randomcoder.tag.TagEditCommand" />
		<property name="validator" ref="tagEditValidator" />
	</bean>
		
	<bean id="tagDeleteController" class="com.randomcoder.tag.TagDeleteController">
		<property name="viewName" value="tag-list-redirect" />
		<property name="commandClass" value="com.randomcoder.springmvc.IdCommand" />
		<property name="tagBusiness" ref="tagBusiness" />
	</bean>
		
	<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="alwaysUseFullPath" value="true" />
		<property name="mappings">
			<props>
				<prop key="/home">homeController</prop>
				<prop key="/login">loginController</prop>
				<prop key="/login-error">loginErrorController</prop>
				<prop key="/logout">logoutController</prop>
				<prop key="/article/add">articleAddController</prop>
				<prop key="/article/edit">articleEditController</prop>
				<prop key="/article/delete">articleDeleteController</prop>
				<prop key="/articles/id/*">articleIdController</prop>
				<prop key="/articles/*">articlePermalinkController</prop>
				<prop key="/tags/*">articleTagListController</prop>
				<prop key="/legal/about">aboutController</prop>
				<prop key="/legal/license">licenseController</prop>
				<prop key="/user">userListController</prop>
				<prop key="/user/add">userAddController</prop>
				<prop key="/user/edit">userEditController</prop>
				<prop key="/user/delete">userDeleteController</prop>
				<prop key="/user/change-password">changePasswordController</prop>
				<prop key="/tag">tagListController</prop>
				<prop key="/tag/add">tagAddController</prop>
				<prop key="/tag/edit">tagEditController</prop>
				<prop key="/tag/delete">tagDeleteController</prop>
				<prop key="/test/form">testFormController</prop>
			</props>
		</property>
	</bean>
    
	<bean id="xmlViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
		<property name="order" value="0" />
		<property name="location" value="/WEB-INF/views.xml" />
	</bean>

	<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp"/>
	</bean>
	
</beans>
