001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.settings.xml;
017
018 import java.io.IOException;
019 import java.io.StringReader;
020 import java.util.Arrays;
021 import java.util.List;
022
023 import javax.xml.parsers.DocumentBuilderFactory;
024 import javax.xml.parsers.FactoryConfigurationError;
025 import javax.xml.parsers.ParserConfigurationException;
026
027 import org.springframework.richclient.settings.Settings;
028 import org.springframework.richclient.settings.SettingsAbstractTests;
029 import org.w3c.dom.Document;
030 import org.w3c.dom.Element;
031 import org.w3c.dom.Node;
032 import org.w3c.dom.NodeList;
033 import org.xml.sax.InputSource;
034 import org.xml.sax.SAXException;
035
036 /**
037 * @author Peter De Bruycker
038 */
039 public class XmlSettingsTests extends SettingsAbstractTests {
040
041 protected Settings createSettings() throws Exception {
042 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
043 Element element = doc.createElement("settings");
044 element.setAttribute("name", "root");
045 doc.appendChild(element);
046
047 return new XmlSettings(element);
048 }
049
050 public void testConstructor() throws ParserConfigurationException, FactoryConfigurationError, SAXException,
051 IOException {
052 StringBuffer sb = new StringBuffer();
053 sb.append("<?xml version=\"1.0\"?>");
054 sb.append("<settings name=\"test-settings\">");
055 sb.append(" <entry key=\"key-1\" value=\"value-1\" />");
056 sb.append(" <entry key=\"key-2\" value=\"false\" />");
057 sb.append(" <entry key=\"key-3\" value=\"1.5\" />");
058 sb.append(" <settings name=\"child-settings\">");
059 sb.append(" <entry key=\"child-key\" value=\"value\" />");
060 sb.append(" </settings>");
061 sb.append("</settings>");
062
063 Element element = createElement(sb.toString());
064
065 XmlSettings settings = new XmlSettings(null, element);
066 assertEquals("test-settings", settings.getName());
067 assertEquals(element, settings.getElement());
068
069 List keys = Arrays.asList(settings.getKeys());
070 assertEquals(3, keys.size());
071 assertTrue(keys.contains("key-1"));
072 assertTrue(keys.contains("key-2"));
073 assertTrue(keys.contains("key-3"));
074
075 assertEquals("value-1", settings.getString("key-1"));
076 assertFalse(settings.getBoolean("key-2"));
077 assertEquals(1.5f, settings.getFloat("key-3"), 0.0f);
078
079 Settings childSettings = settings.getSettings("child-settings");
080 assertTrue(childSettings instanceof XmlSettings);
081 assertEquals(1, childSettings.getKeys().length);
082 assertEquals("child-key", childSettings.getKeys()[0]);
083 }
084
085 public void testRemove_RemovesElement() throws ParserConfigurationException, FactoryConfigurationError,
086 SAXException, IOException {
087 StringBuffer sb = new StringBuffer();
088 sb.append("<?xml version=\"1.0\"?>");
089 sb.append("<settings name=\"test-settings\">");
090 sb.append(" <entry key=\"key-1\" value=\"value-1\" />");
091 sb.append(" <entry key=\"key-2\" value=\"false\" />");
092 sb.append(" <entry key=\"key-3\" value=\"1.5\" />");
093 sb.append("</settings>");
094
095 Element element = createElement(sb.toString());
096
097 XmlSettings settings = new XmlSettings(null, element);
098
099 assertTrue(settings.contains("key-2"));
100
101 settings.remove("key-2");
102
103 Element settingsElement = settings.getElement();
104 NodeList childNodes = settingsElement.getChildNodes();
105 for (int i = 0; i < childNodes.getLength(); i++) {
106 Node node = childNodes.item(i);
107 if (node instanceof Element && node.getNodeName().equals("entry")) {
108 Element tmp = (Element) node;
109 assertFalse(tmp.getAttribute("key").equals("key-2"));
110 }
111 }
112 }
113
114 public void testSetValue() throws ParserConfigurationException, FactoryConfigurationError {
115 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
116 Element element = doc.createElement("settings");
117 element.setAttribute("name", "test-settings");
118 doc.appendChild(element);
119 Element entry = doc.createElement("entry");
120 entry.setAttribute("key", "_key");
121 entry.setAttribute("value", "_value");
122 element.appendChild(entry);
123
124 XmlSettings settings = new XmlSettings(null, element);
125
126 settings.setString("_key", "new value");
127 assertEquals("new value", entry.getAttribute("value"));
128 }
129
130 public void testSave() throws ParserConfigurationException, FactoryConfigurationError, IOException {
131 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
132 Element parentElement = doc.createElement("settings");
133 parentElement.setAttribute("name", "parent-settings");
134 doc.appendChild(parentElement);
135 Element childElement = doc.createElement("settings");
136 childElement.setAttribute("name", "child-settings");
137 parentElement.appendChild(childElement);
138
139 TestableXmlSettingsReaderWriter readerWriter = new TestableXmlSettingsReaderWriter();
140 RootXmlSettings parentSettings = new RootXmlSettings(doc, readerWriter);
141 Settings childSettings = parentSettings.getSettings("child-settings");
142 childSettings.save();
143
144 assertEquals(parentSettings, readerWriter.lastWritten);
145 }
146
147 public void testChildSettings() throws ParserConfigurationException, FactoryConfigurationError, SAXException, IOException {
148 StringBuffer sb = new StringBuffer();
149 sb.append("<?xml version=\"1.0\"?>");
150 sb.append("<settings name=\"test-settings\">");
151 sb.append(" <entry key=\"key-1\" value=\"value-1\" />");
152 sb.append(" <entry key=\"key-2\" value=\"false\" />");
153 sb.append(" <entry key=\"key-3\" value=\"1.5\" />");
154 sb.append(" <settings name=\"child-settings\">");
155 sb.append(" <entry key=\"child-key\" value=\"value\" />");
156 sb.append(" </settings>");
157 sb.append("</settings>");
158
159 XmlSettings settings = new XmlSettings(createElement(sb.toString()));
160
161 assertEquals(Arrays.asList(new String[] {"child-settings"}), Arrays.asList(settings.getChildSettings()));
162 }
163
164 private static Element createElement(String xml) throws ParserConfigurationException, FactoryConfigurationError,
165 SAXException, IOException {
166 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
167 new InputSource(new StringReader(xml)));
168 return doc.getDocumentElement();
169 }
170
171 }