/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.jelly.core;

import java.io.File;
import java.io.FileReader;
import java.net.URL;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import junit.framework.TestSuite;

import org.apache.commons.jelly.JellyContext;
import org.apache.commons.jelly.Script;
import org.apache.commons.jelly.TJTagLibrary;
import org.apache.commons.jelly.parser.XMLParser;
import org.apache.commons.jelly.test.BaseJellyTest;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

/**
 * Tests for bug JELLY-184, where enabling feature
 * "http://xml.org/sax/features/namespace-prefixes" breaks Jelly.
 * 
 * @author <a href="mailto:john.spackman@zenesis.net">John Spackman</a>
 */
public class TestNamespacePrefixes extends BaseJellyTest {

	public TestNamespacePrefixes(String name) {
		super(name);
	}

	public static TestSuite suite() throws Exception {
		return new TestSuite(TestNamespacePrefixes.class);
	}

    protected void addCustomTagLib(JellyContext context) {
        context.registerTagLibrary(TJTagLibrary.NS, TJTagLibrary.class.getName());
    }

    

	public void testNamespacePrefixes() throws Exception {
		SAXParserFactory pf = SAXParserFactory.newInstance();
		pf.setValidating(false);
		pf.setNamespaceAware(true);
		pf.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
		XMLReader reader = null;
		SAXParser parser = pf.newSAXParser();
		reader = parser.getXMLReader();

        URL url = this.getClass().getResource("testNamespacePrefixes.xml");
        if (null == url)
            throw new Exception("Could not find Jelly script: testNamespacePrefixes.xml in package of class: " + getClass().getName());
		InputSource inSrc = new InputSource(new FileReader(new File(url.getPath())));

		JellyContext context = getJellyContext();
		XMLParser jellyParser = new XMLParser();
		jellyParser.setContext(context);

		reader.setContentHandler(jellyParser);
		reader.parse(inSrc);

		Script script = jellyParser.getScript();
		script.compile();
		script.run(context, getXMLOutput());
		
		String str = getStringOutput().toString();
		System.out.println(str);
	}
}
