/*
 * Copyright 2004-2005 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */ 
package org.codehaus.groovy.grails.commons.spring;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang.WordUtils;
import org.codehaus.groovy.grails.commons.GrailsApplication;
import org.codehaus.groovy.grails.commons.GrailsControllerClass;
import org.codehaus.groovy.grails.commons.GrailsDataSource;
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.commons.GrailsPageFlowClass;
import org.codehaus.groovy.grails.commons.GrailsServiceClass;
import org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalsSessionFactoryBean;
import org.codehaus.groovy.grails.orm.hibernate.metaclass.HibernatePersistentMethods;
import org.codehaus.groovy.grails.orm.hibernate.support.HibernateDialectDetectorFactoryBean;
import org.codehaus.groovy.grails.orm.hibernate.validation.GrailsDomainClassValidator;
import org.codehaus.groovy.grails.support.ClassEditor;
import org.codehaus.groovy.grails.web.pageflow.GrailsFlowBuilder;
import org.codehaus.groovy.grails.web.pageflow.execution.servlet.GrailsServletFlowExecutionManager;
import org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController;
import org.hibernate.dialect.HSQLDialect;
import org.hibernate.dialect.MySQLDialect;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.interceptor.TransactionProxyFactoryBean;
import org.springframework.util.Assert;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.webflow.config.FlowFactoryBean;
import org.springframework.webflow.mvc.FlowController;
import org.springmodules.beans.factory.config.MapToPropertiesFactoryBean;
import org.springmodules.beans.factory.drivers.Bean;
import org.springmodules.db.hsqldb.ServerBean;

/**
 * <p>Creates beans and bean references for a Grails application.
 * 
 * @author Steven Devijver
 * @since Jul 2, 2005
 */
public class SpringConfig {

	private GrailsApplication application = null;
	
	public SpringConfig(GrailsApplication application) {
		super();
		this.application = application;
	}

	public Collection getBeanReferences() {
		Collection beanReferences = new ArrayList();
		Map urlMappings = new HashMap();
		
		Assert.notNull(application);
		
		GrailsPageFlowClass[] pageFlows = application.getPageFlows();
		for (int i = 0; i < pageFlows.length; i++) {
			GrailsPageFlowClass pageFlow = pageFlows[i];
			if (!pageFlow.getAvailable()) {
				continue;
			}
			Bean pageFlowClass = SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
			pageFlowClass.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
			pageFlowClass.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getPageFlow"));
			pageFlowClass.setProperty("arguments", SpringConfigUtils.createLiteralValue(pageFlow.getFullName()));
			beanReferences.add(SpringConfigUtils.createBeanReference(pageFlow.getFullName() + "Class", pageFlowClass));
			
			Bean pageFlowInstance = SpringConfigUtils.createSingletonBean();
			pageFlowInstance.setFactoryBean(SpringConfigUtils.createBeanReference(pageFlow.getFullName() + "Class"));
			pageFlowInstance.setFactoryMethod("newInstance");
			if (pageFlow.byType()) {
				pageFlowInstance.setAutowire("byType");
			} else if (pageFlow.byName()) {
				pageFlowInstance.setAutowire("byName");
			}
			beanReferences.add(SpringConfigUtils.createBeanReference(pageFlow.getFullName(), pageFlowInstance));
			
			Bean flowBuilder = SpringConfigUtils.createSingletonBean(GrailsFlowBuilder.class);
			flowBuilder.setProperty("pageFlowClass", SpringConfigUtils.createBeanReference(pageFlow.getFullName() + "Class"));
			
			Bean flowFactoryBean = SpringConfigUtils.createSingletonBean(FlowFactoryBean.class);
			flowFactoryBean.setProperty("flowBuilder", flowBuilder);
			beanReferences.add(SpringConfigUtils.createBeanReference(pageFlow.getFlowId(), flowFactoryBean));

			if (pageFlow.getAccessible()) {
				Bean flowExecutionManager = SpringConfigUtils.createSingletonBean(GrailsServletFlowExecutionManager.class);
				flowExecutionManager.setProperty("flow", SpringConfigUtils.createBeanReference(pageFlow.getFlowId()));
				
				Bean flowController = SpringConfigUtils.createSingletonBean(FlowController.class);
				flowController.setProperty("flowExecutionManager", flowExecutionManager);
				beanReferences.add(SpringConfigUtils.createBeanReference(pageFlow.getFullName() + "Controller", flowController));
				
				urlMappings.put(pageFlow.getUri(), pageFlow.getFullName() + "Controller");
			}
			
		}
		
		Bean simpleGrailsController = SpringConfigUtils.createSingletonBean(SimpleGrailsController.class);
		simpleGrailsController.setAutowire("byType");
		beanReferences.add(SpringConfigUtils.createBeanReference("simpleGrailsController", simpleGrailsController));
		
		Bean internalResourceViewResolver = SpringConfigUtils.createSingletonBean(InternalResourceViewResolver.class);
		internalResourceViewResolver.setProperty("prefix", SpringConfigUtils.createLiteralValue("/WEB-INF/jsp/"));
		internalResourceViewResolver.setProperty("suffix", SpringConfigUtils.createLiteralValue(".jsp"));
		beanReferences.add(SpringConfigUtils.createBeanReference("jspViewResolver", internalResourceViewResolver));
		
		Bean simpleUrlHandlerMapping = null;
		if (application.getControllers().length > 0 || application.getPageFlows().length > 0) {
			simpleUrlHandlerMapping = SpringConfigUtils.createSingletonBean(SimpleUrlHandlerMapping.class);
			beanReferences.add(SpringConfigUtils.createBeanReference("handlerMapping", simpleUrlHandlerMapping));
		}
		
		GrailsControllerClass[] simpleControllers = application.getControllers();
		for (int i = 0; i < simpleControllers.length; i++) {
			GrailsControllerClass simpleController = simpleControllers[i];
			if (!simpleController.getAvailable()) {
				continue;
			}
			Bean controllerClass = SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
			controllerClass.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
			controllerClass.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getController"));
			controllerClass.setProperty("arguments", SpringConfigUtils.createLiteralValue(simpleController.getFullName()));
			beanReferences.add(SpringConfigUtils.createBeanReference(simpleController.getFullName() + "Class", controllerClass));
			
			Bean controller = SpringConfigUtils.createSingletonBean();
			controller.setFactoryBean(SpringConfigUtils.createBeanReference(simpleController.getFullName() + "Class"));
			controller.setFactoryMethod("newInstance");
			if (simpleController.byType()) {
				controller.setAutowire("byType");
			} else if (simpleController.byName()) {
				controller.setAutowire("byName");
			}
			beanReferences.add(SpringConfigUtils.createBeanReference(simpleController.getFullName(), controller));
			for (int x = 0; x < simpleController.getURIs().length; x++) {
				urlMappings.put(simpleController.getURIs()[x], "simpleGrailsController");
			}
		}

		if (simpleUrlHandlerMapping != null) {
			simpleUrlHandlerMapping.setProperty("mappings", SpringConfigUtils.createProperties(urlMappings));
		}

		boolean dependsOnHsqldbServer = false;
		if (application.getGrailsDataSource() != null) {
			GrailsDataSource grailsDataSource = application.getGrailsDataSource();
			Bean dataSource = null;
			if (grailsDataSource.isPooled()) {
				dataSource = SpringConfigUtils.createSingletonBean(BasicDataSource.class);
				dataSource.setDestroyMethod("close");
			} else {
				dataSource = SpringConfigUtils.createSingletonBean(DriverManagerDataSource.class);
			}
			dataSource.setProperty("driverClassName", SpringConfigUtils.createLiteralValue(grailsDataSource.getDriverClassName()));
			dataSource.setProperty("url", SpringConfigUtils.createLiteralValue(grailsDataSource.getUrl()));
			dataSource.setProperty("username", SpringConfigUtils.createLiteralValue(grailsDataSource.getUsername()));
			dataSource.setProperty("password", SpringConfigUtils.createLiteralValue(grailsDataSource.getPassword()));	
			beanReferences.add(SpringConfigUtils.createBeanReference("dataSource", dataSource));
		} else {
			Bean dataSource = SpringConfigUtils.createSingletonBean(BasicDataSource.class);
			dataSource.setDestroyMethod("close");
			dataSource.setProperty("driverClassName", SpringConfigUtils.createLiteralValue("org.hsqldb.jdbcDriver"));
			dataSource.setProperty("url", SpringConfigUtils.createLiteralValue("jdbc:hsqldb:hsql://localhost:9101/"));
			dataSource.setProperty("username", SpringConfigUtils.createLiteralValue("sa"));
			dataSource.setProperty("password", SpringConfigUtils.createLiteralValue(""));
			beanReferences.add(SpringConfigUtils.createBeanReference("dataSource", dataSource));
			
			Bean hsqldbServer = SpringConfigUtils.createSingletonBean(ServerBean.class);
			hsqldbServer.setProperty("dataSource", SpringConfigUtils.createBeanReference("dataSource"));
			Map hsqldbProperties = new HashMap();
			hsqldbProperties.put("server.port", "9101");
			hsqldbProperties.put("server.database.0", "mem:temp");
			hsqldbServer.setProperty("serverProperties", SpringConfigUtils.createProperties(hsqldbProperties));
			beanReferences.add(SpringConfigUtils.createBeanReference("hsqldbServer", hsqldbServer));
			dependsOnHsqldbServer = true;
		}
		
		Map vendorNameDialectMappings = new HashMap();
		vendorNameDialectMappings.put("HSQL Database Engine", HSQLDialect.class.getName());
		vendorNameDialectMappings.put("MySQL", MySQLDialect.class.getName());
			
		Bean dialectDetector = SpringConfigUtils.createSingletonBean(HibernateDialectDetectorFactoryBean.class);
		dialectDetector.setProperty("dataSource", SpringConfigUtils.createBeanReference("dataSource"));
		dialectDetector.setProperty("vendorNameDialectMappings", SpringConfigUtils.createProperties(vendorNameDialectMappings));
		if (dependsOnHsqldbServer) {
			Collection dependsOn = new ArrayList();
			dependsOn.add(SpringConfigUtils.createBeanReference("hsqldbServer"));
			dialectDetector.setDependsOn(dependsOn);
		}
		
		Map hibernatePropertiesMap = new HashMap();
		hibernatePropertiesMap.put(SpringConfigUtils.createLiteralValue("hibernate.dialect"), dialectDetector);
		hibernatePropertiesMap.put(SpringConfigUtils.createLiteralValue("hibernate.hbm2ddl.auto"), SpringConfigUtils.createLiteralValue("create-drop"));
		Bean hibernateProperties = SpringConfigUtils.createSingletonBean(MapToPropertiesFactoryBean.class);
		hibernateProperties.setProperty("map", SpringConfigUtils.createMap(hibernatePropertiesMap));
				
		Bean grailsClassLoader = SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
		grailsClassLoader.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
		grailsClassLoader.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getClassLoader"));
		
		Bean localSessionFactoryBean = SpringConfigUtils.createSingletonBean(ConfigurableLocalsSessionFactoryBean.class);
		localSessionFactoryBean.setProperty("dataSource", SpringConfigUtils.createBeanReference("dataSource"));
		localSessionFactoryBean.setProperty("hibernateProperties", hibernateProperties);
		localSessionFactoryBean.setProperty("grailsApplication", SpringConfigUtils.createBeanReference("grailsApplication"));
		localSessionFactoryBean.setProperty("classLoader", grailsClassLoader);
		beanReferences.add(SpringConfigUtils.createBeanReference("sessionFactory", localSessionFactoryBean));
		
		Bean transactionManager = SpringConfigUtils.createSingletonBean(HibernateTransactionManager.class);
		transactionManager.setProperty("sessionFactory", SpringConfigUtils.createBeanReference("sessionFactory"));
		beanReferences.add(SpringConfigUtils.createBeanReference("transactionManager", transactionManager));

		Bean classLoader = SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
		classLoader.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
		classLoader.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getClassLoader"));
		
		Bean classEditor = SpringConfigUtils.createSingletonBean(ClassEditor.class);
		classEditor.setProperty("classLoader", classLoader);
		
		Bean propertyEditors = SpringConfigUtils.createSingletonBean(CustomEditorConfigurer.class);
		Map customEditors = new HashMap();
		customEditors.put(SpringConfigUtils.createLiteralValue("java.lang.Class"), classEditor);
		propertyEditors.setProperty("customEditors", SpringConfigUtils.createMap(customEditors));
		beanReferences.add(SpringConfigUtils.createBeanReference("customEditors", propertyEditors));
		
		GrailsDomainClass[] grailsDomainClasses = application.getGrailsDomainClasses();
		for (int i = 0; i < grailsDomainClasses.length; i++) {
			GrailsDomainClass grailsDomainClass = grailsDomainClasses[i];
			
			Bean domainClassBean = 	SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
			domainClassBean.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
			domainClassBean.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getGrailsDomainClass"));
			domainClassBean.setProperty("arguments", SpringConfigUtils.createLiteralValue(grailsDomainClass.getFullName()));
			beanReferences.add(SpringConfigUtils.createBeanReference(grailsDomainClass.getFullName() + "DomainClass", domainClassBean));
			
			Collection constructorArguments = new ArrayList();
			// configure persistent methods
			constructorArguments.add(SpringConfigUtils.createBeanReference("grailsApplication"));
			constructorArguments.add(SpringConfigUtils.createLiteralValue(grailsDomainClass.getClazz().getName()));
			constructorArguments.add(SpringConfigUtils.createBeanReference("sessionFactory"));
			constructorArguments.add(classLoader);
			Bean hibernatePersistentMethods = SpringConfigUtils.createSingletonBean(HibernatePersistentMethods.class, constructorArguments);
			beanReferences.add(SpringConfigUtils.createBeanReference(grailsDomainClass.getFullName() + "PersistentMethods", hibernatePersistentMethods));

			// configure validator			
			Bean validatorBean = SpringConfigUtils.createSingletonBean( GrailsDomainClassValidator.class);
			validatorBean.setProperty( "domainClass" ,SpringConfigUtils.createBeanReference(grailsDomainClass.getFullName() + "DomainClass") );
			validatorBean.setProperty( "sessionFactory" ,SpringConfigUtils.createBeanReference("sessionFactory") );
			beanReferences.add( SpringConfigUtils.createBeanReference( grailsDomainClass.getFullName() + "Validator", validatorBean ) );			
		}
		
		GrailsServiceClass[] serviceClasses = application.getGrailsServiceClasses();
		for (int i = 0; i <serviceClasses.length; i++) {
			GrailsServiceClass grailsServiceClass = serviceClasses[i];
			Bean serviceClass = SpringConfigUtils.createSingletonBean(MethodInvokingFactoryBean.class);
			serviceClass.setProperty("targetObject", SpringConfigUtils.createBeanReference("grailsApplication"));
			serviceClass.setProperty("targetMethod", SpringConfigUtils.createLiteralValue("getGrailsServiceClass"));
			serviceClass.setProperty("arguments", SpringConfigUtils.createLiteralValue(grailsServiceClass.getFullName()));
			beanReferences.add(SpringConfigUtils.createBeanReference(grailsServiceClass.getFullName() + "Class", serviceClass));
			
			Bean serviceInstance = SpringConfigUtils.createSingletonBean();
			serviceInstance.setFactoryBean(SpringConfigUtils.createBeanReference(grailsServiceClass.getFullName() + "Class"));
			serviceInstance.setFactoryMethod("newInstance");
			if (grailsServiceClass.byName()) {
				serviceInstance.setAutowire("byName");
			} else if (grailsServiceClass.byType()) {
				serviceInstance.setAutowire("byType");
			}
			
			
			if (grailsServiceClass.isTransactional()) {
				Map transactionAttributes = new HashMap();
				transactionAttributes.put("*", "PROPAGATION_REQUIRED");
				Bean transactionalProxy = SpringConfigUtils.createSingletonBean(TransactionProxyFactoryBean.class);
				transactionalProxy.setProperty("target", serviceInstance);
				transactionalProxy.setProperty("proxyTargetClass", SpringConfigUtils.createLiteralValue("true"));
				transactionalProxy.setProperty("transactionAttributes", SpringConfigUtils.createProperties(transactionAttributes));
				transactionalProxy.setProperty("transactionManager", SpringConfigUtils.createBeanReference("transactionManager"));
				beanReferences.add(SpringConfigUtils.createBeanReference(WordUtils.uncapitalize(grailsServiceClass.getName()) + "Service", transactionalProxy));
			} else {
				beanReferences.add(SpringConfigUtils.createBeanReference(WordUtils.uncapitalize(grailsServiceClass.getName()) + "Service", serviceInstance));
			}
		}
		
		
		return beanReferences;
	}
}
