/*
*
* 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();
}
}
}
}