/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2002-2006, GeoTools Project Managment Committee (PMC)
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License as published by the Free Software Foundation;
 *    version 2.1 of the License.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 */
package org.geotools.gml2;

import junit.framework.TestCase;
import org.w3c.dom.Document;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import com.vividsolutions.jts.geom.Point;
import org.geotools.feature.Feature;
import org.geotools.xml.Parser;
import org.geotools.xml.StreamingParser;


public class GMLApplicationSchemaParsingTest extends TestCase {
    public void testStreamFeatureWithIncorrectSchemaLocation()
        throws Exception {
        InputStream in = getClass().getResourceAsStream("feature.xml");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);

        Document document = factory.newDocumentBuilder().parse(in);

        //update hte schema location
        document.getDocumentElement().removeAttribute("xsi:schemaLocation");

        //reserialize the document
        File schemaFile = File.createTempFile("test", "xsd");
        schemaFile.deleteOnExit();

        Transformer tx = TransformerFactory.newInstance().newTransformer();
        tx.transform(new DOMSource(document), new StreamResult(schemaFile));

        in.close();
        in = new FileInputStream(schemaFile);

        GMLConfiguration configuration = new GMLConfiguration();
        configuration.getProperties().add(Parser.Properties.IGNORE_SCHEMA_LOCATION);
        configuration.getProperties().add(Parser.Properties.PARSE_UNKNOWN_ELEMENTS);

        StreamingParser parser = new StreamingParser(configuration, in, "//TestFeature");

        for (int i = 0; i < 3; i++) {
            Feature f = (Feature) parser.parse();

            assertNotNull(f);
        }

        assertNull(parser.parse());

        try {
            in.close();
        } catch (IOException e) {
            // nothing to do, but this throws an exception under java 6
        }
    }

    public void testStreamPointWithIncorrectSchemaLocation()
        throws Exception {
        InputStream in = getClass().getResourceAsStream("feature.xml");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);

        Document document = factory.newDocumentBuilder().parse(in);

        //update hte schema location
        document.getDocumentElement().removeAttribute("xsi:schemaLocation");

        //reserialize the document
        File schemaFile = File.createTempFile("test", "xsd");
        schemaFile.deleteOnExit();

        Transformer tx = TransformerFactory.newInstance().newTransformer();
        tx.transform(new DOMSource(document), new StreamResult(schemaFile));

        in.close();
        in = new FileInputStream(schemaFile);

        GMLConfiguration configuration = new GMLConfiguration();
        configuration.getProperties().add(Parser.Properties.IGNORE_SCHEMA_LOCATION);
        configuration.getProperties().add(Parser.Properties.PARSE_UNKNOWN_ELEMENTS);

        StreamingParser parser = new StreamingParser(configuration, in, "//Point");

        for (int i = 0; i < 3; i++) {
            Point p = (Point) parser.parse();

            assertNotNull(p);
            assertEquals(i, p.getX(), 0d);
            assertEquals(i, p.getY(), 0d);
        }

        assertNull(parser.parse());

        try {
            in.close();
        } catch (IOException e) {
            // nothing to do, but this throws an exception under java 6
        }
    }

    public void testWithCorrectSchemaLocation() throws Exception {
        InputStream in = getClass().getResourceAsStream("feature.xml");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);

        Document document = factory.newDocumentBuilder().parse(in);

        //update hte schema location
        String schemaLocation = getClass().getResource("test.xsd").toString();
        document.getDocumentElement()
                .setAttribute("xsi:schemaLocation", TEST.NAMESPACE + " " + schemaLocation);

        //reserialize the document
        File schemaFile = File.createTempFile("test", "xsd");
        schemaFile.deleteOnExit();

        Transformer tx = TransformerFactory.newInstance().newTransformer();
        tx.transform(new DOMSource(document), new StreamResult(schemaFile));

        in.close();
        in = new FileInputStream(schemaFile);

        StreamingParser parser = new StreamingParser(new GMLConfiguration(), in, "//TestFeature");

        for (int i = 0; i < 3; i++) {
            Feature f = (Feature) parser.parse();
            assertNotNull(f);

            assertEquals(i + "", f.getID());
            assertEquals(i, ((Point) f.getDefaultGeometry()).getX(), 0d);
            assertEquals(i, ((Point) f.getDefaultGeometry()).getY(), 0d);
            assertEquals(i, ((Integer) f.getAttribute("count")).intValue());
        }

        assertNull(parser.parse());

        try {
            in.close();
        } catch (IOException e) {
            // nothing to do, but this throws an exception under java 6
        }
    }
}
