/* * * Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved. * * This file is part of jAPS software. * jAPS is a free software; * you can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2. * * See the file License for the specific language governing permissions * and limitations under the License * * * * Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved. * */ package test.com.agiletec; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Map.Entry; import javax.servlet.ServletContext; import org.apache.commons.dbcp.BasicDataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.mock.jndi.SimpleNamingContextBuilder; import org.springframework.web.context.support.XmlWebApplicationContext; /** * Classe di utilità per i test. * Fornisce la lista di file di configurazione di spring e il contesto. * La classe và estesa nel caso si intenda modificare od aggiungere * file di configurazione di spring esterni. * @author W.Ambu - E.Santoboni */ public class ConfigTestUtils { /** * Crea e restituisce il Contesto dell'Applicazione. * @param srvCtx Il Contesto della Servlet. * @return Il Contesto dell'Applicazione. */ public ApplicationContext createApplicationContext(ServletContext srvCtx) { this.createNamingContext(); XmlWebApplicationContext applicationContext = new XmlWebApplicationContext(); applicationContext.setConfigLocations(this.getSpringConfigFilePaths()); applicationContext.setServletContext(srvCtx); applicationContext.refresh(); return applicationContext; } protected SimpleNamingContextBuilder createNamingContext() { SimpleNamingContextBuilder builder = null; try { builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); InputStream in = new FileInputStream("admin/test/contextTestParams.properties"); Properties testConfig = new Properties(); testConfig.load(in); in.close(); builder.bind("java:comp/env/logName", testConfig.getProperty("logName")); builder.bind("java:comp/env/logFilePrefix", testConfig.getProperty("logFilePrefix")); builder.bind("java:comp/env/logLevel", testConfig.getProperty("logLevel")); builder.bind("java:comp/env/logFileSize", testConfig.getProperty("logFileSize")); builder.bind("java:comp/env/logFilesCount", testConfig.getProperty("logFilesCount")); builder.bind("java:comp/env/configVersion", testConfig.getProperty("configVersion")); builder.bind("java:comp/env/applicationBaseURL", testConfig.getProperty("applicationBaseURL")); builder.bind("java:comp/env/resourceRootURL", testConfig.getProperty("resourceRootURL")); builder.bind("java:comp/env/protectedResourceRootURL", testConfig.getProperty("protectedResourceRootURL")); builder.bind("java:comp/env/resourceDiskRootFolder", testConfig.getProperty("resourceDiskRootFolder")); builder.bind("java:comp/env/protectedResourceDiskRootFolder", testConfig.getProperty("protectedResourceDiskRootFolder")); builder.bind("java:comp/env/indexDiskRootFolder", testConfig.getProperty("indexDiskRootFolder")); builder.bind("java:comp/env/cacheDiskRootFolder", testConfig.getProperty("cacheDiskRootFolder")); Iterator<Entry<Object, Object>> configIter = testConfig.entrySet().iterator(); while (configIter.hasNext()) { Entry<Object, Object> entry = configIter.next(); builder.bind("java:comp/env/" + (String) entry.getKey(), (String) entry.getValue()); } this.createDatasources(builder, testConfig); } catch (Throwable t) { throw new RuntimeException("Error on creation naming context", t); } return builder; } private void createDatasources(SimpleNamingContextBuilder builder, Properties testConfig) { List<String> dsNameControlKeys = new ArrayList<String>(); Enumeration<Object> keysEnum = testConfig.keys(); while (keysEnum.hasMoreElements()) { String key = (String) keysEnum.nextElement(); if (key.startsWith("jdbc.")) { String[] controlKeys = key.split("\\."); String dsNameControlKey = controlKeys[1]; if (!dsNameControlKeys.contains(dsNameControlKey)) { this.createDatasource(dsNameControlKey, builder, testConfig); dsNameControlKeys.add(dsNameControlKey); } } } } private void createDatasource(String dsNameControlKey, SimpleNamingContextBuilder builder, Properties testConfig) { String beanName = testConfig.getProperty("jdbc."+dsNameControlKey+".beanName"); try { String className = testConfig.getProperty("jdbc."+dsNameControlKey+".driverClassName"); String url = testConfig.getProperty("jdbc."+dsNameControlKey+".url"); String username = testConfig.getProperty("jdbc."+dsNameControlKey+".username"); String password = testConfig.getProperty("jdbc."+dsNameControlKey+".password"); Class.forName(className); BasicDataSource ds = new BasicDataSource(); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); ds.setMaxActive(8); ds.setMaxIdle(4); builder.bind("java:comp/env/jdbc/" + beanName, ds); } catch (Throwable t) { throw new RuntimeException("Error on creation datasource '" + beanName + "'", t); } } /** * Restituisce l'insieme dei file di configurazione dei bean definiti nel sistema. * Il metodo và esteso nel caso si inseriscano file di configurazioni esterni al Core ed ai Plugin. * @return L'insieme dei file di configurazione definiti nel sistema. */ protected String[] getSpringConfigFilePaths() { String[] filePaths = new String[5]; filePaths[0] = "admin/test/testSystemConfig.xml"; filePaths[1] = "WebContent/WEB-INF/conf/managers/**/**.xml"; filePaths[2] = "WebContent/WEB-INF/apsadmin/conf/**/**.xml"; filePaths[3] = "WebContent/WEB-INF/plugins/**/conf/**/**.xml"; filePaths[4] = "WebContent/WEB-INF/plugins/**/apsadmin/conf/**/**.xml"; return filePaths; } public void destroyContext(ApplicationContext applicationContext) throws Exception { if (applicationContext instanceof AbstractApplicationContext) { ((AbstractApplicationContext) applicationContext).destroy(); } } /** * Effettua la chiusura dei datasource definiti nel contesto. * @param applicationContext Il contesto dell'applicazione. * @throws Exception In caso di errore nel recupero o chiusura dei DataSource. */ public void closeDataSources(ApplicationContext applicationContext) throws Exception { String[] dataSourceNames = applicationContext.getBeanNamesForType(BasicDataSource.class); for (int i=0; i<dataSourceNames.length; i++) { BasicDataSource dataSource = (BasicDataSource) applicationContext.getBean(dataSourceNames[i]); if (null != dataSource) { dataSource.close(); } } } }