/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.container.configuration;
import junit.framework.TestCase;
import org.exoplatform.container.ar.Archive;
import org.exoplatform.container.xml.Configuration;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor;
/**
* Created by The eXo Platform SAS
* Author : Nicolas Filotto
* nicolas.filotto@exoplatform.com
* 22 fevr. 2010
*/
public class TestConfigurationManagerImpl extends TestCase
{
public void testGetURL() throws Exception
{
// Empty CM
ConfigurationManager cm = new ConfigurationManagerImpl();
URL url = cm.getURL(null);
assertNull(url);
url = cm.getURL("jar:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm.getURL("jar:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm.getURL("classpath:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm.getURL("classpath:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm.getURL("classpath:org/exoplatform/container/configuration/empty-config.xml");
assertTrue(url.getPath().endsWith("org/exoplatform/container/configuration/empty-config.xml"));
checkURL(url);
url = cm.getURL("jar:org/exoplatform/container/configuration/empty-config.xml");
assertTrue(url.getPath().endsWith("org/exoplatform/container/configuration/empty-config.xml"));
checkURL(url);
try
{
url = cm.getURL("war:/org/exoplatform/container/configuration/empty-config.xml");
fail("An error should be thrown");
}
catch (Exception e)
{
// ok;
}
try
{
url = cm.getURL("war:/org/exoplatform/container/configuration/empty-config-fake.xml");
fail("An error should be thrown");
}
catch (Exception e)
{
// ok;
}
String sURL = getClass().getResource("empty-config.xml").toString();
assertNotNull(sURL);
assertTrue("the expected path should starts with file:", sURL.startsWith("file:"));
sURL = sURL.substring(0, sURL.lastIndexOf('/'));
sURL = sURL.substring(0, sURL.lastIndexOf('/'));
url = cm.getURL(sURL + "/configuration/empty-config.xml");
checkURL(url);
url = cm.getURL(sURL + "/configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm.getURL(sURL + "\\configuration\\empty-config.xml");
checkURL(url);
url = cm.getURL(sURL + "\\configuration\\empty-config-fake.xml");
checkURL(url, true);
// Check relative path
cm.addConfiguration(cm.getURL(sURL + "/configuration/empty-config.xml"));
url = cm.getURL("import-configuration.xml");
checkURL(url);
String sArchiveURL = sURL.replace("file:", Archive.PROTOCOL + ":");
url = cm.getURL(sArchiveURL + "/configuration/empty-config.xml");
checkURL(url);
url = cm.getURL(sArchiveURL + "/configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm.getURL(sArchiveURL + "\\configuration\\empty-config.xml");
checkURL(url);
url = cm.getURL(sArchiveURL + "\\configuration\\empty-config-fake.xml");
checkURL(url, true);
// Check relative path
cm.addConfiguration(cm.getURL(sArchiveURL + "/configuration/empty-config.xml"));
url = cm.getURL("import-configuration.xml");
checkURL(url);
// Clear the context path
cm = new ConfigurationManagerImpl();
String incompleteURL = "file:/" + getClass().getResource("empty-config.xml").getPath();
incompleteURL = incompleteURL.substring(0, incompleteURL.lastIndexOf('/'));
url = cm.getURL(incompleteURL + "/empty-config.xml");
checkURL(url);
url = cm.getURL(incompleteURL + "/empty-config-fake.xml");
checkURL(url, true);
incompleteURL = "file:" + getClass().getResource("empty-config.xml").getPath();
incompleteURL = incompleteURL.substring(0, incompleteURL.lastIndexOf('/'));
url = cm.getURL(incompleteURL + "/empty-config.xml");
checkURL(url);
url = cm.getURL(incompleteURL + "/empty-config-fake.xml");
checkURL(url, true);
url = cm.getURL("org/exoplatform/container/configuration/empty-config.xml");
assertNull(url);
url = cm.getURL("org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
// CM with ClassLoader
ConfigurationManager cm1 = new ConfigurationManagerImpl(Thread.currentThread().getContextClassLoader(), null);
url = cm1.getURL(null);
assertNull(url);
url = cm1.getURL("jar:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm1.getURL("jar:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm1.getURL("classpath:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm1.getURL("classpath:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm1.getURL("war:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm1.getURL("war:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm1.getURL(sURL + "/configuration/empty-config.xml");
checkURL(url);
url = cm1.getURL(sURL + "/configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm1.getURL("org/exoplatform/container/configuration/empty-config.xml");
assertNull(url);
url = cm1.getURL("org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
// CM with ServletContext
ConfigurationManager cm2 = new ConfigurationManagerImpl(new MockServletContext(), null);
url = cm2.getURL(null);
assertNull(url);
url = cm2.getURL("jar:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm2.getURL("jar:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm2.getURL("classpath:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm2.getURL("classpath:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm2.getURL("war:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm2.getURL("war:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm2.getURL(sURL + "/configuration/empty-config.xml");
checkURL(url);
url = cm2.getURL(sURL + "/configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm2.getURL("org/exoplatform/container/configuration/empty-config.xml");
assertNull(url);
url = cm2.getURL("org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
// CM with Context path
ConfigurationManager cm3 = new ConfigurationManagerImpl();
String path = getClass().getResource("empty-config.xml").getPath();
assertNotNull(path);
path = path.substring(0, path.lastIndexOf('/'));
cm3.addConfiguration((new File(path)).toURI().toURL());
url = cm3.getURL(null);
assertNull(url);
url = cm3.getURL("jar:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm3.getURL("jar:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
url = cm3.getURL("classpath:/org/exoplatform/container/configuration/empty-config.xml");
checkURL(url);
url = cm3.getURL("classpath:/org/exoplatform/container/configuration/empty-config-fake.xml");
assertNull(url);
try
{
url = cm3.getURL("war:/org/exoplatform/container/configuration/empty-config.xml");
fail("An error should be thrown");
}
catch (Exception e)
{
// ok;
}
try
{
url = cm3.getURL("war:/org/exoplatform/container/configuration/empty-config-fake.xml");
fail("An error should be thrown");
}
catch (Exception e)
{
// ok;
}
url = cm3.getURL(sURL + "/configuration/empty-config.xml");
checkURL(url);
url = cm3.getURL(sURL + "/configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm3.getURL("configuration/empty-config.xml");
checkURL(url);
url = cm3.getURL("configuration/empty-config-fake.xml");
checkURL(url, true);
url = cm3.getURL("configuration\\empty-config.xml");
checkURL(url);
url = cm3.getURL("configuration\\empty-config-fake.xml");
checkURL(url, true);
}
public void testGetFileURL() throws Exception
{
// Empty CM
ConfigurationManager cm = new ConfigurationManagerImpl();
URL url = cm.getURL(null);
assertNull(url);
url = cm.getURL("file:F:\\somepath\\path\\configuration.xml");
assertEquals("file:/F:/somepath/path/configuration.xml", url.toString());
//make context configuration starting fith "file:D:..."
try
{
cm.addConfiguration("file:D:\\somepath\\config.xml");
}
catch (Exception e)
{
// thats is ok, because such config does not exists,
// but ConfigurationManagerInmp.contextPath going to be initialized
// thats all we need to reproduce bug.
}
// now lets check relative url
url = cm.getURL("configuration.xml");
assertEquals("file:/D:/somepath/configuration.xml", url.toString());
}
public void testImport() throws Exception
{
// no import
ConfigurationManager cm = new ConfigurationManagerImpl();
cm.addConfiguration("classpath:/org/exoplatform/container/configuration/config-manager-configuration-a.xml");
Configuration conf = cm.getConfiguration();
assertNotNull(conf.getComponent("A"));
assertTrue(conf.getComponent("A").getDocumentURL().getFile().endsWith("config-manager-configuration-a.xml"));
assertNull(conf.getComponent("B"));
assertNull(conf.getComponent("C"));
// b import a
cm = new ConfigurationManagerImpl();
cm.addConfiguration("classpath:/org/exoplatform/container/configuration/config-manager-configuration-b.xml");
conf = cm.getConfiguration();
assertNotNull(conf.getComponent("A"));
assertTrue(conf.getComponent("A").getDocumentURL().getFile().endsWith("config-manager-configuration-a.xml"));
assertNotNull(conf.getComponent("B"));
assertTrue(conf.getComponent("B").getDocumentURL().getFile().endsWith("config-manager-configuration-b.xml"));
assertNull(conf.getComponent("C"));
// c import b and b import a
cm = new ConfigurationManagerImpl();
cm.addConfiguration("classpath:/org/exoplatform/container/configuration/config-manager-configuration-c.xml");
conf = cm.getConfiguration();
assertNotNull(conf.getComponent("A"));
assertTrue(conf.getComponent("A").getDocumentURL().getFile().endsWith("config-manager-configuration-a.xml"));
assertNotNull(conf.getComponent("B"));
assertTrue(conf.getComponent("B").getDocumentURL().getFile().endsWith("config-manager-configuration-b.xml"));
assertNotNull(conf.getComponent("C"));
assertTrue(conf.getComponent("C").getDocumentURL().getFile().endsWith("config-manager-configuration-c.xml"));
}
private void checkURL(URL url) throws Exception
{
checkURL(url, false);
}
private void checkURL(URL url, boolean empty) throws Exception
{
assertNotNull(url);
InputStream is = null;
try
{
is = url.openStream();
if (empty)
{
assertNull(is);
}
else
{
assertNotNull(is);
assertTrue(is.available() > 0);
}
}
catch (IOException e)
{
if (empty)
{
// OK
}
else
{
throw e;
}
}
finally
{
if (is != null)
{
try
{
is.close();
}
catch (Exception e)
{
// ignore me
}
}
}
}
private static class MockServletContext implements ServletContext
{
public Object getAttribute(String arg0)
{
return null;
}
public Enumeration<String> getAttributeNames()
{
return null;
}
public ServletContext getContext(String arg0)
{
return null;
}
public String getContextPath()
{
return null;
}
public String getInitParameter(String arg0)
{
return null;
}
public Enumeration<String> getInitParameterNames()
{
return null;
}
public int getMajorVersion()
{
return 0;
}
public String getMimeType(String arg0)
{
return null;
}
public int getMinorVersion()
{
return 0;
}
public RequestDispatcher getNamedDispatcher(String arg0)
{
return null;
}
public String getRealPath(String arg0)
{
return null;
}
public RequestDispatcher getRequestDispatcher(String arg0)
{
return null;
}
public URL getResource(String arg0) throws MalformedURLException
{
// We remove "/WEB-INF/
String path = arg0.substring(ConfigurationManagerImpl.WAR_CONF_LOCATION.length() + 1);
return Thread.currentThread().getContextClassLoader().getResource(path);
}
public InputStream getResourceAsStream(String arg0)
{
return null;
}
public Set<String> getResourcePaths(String arg0)
{
return null;
}
public String getServerInfo()
{
return null;
}
public Servlet getServlet(String arg0) throws ServletException
{
return null;
}
public String getServletContextName()
{
return null;
}
public Enumeration<String> getServletNames()
{
return null;
}
public Enumeration<Servlet> getServlets()
{
return null;
}
public void log(String arg0)
{
}
public void log(Exception arg0, String arg1)
{
}
public void log(String arg0, Throwable arg1)
{
}
public void removeAttribute(String arg0)
{
}
public void setAttribute(String arg0, Object arg1)
{
}
public int getEffectiveMajorVersion()
{
return 0;
}
public int getEffectiveMinorVersion()
{
return 0;
}
public boolean setInitParameter(String name, String value)
{
return false;
}
public Dynamic addServlet(String servletName, String className)
{
return null;
}
public Dynamic addServlet(String servletName, Servlet servlet)
{
return null;
}
public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
{
return null;
}
public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException
{
return null;
}
public ServletRegistration getServletRegistration(String servletName)
{
return null;
}
public Map<String, ? extends ServletRegistration> getServletRegistrations()
{
return null;
}
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className)
{
return null;
}
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
{
return null;
}
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
{
return null;
}
public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException
{
return null;
}
public FilterRegistration getFilterRegistration(String filterName)
{
return null;
}
public Map<String, ? extends FilterRegistration> getFilterRegistrations()
{
return null;
}
public SessionCookieConfig getSessionCookieConfig()
{
return null;
}
public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
{
}
public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
{
return null;
}
public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
{
return null;
}
public void addListener(String className)
{
}
public <T extends EventListener> void addListener(T t)
{
}
public void addListener(Class<? extends EventListener> listenerClass)
{
}
public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
{
return null;
}
public JspConfigDescriptor getJspConfigDescriptor()
{
return null;
}
public ClassLoader getClassLoader()
{
return null;
}
public void declareRoles(String... roleNames)
{
}
}
}