/*
 * Copyright (c) 1998, 2020 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:
//     dclarke - Dynamic Persistence INCUBATION - Enhancement 200045
//                  http://wiki.eclipse.org/EclipseLink/Development/Dynamic
//
// This code is being developed under INCUBATION and is not currently included
// in the automated EclipseLink build. The API in this code may change, or
// may never be included in the product. Please provide feedback through mailing
// lists or the bug database.
package org.eclipse.persistence.tools.schemaframework;

//EclipseLink imports
import java.util.Collection;

import org.eclipse.persistence.dynamic.DynamicType;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.sessions.DatabaseSession;

/**
 * Extended SchemaManager to handle the creation of tables for dynamic types.
 *
 * TODO: Handle the case where the provided session uses an external transaction
 * controller or is from an external connection pool. In these cases a custom
 * direct connection must be created cloning the minimal state needed from the
 * primary session.
 *
 * @author dclarke, mnorman
 * @since EclipseLink 1.2
 */
public class DynamicSchemaManager extends SchemaManager {

    public DynamicSchemaManager(DatabaseSession session) {
        super(session);

    }

    /**
     * Create the database tables for one or more entityTypes.
     *
     * TODO: At present this method will create all tables that do not exist. It
     * needs to be made specific to the entityTypes.
     *
     * @param entityTypes
     */
    public void createTables(DynamicType... entityTypes) {
        createTables(true, entityTypes);
    }

    public void createTables(boolean generateFKConstraints, DynamicType... entityTypes) {
        AbstractSession createSession = getSession();

        TableCreator creator = new DefaultTableGenerator(getSession().getProject(), generateFKConstraints).generateFilteredDefaultTableCreator(createSession);
        creator.setIgnoreDatabaseException(true);
        creator.createTables((DatabaseSession) getSession(), this);
    }

    public void createTables(boolean generateFKConstraints, Collection<DynamicType> entityTypes) {
        AbstractSession createSession = getSession();

        TableCreator creator = new DefaultTableGenerator(getSession().getProject(), generateFKConstraints).generateFilteredDefaultTableCreator(createSession);
        creator.setIgnoreDatabaseException(true);
        creator.createTables((DatabaseSession) getSession(), this);
    }

}
