/*
 * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.tests.jpql;

import java.lang.reflect.Member;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.persistence.jpa.jpql.tools.spi.IEntity;
import org.eclipse.persistence.jpa.jpql.tools.spi.IManagedType;
import org.eclipse.persistence.jpa.jpql.tools.spi.IMappingBuilder;
import org.eclipse.persistence.jpa.jpql.tools.spi.IQuery;
import org.eclipse.persistence.jpa.jpql.tools.spi.IType;
import org.eclipse.persistence.jpa.tests.jpql.tools.spi.java.JavaManagedTypeProvider;
import org.eclipse.persistence.jpa.tests.jpql.tools.spi.java.JavaQuery;
import org.junit.Assert;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @version 2.5
 * @since 2.3
 * @author Pascal Filion
 */
@SuppressWarnings("nls")
public class JavaORMConfiguration extends JavaManagedTypeProvider
                                  implements IORMConfiguration {

    private String ormXmlFileName;
    private boolean populated;
    private Map<String, IQuery> queries;

    /**
     * Creates a new <code>JavaORMConfiguration</code>.
     *
     */
    public JavaORMConfiguration(IMappingBuilder<Member> mappingBuilder, String ormXmlFileName) {
        super(mappingBuilder);
        this.ormXmlFileName = ormXmlFileName;
    }

    protected void addQuery(Map<String, IQuery> queries, Node node) {

        NamedNodeMap attributes = node.getAttributes();
        Attr nameNode = (Attr) attributes.getNamedItem("name");
        NodeList children = node.getChildNodes();

        for (int childIndex = children.getLength(); --childIndex >= 0; ) {
            Node child = children.item(childIndex);

            if (child.getNodeName().equals("query")) {
                queries.put(nameNode.getValue(), new JavaQuery(this, child.getTextContent()));
            }
        }
    }

    protected String buildLocation() throws Exception {
        URL url = getClass().getResource("/META-INF/" + ormXmlFileName);
        Assert.assertNotNull("/META-INF/" + ormXmlFileName + " could not be found on the class path", url);
        return url.toURI().toString();
    }

    @Override
    public Iterable<IEntity> entities() {
        populate();
        return super.entities();
    }

    @Override
    public IEntity getEntity(String entityName) {
        populate();
        return super.getEntity(entityName);
    }

    @Override
    public IManagedType getManagedType(IType type) {
        populate();
        return super.getManagedType(type);
    }

    @Override
    public IQuery getNamedQuery(String queryName) {
        populate();
        return queries.get(queryName);
    }

    @Override
    public Iterable<IManagedType> managedTypes() {
        populate();
        return super.managedTypes();
    }

    protected void populate() {

        if (!populated) {

            populated = true;

            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder =  factory.newDocumentBuilder();
                Document document = builder.parse(buildLocation());

                populateQueries(document);
                populateManagedTypes(document);
            }
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

    protected void populateManagedTypes(Document document) throws Exception {

        NodeList nodeList = document.getElementsByTagName("entity");

        for (int index = nodeList.getLength(); --index >= 0; ) {
            Node node = nodeList.item(index);
            String typeName = node.getAttributes().getNamedItem("class").getNodeValue();
            addEntity(Class.forName(typeName));
        }

        nodeList = document.getElementsByTagName("mapped-superclass");

        for (int index = nodeList.getLength(); --index >= 0; ) {
            Node node = nodeList.item(index);
            String typeName = node.getAttributes().getNamedItem("class").getNodeValue();
            addMappedSuperclass(Class.forName(typeName));
        }

        nodeList = document.getElementsByTagName("embeddable");

        for (int index = nodeList.getLength(); --index >= 0; ) {
            Node node = nodeList.item(index);
            String typeName = node.getAttributes().getNamedItem("class").getNodeValue();
            addEmbeddable(Class.forName(typeName));
        }
    }

    protected void populateQueries(Document document) {

        queries = new HashMap<String, IQuery>();
        NodeList nodeList = document.getElementsByTagName("named-query");

        for (int index = nodeList.getLength(); --index >= 0; ) {
            Node node = nodeList.item(index);
            addQuery(queries, node);
        }
    }
}
