blob: 60c0b4bf60cdee4fa113ad72ea4d8a2fd516327d [file] [log] [blame]
package org.apache.commons.configuration2;
/*
* 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.
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Collection;
import java.util.Iterator;
import org.apache.commons.configuration2.io.FileHandler;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
/**
* Test class for XMLConfiguration. In addition to TestXMLConfiguration this
* class especially tests the hierarchical nature of this class and structured
* data access.
*
*/
public class TestHierarchicalXMLConfiguration
{
/** Test resources directory. */
private static final String TEST_DIR = "conf";
/** Test file #1 **/
private static final String TEST_FILENAME = "testHierarchicalXMLConfiguration.xml";
/** Test file #2 **/
private static final String TEST_FILENAME2 = "testHierarchicalXMLConfiguration2.xml";
/** Test file path #1 **/
private static final String TEST_FILE = ConfigurationAssert.getTestFile(TEST_FILENAME).getAbsolutePath();
/** Test file path #2 **/
private static final String TEST_FILE2 = ConfigurationAssert.getTestFile(TEST_FILENAME2).getAbsolutePath();
/** Test file path #3.*/
private static final String TEST_FILE3 = ConfigurationAssert.getTestFile("test.xml").getAbsolutePath();
/** File name for saving.*/
private static final String TEST_SAVENAME = "testhierarchicalsave.xml";
/** Helper object for creating temporary files. */
@Rule
public TemporaryFolder folder = new TemporaryFolder();
/** Instance config used for tests. */
private XMLConfiguration config;
/** Fixture setup. */
@Before
public void setUp() throws Exception
{
config = new XMLConfiguration();
}
private void configTest(final XMLConfiguration config)
{
assertEquals(1, config.getMaxIndex("tables.table"));
assertEquals("system", config.getProperty("tables.table(0)[@tableType]"));
assertEquals("application", config.getProperty("tables.table(1)[@tableType]"));
assertEquals("users", config.getProperty("tables.table(0).name"));
assertEquals("documents", config.getProperty("tables.table(1).name"));
Object prop = config.getProperty("tables.table.fields.field.name");
assertTrue(prop instanceof Collection);
assertEquals(10, ((Collection<?>) prop).size());
prop = config.getProperty("tables.table(0).fields.field.type");
assertTrue(prop instanceof Collection);
assertEquals(5, ((Collection<?>) prop).size());
prop = config.getProperty("tables.table(1).fields.field.type");
assertTrue(prop instanceof Collection);
assertEquals(5, ((Collection<?>) prop).size());
}
@Test
public void testGetProperty() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.setFileName(TEST_FILE);
handler.load();
configTest(config);
}
@Test
public void testLoadURL() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.load(new File(TEST_FILE).getAbsoluteFile().toURI().toURL());
configTest(config);
}
@Test
public void testLoadBasePath1() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.setBasePath(TEST_DIR);
handler.setFileName(TEST_FILENAME);
handler.load();
configTest(config);
}
@Test
public void testLoadBasePath2() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.setBasePath(new File(TEST_FILE).getAbsoluteFile().toURI().toURL().toString());
handler.setFileName(TEST_FILENAME);
handler.load();
configTest(config);
}
/**
* Ensure various node types are correctly processed in config.
*/
@Test
public void testXmlNodeTypes() throws Exception
{
// Number of keys expected from test configuration file
final int KEY_COUNT = 5;
// Load the configuration file
final FileHandler handler = new FileHandler(config);
handler.load(new File(TEST_FILE2).getAbsoluteFile().toURI().toURL());
// Validate comment in element ignored
assertEquals("Comment in element must not change element value.", "Case1Text", config
.getString("case1"));
// Validate sibling comment ignored
assertEquals("Comment as sibling must not change element value.", "Case2Text", config
.getString("case2.child"));
// Validate comment ignored, CDATA processed
assertEquals("Comment and use of CDATA must not change element value.", "Case3Text", config
.getString("case3"));
// Validate comment and processing instruction ignored
assertEquals("Comment and use of PI must not change element value.", "Case4Text", config
.getString("case4"));
// Validate comment ignored in parent attribute
assertEquals("Comment must not change attribute node value.", "Case5Text", config
.getString("case5[@attr]"));
// Validate non-text nodes haven't snuck in as keys
final Iterator<String> iter = config.getKeys();
int count = 0;
while (iter.hasNext())
{
iter.next();
count++;
}
assertEquals("Config must contain only " + KEY_COUNT + " keys.", KEY_COUNT, count);
}
@Test
public void testSave() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.setFileName(TEST_FILE3);
handler.load();
final File saveFile = folder.newFile(TEST_SAVENAME);
handler.save(saveFile);
config = new XMLConfiguration();
final FileHandler handler2 = new FileHandler(config);
handler2.load(saveFile.toURI().toURL());
assertEquals("value", config.getProperty("element"));
assertEquals("I'm complex!", config.getProperty("element2.subelement.subsubelement"));
assertEquals(8, config.getInt("test.short"));
assertEquals("one", config.getString("list(0).item(0)[@name]"));
assertEquals("two", config.getString("list(0).item(1)"));
assertEquals("six", config.getString("list(1).sublist.item(1)"));
}
/**
* Tests to save a newly created configuration.
*/
@Test
public void testSaveNew() throws Exception
{
config.addProperty("connection.url", "jdbc://mydb:1234");
config.addProperty("connection.user", "scott");
config.addProperty("connection.passwd", "tiger");
config.addProperty("connection[@type]", "system");
config.addProperty("tables.table.name", "tests");
config.addProperty("tables.table(0).fields.field.name", "test_id");
config.addProperty("tables.table(0).fields.field(-1).name", "test_name");
config.addProperty("tables.table(-1).name", "results");
config.addProperty("tables.table(1).fields.field.name", "res_id");
config.addProperty("tables.table(1).fields.field(0).type", "int");
config.addProperty("tables.table(1).fields.field(-1).name", "value");
config.addProperty("tables.table(1).fields.field(1).type", "string");
config.addProperty("tables.table(1).fields.field(1)[@null]", "true");
config.setRootElementName("myconfig");
final File saveFile = folder.newFile(TEST_SAVENAME);
FileHandler handler = new FileHandler(config);
handler.setFile(saveFile);
handler.save();
config = new XMLConfiguration();
handler = new FileHandler(config);
handler.load(saveFile);
assertEquals(1, config.getMaxIndex("tables.table.name"));
assertEquals("tests", config.getString("tables.table(0).name"));
assertEquals("test_name", config.getString("tables.table(0).fields.field(1).name"));
assertEquals("int", config.getString("tables.table(1).fields.field(0).type"));
assertTrue(config.getBoolean("tables.table(1).fields.field(1)[@null]"));
assertEquals("tiger", config.getString("connection.passwd"));
assertEquals("system", config.getProperty("connection[@type]"));
assertEquals("myconfig", config.getRootElementName());
}
/**
* Tests to save a modified configuration.
*/
@Test
public void testSaveModified() throws Exception
{
FileHandler handler = new FileHandler(config);
handler.setFile(new File(TEST_FILE3));
handler.load();
assertTrue(config.getString("mean").startsWith("This is\n A long story..."));
assertTrue(config.getString("mean").indexOf("And even longer") > 0);
config.clearProperty("test.entity[@name]");
config.setProperty("element", "new value");
config.setProperty("test(0)", "A <new> value");
config.addProperty("test(1).int", Integer.valueOf(9));
config.addProperty("list(1).sublist.item", "seven");
config.setProperty("clear", "yes");
config.setProperty("mean", "now it's simple");
config.addProperty("[@topattr]", "available");
config.addProperty("[@topattr_other]", "successfull");
final File saveFile = folder.newFile(TEST_SAVENAME);
handler.save(saveFile);
config = new XMLConfiguration();
handler = new FileHandler(config);
handler.load(saveFile.getAbsolutePath());
assertFalse(config.containsKey("test.entity[@name]"));
assertEquals("1<2", config.getProperty("test.entity"));
assertEquals("new value", config.getString("element"));
assertEquals("A <new> value", config.getProperty("test(0)"));
assertEquals((short) 8, config.getShort("test(1).short"));
assertEquals(9, config.getInt("test(1).int"));
assertEquals("six", config.getProperty("list(1).sublist.item(1)"));
assertEquals("seven", config.getProperty("list(1).sublist.item(2)"));
assertEquals("yes", config.getProperty("clear"));
assertEquals("now it's simple", config.getString("mean"));
assertEquals("available", config.getString("[@topattr](0)"));
assertEquals("successfull", config.getString("[@topattr_other]"));
}
/**
* Tests manipulation of the root element's name.
*/
@Test
public void testRootElement() throws Exception
{
assertEquals("configuration", config.getRootElementName());
config.setRootElementName("newRootName");
assertEquals("newRootName", config.getRootElementName());
}
/**
* Tests that it is not allowed to change the root element name when the
* configuration was loaded from a file.
*/
@Test(expected = UnsupportedOperationException.class)
public void testSetRootElementNameWhenLoadedFromFile() throws Exception
{
final FileHandler handler = new FileHandler(config);
handler.setFile(new File(TEST_FILE3));
handler.load();
assertEquals("testconfig", config.getRootElementName());
config.setRootElementName("anotherRootElement");
}
}