/**
 *
 * 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.openejb.jee.jpa;


import junit.framework.TestCase;
import org.apache.openejb.jee.JAXBContextFactory;
import org.apache.openejb.jee.jpa.unit.JaxbPersistenceFactory;
import org.apache.openejb.jee.jpa.unit.Persistence;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.ElementNameAndAttributeQualifier;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * @version $Revision$ $Date$
 */
public class PersistenceXmlTest extends TestCase {

    /**
     * @throws Exception
     */
    public void testPersistenceVersion1() throws Exception {
        final JAXBContext ctx = JAXBContextFactory.newInstance(Persistence.class);
        final Unmarshaller unmarshaller = ctx.createUnmarshaller();

        final URL resource = this.getClass().getClassLoader().getResource("persistence-example.xml");
        final InputStream in = resource.openStream();
        final java.lang.String expected = readContent(in);

        final Persistence element = (Persistence) unmarshaller.unmarshal(new ByteArrayInputStream(expected.getBytes()));
        unmarshaller.setEventHandler(new TestValidationEventHandler());
        System.out.println("unmarshalled");

        final Marshaller marshaller = ctx.createMarshaller();
        marshaller.setProperty("jaxb.formatted.output", true);

        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        marshaller.marshal(element, baos);

        final String actual = new String(baos.toByteArray());

        final Diff myDiff = new Diff(expected, actual);
        myDiff.overrideElementQualifier(new ElementNameAndAttributeQualifier());
        assertTrue("Files are similar " + myDiff, myDiff.similar());
    }

    /**
     * @throws Exception
     */
    public void testPersistenceVersion2() throws Exception {
        final JAXBContext ctx = JAXBContextFactory.newInstance(Persistence.class);
        final Unmarshaller unmarshaller = ctx.createUnmarshaller();

        final URL resource = this.getClass().getClassLoader().getResource("persistence_2.0-example.xml");
        final InputStream in = resource.openStream();
        final java.lang.String expected = readContent(in);

        final Persistence element = (Persistence) unmarshaller.unmarshal(new ByteArrayInputStream(expected.getBytes()));
        unmarshaller.setEventHandler(new TestValidationEventHandler());
        System.out.println("unmarshalled");

        final Marshaller marshaller = ctx.createMarshaller();
        marshaller.setProperty("jaxb.formatted.output", true);

        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        marshaller.marshal(element, baos);

        final String actual = new String(baos.toByteArray());

        final Diff myDiff = new Diff(expected, actual);
        myDiff.overrideElementQualifier(new ElementNameAndAttributeQualifier());
        assertTrue("Files are similar " + myDiff, myDiff.similar());
    }

    public void testPersistenceJakarta() throws Exception {

        // make sure we can still parse previous versions
        {
            final URL resource = this.getClass().getClassLoader().getResource("persistence_2.0-example.xml");
            final InputStream in = resource.openStream();

            final Persistence element = JaxbPersistenceFactory.getPersistence(Persistence.class, in);

            assertNotNull(element);
            System.out.println("unmarshalled " + element);
        }
        {
            final URL resource = this.getClass().getClassLoader().getResource("persistence-example.xml");
            final InputStream in = resource.openStream();

            final Persistence element = JaxbPersistenceFactory.getPersistence(Persistence.class, in);

            assertNotNull(element);
            System.out.println("unmarshalled " + element);
        }

        // try new jakarta namespace
        {
            final URL resource = this.getClass().getClassLoader().getResource("persistence_2.0-jakarta.xml");
            final InputStream in = resource.openStream();

            final Persistence element = JaxbPersistenceFactory.getPersistence(Persistence.class, in);

            assertNotNull(element);
            System.out.println("unmarshalled " + element);
        }

    }

    private java.lang.String readContent(InputStream in) throws IOException {
        final StringBuilder sb = new StringBuilder();
        in = new BufferedInputStream(in);
        int i = in.read();
        while (i != -1) {
            sb.append((char) i);
            i = in.read();
        }
        final java.lang.String content = sb.toString();
        return content;
    }

    private static class TestValidationEventHandler implements ValidationEventHandler {
        public boolean handleEvent(final ValidationEvent validationEvent) {
            System.out.println(validationEvent.getMessage());
            return true;
        }
    }
}
