/*
 * 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.tests.queries;

import org.eclipse.persistence.tools.schemaframework.*;

public class Account {
    public String accountNumber;
    public org.eclipse.persistence.indirection.ValueHolderInterface state = new org.eclipse.persistence.indirection.ValueHolder();
    public org.eclipse.persistence.indirection.ValueHolderInterface billingCountry = new org.eclipse.persistence.indirection.ValueHolder();

    /**
     * This method was created in VisualAge.
     */
    public Account() {
    }

    /**
     * TopLink generated method.
     * <b>WARNING</b>: This code was generated by an automated tool.
     * Any changes will be lost when the code is re-generated
     */
    public static TableDefinition buildACCOUNTTable() {
        org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();

        // SECTION: TABLE
        tabledefinition.setName("ACCOUNT");

        // SECTION: FIELD
        org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
        field.setName("ACCOUNT_NUMBER");
        field.setTypeName("VARCHAR");
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        tabledefinition.addField(field);

        // SECTION: FIELD
        org.eclipse.persistence.tools.schemaframework.FieldDefinition field1 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
        field1.setName("BILLING_COUNTRY");
        field1.setTypeName("VARCHAR");
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        tabledefinition.addField(field1);

        // SECTION: FIELD
        org.eclipse.persistence.tools.schemaframework.FieldDefinition field2 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
        field2.setName("STATE_NAME");
        field2.setTypeName("VARCHAR");
        field2.setShouldAllowNull(true);
        field2.setIsPrimaryKey(false);
        field2.setUnique(false);
        field2.setIsIdentity(false);
        tabledefinition.addField(field2);

        // SECTION: FIELD
        org.eclipse.persistence.tools.schemaframework.FieldDefinition field3 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
        field3.setName("STATE_COUNTRY");
        field3.setTypeName("VARCHAR");
        field3.setShouldAllowNull(true);
        field3.setIsPrimaryKey(false);
        field3.setUnique(false);
        field3.setIsIdentity(false);
        tabledefinition.addField(field3);

        return tabledefinition;
    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example1() {
        Account account1 = new Account();
        account1.accountNumber = "12345";
        account1.setBillingCountry(Country.greece);
        account1.setState(State.alberta);

        return account1;

    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example2() {
        Account account2 = new Account();
        account2.accountNumber = "ABDCE";
        account2.setBillingCountry(Country.usa);
        account2.setState(State.athens);

        return account2;

    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example3() {
        Account account3 = new Account();
        account3.accountNumber = "123AB";
        account3.setBillingCountry(Country.canada);
        account3.setState(State.alabama);

        return account3;

    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example4() {
        Account account4 = new Account();
        account4.accountNumber = "54321";
        account4.setBillingCountry(Country.greece);
        account4.setState(State.alberta);

        return account4;

    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example5() {
        Account account5 = new Account();
        account5.accountNumber = "EDCEA";
        account5.setBillingCountry(Country.usa);
        account5.setState(State.alabama);

        return account5;

    }

    /**
     * This method was created in VisualAge.
     */
    public static Account example6() {
        Account account6 = new Account();
        account6.accountNumber = "36H72";
        account6.setBillingCountry(Country.canada);
        account6.setState(State.athens);

        return account6;

    }

    public Country getBillingCountry() {
        return (Country)billingCountry.getValue();
    }

    public State getState() {
        return (State)state.getValue();
    }

    public void setAccountNumber(String value) {
        accountNumber = value;
    }

    public void setAccountNumber(State value) {
        state.setValue(value);
    }

    public void setBillingCountry(Country value) {
        billingCountry.setValue(value);
    }

    public void setState(State value) {
        state.setValue(value);
    }
}
