/*
 * 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.framework;

import java.util.*;

import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.sequencing.NativeSequence;

/**
 * TopLink project for storing test results.
 */
public class LoadBuildProject extends org.eclipse.persistence.sessions.Project {

    // DB connection properties
    public final static String PROP_PERFDB_USER = "eclipselink.perfdb.user";
    public final static String PROP_PERFDB_PWD = "eclipselink.perfdb.pwd";
    public final static String PROP_PERFDB_DRIVER = "eclipselink.perfdb.driver";
    public final static String PROP_PERFDB_URI = "eclipselink.perfdb.uri";
    public final static String PROP_PERFDB_PLATFORM = "eclipselink.perfdb.platform";

    // DB connection defaults
    public final static String DFLT_PERFDB_USER = "root";
    public final static String DFLT_PERFDB_PWD = "password";
    public final static String DFLT_PERFDB_DRIVER = "com.mysql.jdbc.Driver";
    public final static String DFLT_PERFDB_URI = "jdbc:mysql://localhost:3306/perfdb";
    public final static String DFLT_PERFDB_PLATFORM = "org.eclipse.persistence.platform.database.MySQLPlatform";

    public LoadBuildProject() {
        applyPROJECT();
        applyLOGIN();
        buildLoadBuildSummaryDescriptor();
        buildTestResultDescriptor();
        buildTestResultsSummaryDescriptor();
    }

    protected void applyLOGIN() {
        org.eclipse.persistence.sessions.DatabaseLogin login = new org.eclipse.persistence.sessions.DatabaseLogin();

        login.setUserName(System.getProperty(PROP_PERFDB_USER, DFLT_PERFDB_USER));
        login.setPassword(System.getProperty(PROP_PERFDB_PWD, DFLT_PERFDB_PWD));
        login.setDriverClassName(System.getProperty(PROP_PERFDB_DRIVER, DFLT_PERFDB_DRIVER));
        login.setConnectionString(System.getProperty(PROP_PERFDB_URI, DFLT_PERFDB_URI));
        login.setPlatformClassName(System.getProperty(PROP_PERFDB_PLATFORM, DFLT_PERFDB_PLATFORM));

        NativeSequence sequence = new NativeSequence();
        sequence.setPreallocationSize(500);
        login.setDefaultSequence(sequence);
        setLogin(login);
    }

    protected void applyPROJECT() {
        setName("LoadBuild");
    }

    protected void buildLoadBuildSummaryDescriptor() {
        org.eclipse.persistence.descriptors.RelationalDescriptor descriptor = new org.eclipse.persistence.descriptors.RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(org.eclipse.persistence.testing.framework.LoadBuildSummary.class);
        Vector vector = new Vector();
        vector.addElement("LOADBUILD");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("LOADBUILD.id");
        //descriptor.addPrimaryKeyFieldName("LOADBUILD.lbtimestamp");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("RESULTSUM_SEQ");
        descriptor.setSequenceNumberFieldName("id");

        DirectToFieldMapping idMapping = new DirectToFieldMapping();
        idMapping.setAttributeName("id");
        idMapping.setFieldName("LOADBUILD.id");
        descriptor.addMapping(idMapping);

        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("errors");
        directtofieldmapping.setFieldName("LOADBUILD.lberrors");
        descriptor.addMapping(directtofieldmapping);

        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("fatalErrors");
        directtofieldmapping1.setFieldName("LOADBUILD.fatalErrors");
        descriptor.addMapping(directtofieldmapping1);

        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("loginChoice");
        directtofieldmapping2.setFieldName("LOADBUILD.loginChoice");
        descriptor.addMapping(directtofieldmapping2);

        DirectToFieldMapping os = new DirectToFieldMapping();
        os.setAttributeName("os");
        os.setFieldName("LOADBUILD.os");
        descriptor.addMapping(os);

        DirectToFieldMapping jvm = new DirectToFieldMapping();
        jvm.setAttributeName("jvm");
        jvm.setFieldName("LOADBUILD.jvm");
        descriptor.addMapping(jvm);

        DirectToFieldMapping toplinkVersion = new DirectToFieldMapping();
        toplinkVersion.setAttributeName("toplinkVersion");
        toplinkVersion.setFieldName("LOADBUILD.toplink_version");
        descriptor.addMapping(toplinkVersion);

        DirectToFieldMapping machine = new DirectToFieldMapping();
        machine.setAttributeName("machine");
        machine.setFieldName("LOADBUILD.machine");
        descriptor.addMapping(machine);

        DirectToFieldMapping directtofieldmapping3 = new DirectToFieldMapping();
        directtofieldmapping3.setAttributeName("numberOfTests");
        directtofieldmapping3.setFieldName("LOADBUILD.numberOfTests");
        descriptor.addMapping(directtofieldmapping3);

        DirectToFieldMapping directtofieldmapping4 = new DirectToFieldMapping();
        directtofieldmapping4.setAttributeName("timestamp");
        directtofieldmapping4.setFieldName("LOADBUILD.lbtimestamp");
        descriptor.addMapping(directtofieldmapping4);

        DirectToFieldMapping directtofieldmapping5 = new DirectToFieldMapping();
        directtofieldmapping5.setAttributeName("userName");
        directtofieldmapping5.setFieldName("LOADBUILD.lbuserName");
        descriptor.addMapping(directtofieldmapping5);

        org.eclipse.persistence.mappings.OneToManyMapping onetomanymapping = new org.eclipse.persistence.mappings.OneToManyMapping();
        onetomanymapping.setAttributeName("results");
        onetomanymapping.setGetMethodName("getResultsHolder");
        onetomanymapping.setSetMethodName("setResultsHolder");
        onetomanymapping.setReferenceClass(org.eclipse.persistence.testing.framework.TestResult.class);
        onetomanymapping.setIsPrivateOwned(true);
        //onetomanymapping.addTargetForeignKeyFieldName("RESULT.lbuildTimestamp", "LOADBUILD.lbtimestamp");
        onetomanymapping.addTargetForeignKeyFieldName("RESULT.lbuildId", "LOADBUILD.id");
        descriptor.addMapping(onetomanymapping);

        org.eclipse.persistence.mappings.OneToManyMapping onetomanymapping1 = new org.eclipse.persistence.mappings.OneToManyMapping();
        onetomanymapping1.setAttributeName("summaries");
        onetomanymapping1.setGetMethodName("getSummariesHolder");
        onetomanymapping1.setSetMethodName("setSummariesHolder");
        onetomanymapping1.setReferenceClass(org.eclipse.persistence.testing.framework.TestResultsSummary.class);
        onetomanymapping1.setIsPrivateOwned(true);
        //onetomanymapping1.addTargetForeignKeyFieldName("SUMMARY.lbuildTimestamp", "LOADBUILD.lbtimestamp");
        onetomanymapping1.addTargetForeignKeyFieldName("SUMMARY.lbuildId", "LOADBUILD.id");
        descriptor.addMapping(onetomanymapping1);

        addDescriptor(descriptor);
    }

    protected void buildTestResultDescriptor() {
        org.eclipse.persistence.descriptors.RelationalDescriptor descriptor = new org.eclipse.persistence.descriptors.RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(org.eclipse.persistence.testing.framework.TestResult.class);
        Vector vector = new Vector();
        vector.addElement("RESULT");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("RESULT.id");

        // SECTION: PROPERTIES
        //descriptor.setSequenceNumberName("RESULT_SEQ");
        //descriptor.setSequenceNumberFieldName("id");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("description");
        directtofieldmapping.setGetMethodName("getDescription");
        directtofieldmapping.setSetMethodName("setDescription");
        directtofieldmapping.setFieldName("RESULT.description");
        descriptor.addMapping(directtofieldmapping);

        DirectToFieldMapping testTimemapping = new DirectToFieldMapping();
        testTimemapping.setAttributeName("testTime");
        testTimemapping.setFieldName("RESULT.test_time");
        descriptor.addMapping(testTimemapping);

        DirectToFieldMapping totalTimemapping = new DirectToFieldMapping();
        totalTimemapping.setAttributeName("totalTime");
        totalTimemapping.setFieldName("RESULT.total_time");
        descriptor.addMapping(totalTimemapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("exception");
        directtofieldmapping1.setGetMethodName("getExceptionStackTraceForDatabase");
        directtofieldmapping1.setSetMethodName("setExceptionStackTrace");
        directtofieldmapping1.setFieldName("RESULT.exception");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("id");
        directtofieldmapping2.setGetMethodName("getId");
        directtofieldmapping2.setSetMethodName("setId");
        directtofieldmapping2.setFieldName("RESULT.id");
        descriptor.addMapping(directtofieldmapping2);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping3 = new DirectToFieldMapping();
        directtofieldmapping3.setAttributeName("name");
        directtofieldmapping3.setGetMethodName("getName");
        directtofieldmapping3.setSetMethodName("setName");
        directtofieldmapping3.setFieldName("RESULT.name");
        descriptor.addMapping(directtofieldmapping3);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping4 = new DirectToFieldMapping();
        directtofieldmapping4.setAttributeName("outcome");
        directtofieldmapping4.setGetMethodName("getOutcome");
        directtofieldmapping4.setSetMethodName("setOutcome");
        directtofieldmapping4.setFieldName("RESULT.outcome");
        descriptor.addMapping(directtofieldmapping4);

        // SECTION: ONETOONEMAPPING
        org.eclipse.persistence.mappings.OneToOneMapping onetoonemapping = new org.eclipse.persistence.mappings.OneToOneMapping();
        onetoonemapping.setAttributeName("loadBuildSummary");
        onetoonemapping.setGetMethodName("getLoadBuildSummaryHolder");
        onetoonemapping.setSetMethodName("setLoadBuildSummaryHolder");
        onetoonemapping.setReferenceClass(org.eclipse.persistence.testing.framework.LoadBuildSummary.class);
        //onetoonemapping.addForeignKeyFieldName("RESULT.lbuildTimestamp", "LOADBUILD.lbtimestamp");
        onetoonemapping.addForeignKeyFieldName("RESULT.lbuildId", "LOADBUILD.id");
        descriptor.addMapping(onetoonemapping);

        // SECTION: ONETOONEMAPPING
        org.eclipse.persistence.mappings.OneToOneMapping onetoonemapping1 = new org.eclipse.persistence.mappings.OneToOneMapping();
        onetoonemapping1.setAttributeName("summary");
        onetoonemapping1.setGetMethodName("getSummaryHolder");
        onetoonemapping1.setSetMethodName("setSummaryHolder");
        onetoonemapping1.setReferenceClass(org.eclipse.persistence.testing.framework.TestResultsSummary.class);
        onetoonemapping1.addForeignKeyFieldName("RESULT.summaryId", "SUMMARY.id");
        descriptor.addMapping(onetoonemapping1);
        addDescriptor(descriptor);
    }

    protected void buildTestResultsSummaryDescriptor() {
        org.eclipse.persistence.descriptors.RelationalDescriptor descriptor = new org.eclipse.persistence.descriptors.RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(org.eclipse.persistence.testing.framework.TestResultsSummary.class);
        Vector vector = new Vector();
        vector.addElement("SUMMARY");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("SUMMARY.id");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("RESULTSUM_SEQ");
        descriptor.setSequenceNumberFieldName("id");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("description");
        directtofieldmapping.setGetMethodName("getDescription");
        directtofieldmapping.setSetMethodName("setDescription");
        directtofieldmapping.setFieldName("SUMMARY.description");
        descriptor.addMapping(directtofieldmapping);

        DirectToFieldMapping testTimeMapping = new DirectToFieldMapping();
        testTimeMapping.setAttributeName("totalTime");
        testTimeMapping.setFieldName("SUMMARY.total_time");
        descriptor.addMapping(testTimeMapping);

        DirectToFieldMapping setupFailuresMapping = new DirectToFieldMapping();
        setupFailuresMapping.setAttributeName("setupFailures");
        setupFailuresMapping.setFieldName("SUMMARY.setup_failures");
        descriptor.addMapping(setupFailuresMapping);

        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("errors");
        directtofieldmapping1.setGetMethodName("getErrors");
        directtofieldmapping1.setSetMethodName("setErrors");
        directtofieldmapping1.setFieldName("SUMMARY.errors");
        descriptor.addMapping(directtofieldmapping1);

        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("fatalErrors");
        directtofieldmapping2.setGetMethodName("getFatalErrors");
        directtofieldmapping2.setSetMethodName("setFatalErrors");
        directtofieldmapping2.setFieldName("SUMMARY.fatalErrors");
        descriptor.addMapping(directtofieldmapping2);

        DirectToFieldMapping directtofieldmapping3 = new DirectToFieldMapping();
        directtofieldmapping3.setAttributeName("id");
        directtofieldmapping3.setGetMethodName("getId");
        directtofieldmapping3.setSetMethodName("setId");
        directtofieldmapping3.setFieldName("SUMMARY.id");
        descriptor.addMapping(directtofieldmapping3);

        DirectToFieldMapping directtofieldmapping4 = new DirectToFieldMapping();
        directtofieldmapping4.setAttributeName("name");
        directtofieldmapping4.setGetMethodName("getName");
        directtofieldmapping4.setSetMethodName("setName");
        directtofieldmapping4.setFieldName("SUMMARY.name");
        descriptor.addMapping(directtofieldmapping4);

        DirectToFieldMapping directtofieldmapping5 = new DirectToFieldMapping();
        directtofieldmapping5.setAttributeName("passed");
        directtofieldmapping5.setGetMethodName("getPassed");
        directtofieldmapping5.setSetMethodName("setPassed");
        directtofieldmapping5.setFieldName("SUMMARY.passed");
        descriptor.addMapping(directtofieldmapping5);

        DirectToFieldMapping directtofieldmapping6 = new DirectToFieldMapping();
        directtofieldmapping6.setAttributeName("problems");
        directtofieldmapping6.setGetMethodName("getProblems");
        directtofieldmapping6.setSetMethodName("setProblems");
        directtofieldmapping6.setFieldName("SUMMARY.problems");
        descriptor.addMapping(directtofieldmapping6);

        DirectToFieldMapping directtofieldmapping7 = new DirectToFieldMapping();
        directtofieldmapping7.setAttributeName("setupException");
        directtofieldmapping7.setGetMethodName("getSetupExceptionStackTrace");
        directtofieldmapping7.setSetMethodName("setSetupExceptionStackTrace");
        directtofieldmapping7.setFieldName("SUMMARY.setupException");
        descriptor.addMapping(directtofieldmapping7);

        DirectToFieldMapping directtofieldmapping8 = new DirectToFieldMapping();
        directtofieldmapping8.setAttributeName("totalTests");
        directtofieldmapping8.setGetMethodName("getTotalTests");
        directtofieldmapping8.setSetMethodName("setTotalTests");
        directtofieldmapping8.setFieldName("SUMMARY.totalTests");
        descriptor.addMapping(directtofieldmapping8);

        DirectToFieldMapping directtofieldmapping9 = new DirectToFieldMapping();
        directtofieldmapping9.setAttributeName("warnings");
        directtofieldmapping9.setGetMethodName("getWarnings");
        directtofieldmapping9.setSetMethodName("setWarnings");
        directtofieldmapping9.setFieldName("SUMMARY.warnings");
        descriptor.addMapping(directtofieldmapping9);

        org.eclipse.persistence.mappings.OneToManyMapping onetomanymapping = new org.eclipse.persistence.mappings.OneToManyMapping();
        onetomanymapping.setAttributeName("results");
        onetomanymapping.setGetMethodName("getResultsHolder");
        onetomanymapping.setSetMethodName("setResultsHolder");
        onetomanymapping.setReferenceClass(org.eclipse.persistence.testing.framework.TestResult.class);
        onetomanymapping.setIsPrivateOwned(true);
        onetomanymapping.addTargetForeignKeyFieldName("RESULT.summaryId", "SUMMARY.id");
        descriptor.addMapping(onetomanymapping);

        org.eclipse.persistence.mappings.OneToOneMapping onetoonemapping = new org.eclipse.persistence.mappings.OneToOneMapping();
        onetoonemapping.setAttributeName("loadBuildSummary");
        onetoonemapping.setGetMethodName("getLoadBuildSummaryHolder");
        onetoonemapping.setSetMethodName("setLoadBuildSummaryHolder");
        onetoonemapping.setReferenceClass(org.eclipse.persistence.testing.framework.LoadBuildSummary.class);
        //onetoonemapping.addForeignKeyFieldName("SUMMARY.lbuildTimestamp", "LOADBUILD.lbtimestamp");
        onetoonemapping.addForeignKeyFieldName("SUMMARY.lbuildId", "LOADBUILD.id");
        descriptor.addMapping(onetoonemapping);

        org.eclipse.persistence.mappings.OneToOneMapping onetoonemapping1 = new org.eclipse.persistence.mappings.OneToOneMapping();
        onetoonemapping1.setAttributeName("parent");
        onetoonemapping1.setGetMethodName("getParentHolder");
        onetoonemapping1.setSetMethodName("setParentHolder");
        onetoonemapping1.setReferenceClass(org.eclipse.persistence.testing.framework.TestResultsSummary.class);
        onetoonemapping1.addForeignKeyFieldName("SUMMARY.parentId", "SUMMARY.id");
        descriptor.addMapping(onetoonemapping1);
        addDescriptor(descriptor);
    }
}
