001/* $Id: IncludeTest.java 1382109 2012-09-07 18:19:16Z simonetripodi $ 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019package org.apache.commons.digester3.xmlrules; 020 021import static org.apache.commons.digester3.binder.DigesterLoader.newLoader; 022import static org.junit.Assert.assertEquals; 023 024import java.io.StringReader; 025import java.net.URL; 026import java.util.ArrayList; 027import java.util.List; 028 029import org.apache.commons.digester3.Digester; 030import org.apache.commons.digester3.Rule; 031import org.apache.commons.digester3.binder.AbstractRulesModule; 032import org.junit.Test; 033 034/** 035 * Test for the include class functionality 036 */ 037public class IncludeTest 038{ 039 040 public static class TestDigesterRulesModule 041 extends AbstractRulesModule 042 { 043 044 @Override 045 protected void configure() 046 { 047 forPattern( "bar" ).addRule( new Rule() 048 { 049 050 @Override 051 public void body( String namespace, String name, String text ) 052 throws Exception 053 { 054 List<String> stringList = getDigester().peek(); 055 stringList.add( text ); 056 } 057 058 } ); 059 } 060 061 } 062 063 @Test 064 public void testBasicInclude() 065 throws Exception 066 { 067 final String rulesXml = "<?xml version='1.0'?>" 068 + "<!DOCTYPE digester-rules PUBLIC \"-//Apache Commons //DTD digester-rules XML V1.0//EN\" " 069 + "\"http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd\">" 070 + "<digester-rules>" 071 + " <pattern value='root/foo'>" 072 + " <include class='org.apache.commons.digester3.xmlrules.IncludeTest$TestDigesterRulesModule' />" 073 + " </pattern>" 074 + "</digester-rules>"; 075 076 String xml = "<?xml version='1.0' ?><root><foo><bar>short</bar></foo></root>"; 077 078 List<String> list = new ArrayList<String>(); 079 Digester digester = newLoader( new FromXmlRulesModule() 080 { 081 082 @Override 083 protected void loadRules() 084 { 085 loadXMLRulesFromText( rulesXml ); 086 } 087 088 } ).newDigester(); 089 digester.push( list ); 090 digester.parse( new StringReader( xml ) ); 091 092 assertEquals( "Number of entries", 1, list.size() ); 093 assertEquals( "Entry value", "short", list.get( 0 ) ); 094 } 095 096 @Test 097 public void testUrlInclude() 098 throws Exception 099 { 100 final String rulesXml = "<?xml version='1.0'?>" 101 + "<!DOCTYPE digester-rules PUBLIC \"-//Apache Commons //DTD digester-rules XML V1.0//EN\" " 102 + "\"http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd\">" 103 + "<digester-rules>" 104 + " <pattern value='root/foo1'>" 105 + " <include url='classpath:org/apache/commons/digester3/xmlrules/testrulesinclude.xml' />" 106 + " </pattern>" 107 + " <pattern value='root/foo2'>" 108 + " <include url='classpath:org/apache/commons/digester3/xmlrules/testrulesinclude.xml' />" 109 + " </pattern>" 110 + "</digester-rules>"; 111 112 String xml = "<?xml version='1.0' ?><root><foo1><bar><foo value='foo1'/></bar></foo1><foo2><bar><foo value='foo2'/></bar></foo2></root>"; 113 114 List<String> list = new ArrayList<String>(); 115 Digester digester = newLoader( new FromXmlRulesModule() 116 { 117 118 @Override 119 protected void loadRules() 120 { 121 loadXMLRulesFromText( rulesXml ); 122 } 123 124 }).newDigester(); 125 digester.push( list ); 126 digester.parse( new StringReader( xml ) ); 127 assertEquals( "[foo1, foo2]", list.toString() ); 128 } 129 130 /** 131 * Validates that circular includes are detected and result in an exception 132 */ 133 @Test( expected = org.apache.commons.digester3.binder.DigesterLoadingException.class ) 134 public void testCircularInclude() 135 throws Exception 136 { 137 final URL url = ClassLoader.getSystemResource( "org/apache/commons/digester3/xmlrules/testCircularRules.xml" ); 138 newLoader( new FromXmlRulesModule() 139 { 140 141 @Override 142 protected void loadRules() 143 { 144 loadXMLRules( url ); 145 } 146 147 }).newDigester(); 148 } 149 150}