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}