/*******************************************************************************
 * Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.models.interfaces;

import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.indirection.*;

public class Employee implements ContactHolder, java.io.Serializable, Cloneable {
    public Number id;
    public String name;
    public Contact contact;
    public ValueHolderInterface secondaryContact = new ValueHolder();
    public Asset asset1;
    public Asset asset2;

    public static void addToDescriptor(ClassDescriptor des) {
        AggregateObjectMapping map = (AggregateObjectMapping)des.getMappingForAttributeName("asset2");
        map.addFieldNameTranslation("INT_EMP.ASSET2_TYPE", "INT_EMP.ASSET_TYPE");
    }
    
    /**
     * This method was written to do a shallow clone of the employee object
     */
    public Object clone() {
        Employee clone = new Employee();
        clone.id = this.id;
        clone.name = this.name;
        clone.contact = this.contact;
        clone.asset1 = (Asset)this.asset1.clone();
        clone.asset2 = (Asset)this.asset2.clone(); // added to test the V1-1 deep merge clone
        clone.secondaryContact = this.secondaryContact;
        return clone;
    }

    public static Employee example1() {
        Employee example = new Employee();
        example.setName("Betty");
        example.setContact(Phone.example1());
        example.getContact().setHolder(example);
        example.asset1 = new Asset();
        example.asset1.setAsset(Computer.example1());
        example.asset2 = new Asset();
        example.asset2.setAsset(Computer.example2());
        example.setSecondaryContact(Phone.example2());
        return example;
    }

    public static Employee example2() {
        Employee example = new Employee();
        example.setName("Chris");
        example.setContact(Phone.example1());
        example.getContact().setHolder(example);
        example.asset1 = new Asset();
        example.asset1.asset = Vehicle.example1();
        example.asset2 = new Asset();
        example.asset2.asset = Computer.example3();
        example.setSecondaryContact(Email.example3());

        return example;
    }

    public static Employee example3() {
        Employee example = new Employee();
        example.setName("Jude");
        example.setContact(Email.example2());
        example.getContact().setHolder(example);
        example.asset1 = new Asset();
        example.asset1.asset = Vehicle.example2();
        example.asset2 = new Asset();
        example.asset2.asset = Vehicle.example3();

        return example;
    }

    public static Employee example4() {
        Employee example = new Employee();
        example.setName("Brendan");
        example.setContact(null);
        example.asset1 = new Asset();
        example.asset1.asset = Vehicle.example2();
        example.asset2 = new Asset();
        example.asset2.asset = Vehicle.example3();

        return example;
    }

    public Contact getContact() {
        return contact;
    }

    public Number getId() {
        return this.id;
    }
    
    public String getName() {
        return this.name;
    }

    public Contact getSecondaryContact() {
        return (Contact)secondaryContact.getValue();
    }

    public void setContact(Contact contact) {
        this.contact = contact;
    }

    public void setId(Number id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSecondaryContact(Contact aContact) {
        secondaryContact.setValue(aContact);
    }

    public static TableDefinition tableDefinition() {
        TableDefinition table = new TableDefinition();

        table.setName("INT_EMP");
        table.addField("ID", java.math.BigDecimal.class, 15);
        table.addField("NAME", String.class, 30);
        table.addField("CON_ID", java.math.BigDecimal.class, 15);
        //table.addField("CONTACT_TYPE",String.class, 5);
        table.addField("CONTACT_TYPE", Float.class, 5); // TO TEST NUMERIC TYPE INDICATOR

        table.addField("ASSET_ID", java.math.BigDecimal.class, 15);
        table.addField("ASSET_TYPE", String.class, 5);
        table.addField("ASSET2_ID", java.math.BigDecimal.class, 15);
        table.addField("ASSET2_TYPE", String.class, 5);
        table.addField("SEC_CON_ID", java.math.BigDecimal.class, 15);
        //table.addField("SEC_CONTACT_TYPE",String.class, 5);
        table.addField("SEC_CONTACT_TYPE", Float.class, 5); // TO TEST NUMERIC TYPE INDICATOR

        return table;
    }

    public String toString() {
        return getName();
    }
}
