/*
 * Copyright (c) 1998, 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 from Oracle TopLink
package org.eclipse.persistence.testing.models.bigbad;

import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.mappings.converters.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.descriptors.RelationalDescriptor;

/**
 * This class was generated by the TopLink project class generator.
 * It stores the meta-data (descriptors) that define the TopLink mappings.
 * @see org.eclipse.persistence.sessions.factories.ProjectClassGenerator
 */
public class BigBadProject extends org.eclipse.persistence.sessions.Project {

    public BigBadProject() {
        setName("BigBad");
        applyLogin();

        addDescriptor(buildBigBadObjectDescriptor());
        addDescriptor(buildBigBadAggregateDescriptor());
        addDescriptor(buildBigBadReferenceDataDescriptor());
    }

    @Override
    public void applyLogin() {
        DatabaseLogin login = new DatabaseLogin();
        setLogin(login);
    }

    public RelationalDescriptor buildBigBadObjectDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();
        descriptor.setJavaClass(org.eclipse.persistence.testing.models.bigbad.BigBadObject.class);
        descriptor.addTableName("BIG_BAD_OBJ");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID01");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID02");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID03");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID04");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID05");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID06");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID07");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID08");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID09");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_OBJ.ID10");

        // Mappings.
        // strings
        for (int index = 0; index < 20; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("string" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.STRING_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // ids (after to check indexing)
        for (int index = 0; index < 10; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("id" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.ID" + indexString);
            descriptor.addMapping(directMapping);
        }
        // calendar
        for (int index = 0; index < 10; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("calendar" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.CALENDAR_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // date
        for (int index = 0; index < 10; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("date" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.DATE_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // time
        for (int index = 0; index < 10; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("time" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.TIME_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // timestamp
        for (int index = 0; index < 10; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("timestamp" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.TIMESTAMP_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // largestring
        for (int index = 0; index < 3; index++) {
            DirectToFieldMapping directMapping = new DirectToFieldMapping();
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            directMapping.setAttributeName("largeString" + indexString);
            directMapping.setFieldName("BIG_BAD_OBJ.LSTRING_DATA" + indexString);
            descriptor.addMapping(directMapping);
        }
        // blob
        DirectToFieldMapping directMapping = new DirectToFieldMapping();
        directMapping.setAttributeName("blob");
        directMapping.setFieldName("BIG_BAD_OBJ.BLOB_DATA");
        descriptor.addMapping(directMapping);
        // serialized blob
        directMapping = new DirectToFieldMapping();
        directMapping.setAttributeName("serializedBlob");
        directMapping.setFieldName("BIG_BAD_OBJ.SER_DATA");
        directMapping.setConverter(new SerializedObjectConverter());
        descriptor.addMapping(directMapping);
        // numbers
        directMapping = new DirectToFieldMapping();
        directMapping.setAttributeName("number01");
        directMapping.setFieldName("BIG_BAD_OBJ.NUM_DATA01");
        descriptor.addMapping(directMapping);
        directMapping = new DirectToFieldMapping();
        directMapping.setAttributeName("number02");
        directMapping.setFieldName("BIG_BAD_OBJ.NUM_DATA02");
        descriptor.addMapping(directMapping);

        // aggregates
        for (int index = 0; index < 3; index++) {
            AggregateObjectMapping aggMapping = new AggregateObjectMapping();
            aggMapping.setReferenceClass(BigBadAggregate.class);
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            aggMapping.setAttributeName("agg" + indexString);
            aggMapping.addFieldNameTranslation("BIG_BAD_OBJ.AGG_STRING" + indexString, "string");
            aggMapping.addFieldNameTranslation("BIG_BAD_OBJ.AGG_NUM" + indexString, "number");
            descriptor.addMapping(aggMapping);
        }
        // 1-1
        for (int index = 0; index < 3; index++) {
            OneToOneMapping oneToOneMapping = new OneToOneMapping();
            oneToOneMapping.setReferenceClass(BigBadReferenceData.class);
            String indexString = String.valueOf(index + 1);
            if (indexString.length() == 1) {
                indexString = "0" + indexString;
            }
            oneToOneMapping.setAttributeName("ref" + indexString);
            oneToOneMapping.addForeignKeyFieldName("BIG_BAD_OBJ.REF_FK" + indexString, "BIG_BAD_DATA.ID");
            descriptor.addMapping(oneToOneMapping);
        }

        return descriptor;
    }

    public RelationalDescriptor buildBigBadReferenceDataDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();
        descriptor.setJavaClass(org.eclipse.persistence.testing.models.bigbad.BigBadReferenceData.class);
        descriptor.addTableName("BIG_BAD_DATA");
        descriptor.addPrimaryKeyFieldName("BIG_BAD_DATA.ID");

        // Mappings.
        DirectToFieldMapping idMapping = new DirectToFieldMapping();
        idMapping.setAttributeName("id");
        idMapping.setFieldName("BIG_BAD_DATA.ID");
        descriptor.addMapping(idMapping);

        DirectToFieldMapping dataMapping = new DirectToFieldMapping();
        dataMapping.setAttributeName("data");
        dataMapping.setFieldName("BIG_BAD_DATA.DATA");
        descriptor.addMapping(dataMapping);

        return descriptor;
    }

    public RelationalDescriptor buildBigBadAggregateDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();
        descriptor.descriptorIsAggregate();
        descriptor.setJavaClass(org.eclipse.persistence.testing.models.bigbad.BigBadAggregate.class);

        // Mappings.
        DirectToFieldMapping idMapping = new DirectToFieldMapping();
        idMapping.setAttributeName("number");
        idMapping.setFieldName("number");
        descriptor.addMapping(idMapping);

        DirectToFieldMapping dataMapping = new DirectToFieldMapping();
        dataMapping.setAttributeName("string");
        dataMapping.setFieldName("string");
        descriptor.addMapping(dataMapping);

        return descriptor;
    }
}
