/*******************************************************************************
 * 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.tests.validation;

import java.sql.Time;

import java.util.Vector;


//Created by Ian Reid
//Date: Feb 6, 2k3
//used for testing (TL-ERROR 81) called from class org.eclipse.persistence.testing.tests.validation.ReturnTypeInGetAttributeAccessorTest

public class EmployeeWithProblems extends org.eclipse.persistence.testing.models.employee.domain.Employee {
    /** One-to-one mapping, employee references its address through a foreign key. */
    public
    //	public ValueHolderInterface addressWithProblems;//used to test TL-125
    org.eclipse.persistence.testing.models.employee.domain.Address addressWithProblems; //used to test TL-125  

    /** One-to-many mapping (same class relationship), inverse relationship to manager, uses manager foreign key in the target. */
    public String managedEmployeesWithProblems; //used to test TL-133

    /** One-to-one mapping (same class relationship), employee references its manager through a foreign key. */
    public EmployeeWithProblems managerWithProblems; //used to test TL-144

    /** Aggregate-collection mapping. */
    public Vector addressesWithProblems; //used to test TL-153 

    public String notMapped; //used to test TL-45

    private String illegalAccess; //used in tests which require an in-accessable attribute

    /* Varray Testing added
  */
    private Vector courses; //used to test TL-157

    public Vector getCourses() {
        return courses;
    }

    public void setCourses(Vector input) {
        courses = input;
    }

    public void addCourse(String input) {
        getCourses().add(new String(input));
    }

    public String getIllegalAccess() throws java.lang.IllegalAccessException {
        throw new java.lang.IllegalAccessException();
    }

    public void setIllegalAccess(String input) throws java.lang.IllegalAccessException {
        throw new java.lang.IllegalAccessException();
    }

    public EmployeeWithProblems() {
        super();
        // 	this.addressWithProblems = new org.eclipse.persistence.testing.models.employee.domain.Address();//new ValueHolder();//initilized to null to cause error
        //  	this.managedEmployeesWithProblems = new Vector();
        //    this.managerWithProblems = null;
        this.addressesWithProblems = new Vector();
        this.courses = new Vector();
    }
    //this method returns void (instead of Time[]) to produce the error (TL-ERROR 81)

    public void buildNormalHours2(org.eclipse.persistence.sessions.Record row, org.eclipse.persistence.sessions.Session session) { //used in test class org.eclipse.persistence.testing.tests.validation.ReturnTypeInGetAttributeAccessorTest
        Time[] hours = new Time[2];

        /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
        hours[0] = (Time)session.getPlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
        hours[1] = (Time)session.getPlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
        //	return hours;
    }

    /**
     * Notice that the usage of value holders does not effect the public interface or usage of the class.
     * The get/set methods must however be changed to wrap/unwrap the value holder.
     */
    public

    org.eclipse.persistence.testing.models.employee.domain.Address getAddressWithProblems() {
        return addressWithProblems; //.getValue();
    }

    /**
     * Notice that the usage of value holders does not effect the public interface or usage of the class.
     * The get/set methods must however be changed to wrap/unwrap the value holder.
     */
    public

    void setAddressWithProblems(org.eclipse.persistence.testing.models.employee.domain.Address address) {
        this.addressWithProblems = address; //.setValue(address);
    }

    public String getManagedEmployeesWithProblems() {
        return managedEmployeesWithProblems;
    }

    public void setManagedEmployeesWithProblems(String input) {
        managedEmployeesWithProblems = input;
    }

    public EmployeeWithProblems getManagerWithProblems() {
        return managerWithProblems;
    }

    public void setManagerWithProblems(EmployeeWithProblems input) {
        managerWithProblems = input;
    }


}
