/*
* $Id: TestTilesPlugin.java 471754 2006-11-06 14:55:09Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.struts.tiles;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.config.ModuleConfigFactory;
import org.apache.struts.config.PlugInConfig;
import org.apache.struts.mock.MockActionServlet;
import org.apache.struts.mock.TestMockBase;
import org.apache.struts.Globals;
import org.apache.struts.tiles.xmlDefinition.I18nFactorySet;
import org.apache.struts.util.RequestUtils;
import org.apache.struts.action.PlugIn;
import org.apache.commons.beanutils.BeanUtils;
import junit.framework.Test;
import junit.framework.TestSuite;
import javax.servlet.ServletException;
import java.util.Locale;
import java.util.Map;
import java.util.HashMap;
public class TestTilesPlugin extends TestMockBase {
protected ModuleConfig module1;
protected ModuleConfig module2;
protected MockActionServlet actionServlet;
// ----------------------------------------------------------------- Basics
public TestTilesPlugin(String name) {
super(name);
}
public static void main(String args[]) {
junit.awtui.TestRunner.main
(new String[] { TestTilesPlugin.class.getName() } );
}
public static Test suite() {
return (new TestSuite(TestTilesPlugin.class));
}
// ----------------------------------------------------- Instance Variables
// ----------------------------------------------------- Setup and Teardown
public void setUp()
{
super.setUp();
TilesUtil.testReset();
actionServlet = new MockActionServlet(context, config);
}
public void tearDown() {
super.tearDown();
}
// ------------------------------------------------------- Individual Tests
/**
* Create a module configuration
* @param moduleName
*/
public ModuleConfig createModuleConfig(
String moduleName,
String configFileName,
boolean moduleAware) {
ModuleConfig moduleConfig =
ModuleConfigFactory.createFactory().createModuleConfig(moduleName);
context.setAttribute(Globals.MODULE_KEY + moduleName, moduleConfig);
// Set tiles plugin
PlugInConfig pluginConfig = new PlugInConfig();
pluginConfig.setClassName("org.apache.struts.tiles.TilesPlugin");
pluginConfig.addProperty(
"moduleAware",
(moduleAware == true ? "true" : "false"));
pluginConfig.addProperty(
"definitions-config",
"/org/apache/struts/tiles/config/" + configFileName);
moduleConfig.addPlugInConfig(pluginConfig);
return moduleConfig;
}
/**
* Fake call to init module plugins
* @param moduleConfig
*/
public void initModulePlugIns( ModuleConfig moduleConfig)
{
PlugInConfig plugInConfigs[] = moduleConfig.findPlugInConfigs();
PlugIn plugIns[] = new PlugIn[plugInConfigs.length];
context.setAttribute(Globals.PLUG_INS_KEY + moduleConfig.getPrefix(), plugIns);
for (int i = 0; i < plugIns.length; i++) {
try {
plugIns[i] =
(PlugIn) RequestUtils.applicationInstance(plugInConfigs[i].getClassName());
BeanUtils.populate(plugIns[i], plugInConfigs[i].getProperties());
// Pass the current plugIn config object to the PlugIn.
// The property is set only if the plugin declares it.
// This plugin config object is needed by Tiles
BeanUtils.copyProperty( plugIns[i], "currentPlugInConfigObject", plugInConfigs[i]);
plugIns[i].init(actionServlet, moduleConfig);
} catch (ServletException e) {
// Lets propagate
e.printStackTrace();
//throw e;
} catch (Exception e) {
e.printStackTrace();
//throw e;
}
}
}
// ---------------------------------------------------------- absoluteURL()
/**
* Test multi factory creation when moduleAware=true.
*/
public void testMultiFactory() {
// init TilesPlugin
module1 = createModuleConfig("/module1", "tiles-defs.xml", true);
module2 = createModuleConfig("/module2", "tiles-defs.xml", true);
initModulePlugIns(module1);
initModulePlugIns(module2);
// mock request context
request.setAttribute(Globals.MODULE_KEY, module1);
request.setPathElements("/myapp", "/module1/foo.do", null, null);
// Retrieve factory for module1
DefinitionsFactory factory1 =
TilesUtil.getDefinitionsFactory(request, context);
assertNotNull("factory found", factory1);
assertEquals(
"factory name",
"/module1",
factory1.getConfig().getFactoryName());
// mock request context
request.setAttribute(Globals.MODULE_KEY, module2);
request.setPathElements("/myapp", "/module2/foo.do", null, null);
// Retrieve factory for module2
DefinitionsFactory factory2 =
TilesUtil.getDefinitionsFactory(request, context);
assertNotNull("factory found", factory2);
assertEquals(
"factory name",
"/module2",
factory2.getConfig().getFactoryName());
// Check that factory are different
assertNotSame("Factory from different modules", factory1, factory2);
}
/**
* Test single factory creation when moduleAware=false.
*/
public void testSingleSharedFactory()
{
// init TilesPlugin
module1 = createModuleConfig( "/module1", "tiles-defs.xml", false );
module2 = createModuleConfig( "/module2", "tiles-defs.xml", false );
initModulePlugIns(module1);
initModulePlugIns(module2);
// mock request context
request.setAttribute(Globals.MODULE_KEY, module1);
request.setPathElements("/myapp", "/module1/foo.do", null, null);
// Retrieve factory for module1
DefinitionsFactory factory1 = TilesUtil.getDefinitionsFactory( request, context);
assertNotNull( "factory found", factory1);
assertEquals( "factory name", "/module1", factory1.getConfig().getFactoryName() );
// mock request context
request.setAttribute(Globals.MODULE_KEY, module2);
request.setPathElements("/myapp", "/module2/foo.do", null, null);
// Retrieve factory for module2
DefinitionsFactory factory2 = TilesUtil.getDefinitionsFactory( request, context);
assertNotNull( "factory found", factory2);
assertEquals( "factory name", "/module1", factory2.getConfig().getFactoryName() );
// Check that factory are different
assertEquals("Same factory", factory1, factory2);
}
/**
* Test I18nFactorySet.
*/
public void testI18FactorySet_A() {
Locale locale = null;
ComponentDefinition definition = null;
org.apache.struts.tiles.xmlDefinition.DefinitionsFactory factory = null;
Map properties = new HashMap();
// Set the file name
properties.put(I18nFactorySet.DEFINITIONS_CONFIG_PARAMETER_NAME,
"config/I18nFactorySet-A.xml");
try {
CustomI18nFactorySet i18nFactorySet = new CustomI18nFactorySet(context, properties);
String defName = "A-DEFAULT";
// Default Locale
locale = new Locale("", "", "");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("DefinitionsFactory is nullfor locale='" + print(locale) + "'", factory);
definition = factory.getDefinition(defName, request, context);
assertNotNull("Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Variant Only
locale = new Locale("", "", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
definition = factory.getDefinition(defName, request, context);
assertNotNull("Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// No Language, Country & Variant Locale
locale = new Locale("", "US", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
definition = factory.getDefinition(defName, request, context);
assertNotNull("Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Language & Country
locale = new Locale("en", "US");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
definition = factory.getDefinition(defName, request, context);
assertNotNull("Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
} catch(Exception ex) {
fail(ex.toString());
}
}
/**
* Test I18nFactorySet.
*/
public void testI18FactorySet_B() {
Locale locale = null;
ComponentDefinition definition = null;
org.apache.struts.tiles.xmlDefinition.DefinitionsFactory factory = null;
Map properties = new HashMap();
// Set the file name
properties.put(I18nFactorySet.DEFINITIONS_CONFIG_PARAMETER_NAME,
"config/I18nFactorySet-B.xml");
try {
CustomI18nFactorySet i18nFactorySet = new CustomI18nFactorySet(context, properties);
String defName = null;
// Default Locale
locale = new Locale("", "", "");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("1. DefinitionsFactory is nullfor locale='" + print(locale) + "'", factory);
defName = "B-DEFAULT";
definition = factory.getDefinition(defName, request, context);
assertNotNull("2. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("3. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Variant Only
locale = new Locale("", "", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("4. DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
defName = "B___XX";
definition = factory.getDefinition(defName, request, context);
assertNotNull("5. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("6. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
defName = "B-DEFAULT";
definition = factory.getDefinition(defName, request, context);
assertNotNull("7. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("8. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// No Language, Country & Unknown Variant
locale = new Locale("", "US", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("9. DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
defName = "B__US";
definition = factory.getDefinition(defName, request, context);
assertNotNull("10. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("11. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Language & Country
locale = new Locale("en", "US");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("12. DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
defName = "B_en_US";
definition = factory.getDefinition(defName, request, context);
assertNotNull("13. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("14. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Language, Country & Unknown Variant
locale = new Locale("en", "GB", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("15. DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
defName = "B_en_GB";
definition = factory.getDefinition(defName, request, context);
assertNotNull("16. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("17. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
// Language, Unknown Country & Unknown Variant
locale = new Locale("en", "FR", "XX");
factory = i18nFactorySet.createFactory(locale , request, context);
assertNotNull("18. DefinitionsFactory is null for locale='" + print(locale) + "'", factory);
defName = "B_en";
definition = factory.getDefinition(defName, request, context);
assertNotNull("19. Definition '" + defName + "' Not Found for locale='" + print(locale) + "'", definition);
assertEquals("20. Definition '" + defName + "' for locale='" + print(locale) + "'", defName, definition.getName());
} catch(Exception ex) {
fail(ex.toString());
}
}
/**
* String representation of a Locale. A bug in the
* Locale.toString() method results in Locales with
* just a variant being incorrectly displayed.
*/
private String print(Locale locale) {
return locale.getLanguage() + "_" +
locale.getCountry() + "_" +
locale.getVariant();
}
}