TestParamEntities.java

package org.codehaus.stax.test.vstream;

import java.io.StringReader;
import java.util.*;

import javax.xml.stream.*;

/**
 * Unit test suite that tests various aspects of parameter entity resolution
 * in the external DTD subset.
 *
 * @author Tatu Saloranta
 */
public class TestParamEntities
    extends BaseVStreamTest
{
    /**
     * Test similar to one in xmltest (valid/not-sa/003.xml, specifically)
     */
    public void testExternalParamDeclViaPE()
        throws XMLStreamException
    {
        HashMap<String,String> m = new HashMap<>();
        m.put("ent1", "<!ELEMENT doc EMPTY>\n"
            +"<!ENTITY % e SYSTEM 'ent2'>\n"
              +"<!ATTLIST doc a1 CDATA %e; 'v1'>");
        m.put("ent2", "");

        // Following should be ok; notations have been declared ok
        String XML = "<!DOCTYPE doc SYSTEM 'ent1'><doc />";

        XMLInputFactory f = getValidatingFactory(true);
        setResolver(f, new MyResolver(m));
        streamThrough(getValidatingReader(XML));
    }

    final static class MyResolver
        implements XMLResolver
    {
        final Map<String, String> mEntities;

        public MyResolver(Map<String, String> entities) {
            mEntities = entities;
        }
        
        @Override
        public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace)
        {
            String str = (String) mEntities.get(publicID);
            if (str == null) {
                str = (String) mEntities.get(systemID);
            }
            return (str == null) ? null : new StringReader(str); 
        }
    }
}