001 /* 002 * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons-sandbox//xmlio/src/test/org/apache/commons/xmlio/in/SimpleImportTest.java,v 1.1 2004/10/08 11:56:20 ozeigermann Exp $ 003 * $Revision: 155476 $ 004 * $Date: 2005-02-26 13:31:24 +0000 (Sat, 26 Feb 2005) $ 005 * 006 * ==================================================================== 007 * 008 * Copyright 2004 The Apache Software Foundation 009 * 010 * Licensed under the Apache License, Version 2.0 (the "License"); 011 * you may not use this file except in compliance with the License. 012 * You may obtain a copy of the License at 013 * 014 * http://www.apache.org/licenses/LICENSE-2.0 015 * 016 * Unless required by applicable law or agreed to in writing, software 017 * distributed under the License is distributed on an "AS IS" BASIS, 018 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 019 * See the License for the specific language governing permissions and 020 * limitations under the License. 021 * 022 */ 023 024 package org.apache.commons.xmlio.in; 025 026 027 import java.io.*; 028 import java.util.*; 029 030 import junit.framework.*; 031 032 import org.apache.commons.xmlio.in.ConversionHelpers; 033 import org.apache.commons.xmlio.in.DefaultSimpleImportHandler; 034 import org.apache.commons.xmlio.in.Item; 035 import org.apache.commons.xmlio.in.SimpleImportHandler; 036 import org.apache.commons.xmlio.in.SimpleImporter; 037 import org.apache.commons.xmlio.in.SimplePath; 038 import org.apache.commons.xmlio.out.*; 039 import org.xml.sax.helpers.AttributesImpl; 040 import org.xml.sax.InputSource; 041 042 /** 043 * Try out importer a little bit. 044 * 045 */ 046 public class SimpleImportTest extends TestCase { 047 048 public static Test suite() { 049 TestSuite suite = new TestSuite(SimpleImportTest.class); 050 return suite; 051 } 052 053 public SimpleImportTest(String testName) { 054 super(testName); 055 } 056 057 public static void main(java.lang.String[] args) { 058 junit.textui.TestRunner.run(suite()); 059 } 060 061 public void testMain() { 062 System.out.println("MAIN TEST"); 063 String testString = 064 "<?xml version='1.0' encoding='ISO-8859-1'?><response state='ok'><mixed>Olli <b>ist</b> toll<</mixed><text>Text<<![CDATA[<huhu>Dies ist aller CDATA</huhu>]]></text></response>\n"; 065 System.out.println("TEST STRING:"); 066 System.out.println(testString); 067 System.out.println(""); 068 SimpleImporter dumpImporter = new SimpleImporter(); 069 DumpTester dumpTester = new DumpTester(); 070 try { 071 InputStream in = new ByteArrayInputStream(testString.getBytes("ISO-8859-1")); 072 dumpImporter.addSimpleImportHandler(dumpTester); 073 dumpImporter.setIncludeLeadingCDataIntoStartElementCallback(true); 074 dumpImporter.setFullDebugMode(true); 075 dumpImporter.setUseQName(false); 076 dumpImporter.parse(new InputSource(in)); 077 078 String fullDebug = dumpImporter.getParsedStreamForDebug(); 079 System.out.println("FULL DEBUG START"); 080 System.out.println(fullDebug); 081 System.out.println("FULL DEBUG END"); 082 083 assertEquals(testString, fullDebug); 084 085 System.out.println(dumpImporter.getFoundMixedPCData() ? "MIXED" : "NOT MIXED"); 086 087 // checks for maximum chunk go here as well (no two text() callbacks may follow each other) 088 String expectedDump = 089 "DOCUMENT START\n/response:\n<response state=\"ok\">\n/response/mixed:\n<mixed>\nOlli\n/response/mixed/b:\n<b>\nist\n/response/mixed/b:\n</b>\n/response/mixed/text():\ntoll<\n/response/mixed:\n</mixed>\n/response/text:\n<text>\n<![CDATA[Text<<huhu>Dies ist aller CDATA</huhu>]]>\n/response/text:\n</text>\n/response:\n</response>\nDOCUMENT END\n"; 090 String actualDump = dumpTester.logBuffer.toString(); 091 092 System.out.println("COLLECTED DUMP START"); 093 System.out.println(actualDump); 094 System.out.println("COLLECTED DUMP END"); 095 096 if (!actualDump.equals(expectedDump)) { 097 fail("\nWrong output:\n'" + actualDump + "'\nShould be:\n'" + expectedDump + "'\n"); 098 } 099 } catch (Exception e) { 100 e.printStackTrace(); 101 fail("Error: " + e); 102 } 103 } 104 105 public void testDetail() { 106 System.out.println("DETAIL TEST"); 107 108 String testString = 109 "<?xml version='1.0' encoding='ISO-8859-1'?><response state='ok' boolean='true' int='-100' long='4676767676' ns:olli='cool'><mixed>Olli <b>ist</b> toll<</mixed><text>Text<<![CDATA[<huhu>Dies ist aller CDATA</huhu>]]></text></response>\n"; 110 System.out.println("TEST STRING:"); 111 System.out.println(testString); 112 System.out.println(""); 113 try { 114 InputStream in = new ByteArrayInputStream(testString.getBytes("ISO-8859-1")); 115 SimpleImporter dumpImporter = new SimpleImporter(); 116 DetailTester detailTester = new DetailTester(); 117 dumpImporter.addSimpleImportHandler(detailTester); 118 dumpImporter.setIncludeLeadingCDataIntoStartElementCallback(true); 119 dumpImporter.parse(new InputSource(in)); 120 } catch (Exception e) { 121 e.printStackTrace(); 122 fail("Error: " + e); 123 } 124 } 125 126 public void testPathList() { 127 System.out.println("PATH LIST TEST"); 128 String testString = 129 "<?xml version='1.0' encoding='ISO-8859-1'?>" 130 + "<root xmlns:olli=\"http://www.zeigermann.de\" xmlns:daniel=\"http://www.floreysoft.de\"><sub>" 131 + "<olli:element>\n" 132 + "<daniel:element>Huhu</daniel:element>\n" 133 + "</olli:element>" 134 + "</sub></root>"; 135 System.out.println("TEST STRING:"); 136 System.out.println(testString); 137 System.out.println(""); 138 139 try { 140 InputStream in = new ByteArrayInputStream(testString.getBytes("ISO-8859-1")); 141 SimpleImporter testImporter = new SimpleImporter(); 142 PathListTester tester = new PathListTester(); 143 testImporter.addSimpleImportHandler(tester); 144 testImporter.setBuildComplexPath(true); 145 testImporter.setUseQName(false); 146 testImporter.setIncludeLeadingCDataIntoStartElementCallback(false); 147 testImporter.parse(new InputSource(in)); 148 } catch (Exception e) { 149 e.printStackTrace(); 150 fail("Error: " + e); 151 } 152 } 153 154 private final static class PathListTester extends DefaultSimpleImportHandler { 155 156 public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) { 157 158 boolean matchesRoot = path.matches(new Item("root")) && path.matches(Item.ITEM_ANY); 159 boolean matchesOlli = 160 path.matches(new Item("element")) && path.matches(new Item("element", "http://www.zeigermann.de")); 161 boolean matchesDaniel = 162 path.matches( 163 new Item[] { 164 new Item("root"), 165 Item.ITEM_ANY, 166 Item.ITEM_ANY, 167 new Item("element", "http://www.floreysoft.de")}, 168 false); 169 boolean matchesSub = path.matches(new Item("sub")); 170 171 boolean matchesFromStart = path.matchesFromRoot(new Item[] { new Item("root")}); 172 173 if (matchesFromStart && !matchesRoot && !matchesOlli && !matchesDaniel && !matchesSub) { 174 fail("Item matching does not work"); 175 } 176 } 177 178 public void cData(SimplePath path, String cdata) { 179 if ("Huhu".equals(cdata)) { 180 if (!path 181 .matches( 182 new Item[] { 183 new Item("root"), 184 new Item("sub"), 185 new Item("element"), 186 new Item("element", "http://www.floreysoft.de")})) { 187 fail("CDATA is in wrong path"); 188 } 189 } 190 } 191 192 } 193 194 private final static class DumpTester implements SimpleImportHandler { 195 196 public StringBuffer logBuffer = new StringBuffer(); 197 public boolean previousCallbackWasCDATA = true; 198 199 public void startDocument() { 200 previousCallbackWasCDATA = false; 201 log("DOCUMENT START"); 202 } 203 204 public void endDocument() { 205 previousCallbackWasCDATA = false; 206 log("DOCUMENT END"); 207 } 208 209 public void cData(SimplePath path, String cdata) { 210 if (previousCallbackWasCDATA) 211 fail("No two cData callbacks may follow each other, as this violates the maximum chunk guarantee given in API spec"); 212 previousCallbackWasCDATA = true; 213 214 log(path.toString() + "/text():"); 215 String encodedText = XMLEncode.xmlEncodeText(cdata); 216 log(encodedText); 217 } 218 219 public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) { 220 previousCallbackWasCDATA = false; 221 log(path.toString() + ":"); 222 String startTag = XMLWriter.createStartTag(name, attributes); 223 log(startTag); 224 if (leadingCDdata != null) { 225 String encodedText = XMLEncode.xmlEncodeText(leadingCDdata); 226 log(encodedText); 227 } 228 } 229 230 public void endElement(SimplePath path, String name) { 231 previousCallbackWasCDATA = false; 232 log(path.toString() + ":"); 233 log("</" + name + ">"); 234 } 235 236 private void log(String text) { 237 logBuffer.append(text).append('\n'); 238 } 239 } 240 241 private final class DetailTester extends DefaultSimpleImportHandler { 242 243 public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) { 244 245 // checking path 246 247 if (!path.matchsAny(new String[] { "response", "mixed", "text", "b" })) { 248 fail("matchesAny(String[]) does not work"); 249 } 250 251 List list = new ArrayList(); 252 list.add(new SimplePath("response")); 253 list.add(new SimplePath("mixed")); 254 list.add(new SimplePath("text")); 255 list.add(new SimplePath("b")); 256 if (!path.matchsAny(list)) { 257 fail("matchesAny(Collection) does not work"); 258 } 259 260 if (!path 261 .matchsAny(new String[] { "/response", "/response/mixed", "/response/text", "/response/mixed/b" })) { 262 fail("absolute paths do not seem to work"); 263 } 264 265 if (!path.matchsAny(new String[] { "response", "response/mixed", "response/text", "mixed/b" })) { 266 fail("relative paths do not seem to work"); 267 } 268 269 // checking attribute 270 if (path.matches("/response")) { 271 String state = ConversionHelpers.getString(attributes.getValue("state"), "error"); 272 boolean b = ConversionHelpers.getBoolean(attributes.getValue("boolean"), false); 273 int i = ConversionHelpers.getInt(attributes.getValue("int"), 4711); 274 long l = ConversionHelpers.getLong(attributes.getValue("long"), 1L); 275 assertEquals(state, "ok"); 276 assertEquals(b, true); 277 assertEquals(i, -100); 278 assertEquals(l, 4676767676L); 279 280 // this is actually not there 281 String notThere = ConversionHelpers.getString(attributes.getValue("notThere"), "is not there"); 282 assertEquals(notThere, "is not there"); 283 284 assertEquals(attributes.getLength(), 5); 285 assertEquals(attributes.getValue(0), "ok"); 286 assertEquals(attributes.getType("ns:olli"), "CDATA"); 287 // these should be enough... 288 } 289 } 290 } 291 292 }