/*
 * Copyright 2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */

/*
 * PCPerson.java
 *
 * Created on May 22, 2001, 9:34 AM
 */

package org.apache.jdo.pc.empdept;

import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Locale;

/**
 *
 * @author  clr
 * @version 
 */
public class PCPerson implements java.io.Serializable{

    public String firstname;
    
    public String lastname;
    
    public java.util.Date birthdate;
    
    protected static SimpleDateFormat formatter;

    static {
        formatter = new SimpleDateFormat("d/MMM/yyyy", Locale.US);
        formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    }
        
    /** Creates new PCPerson */
    
    public PCPerson() {
    }
    
    public PCPerson(String firstname, String lastname, java.util.Date birthdate) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.birthdate = birthdate;
    }
    
    public String getLastname() {
        return lastname;
    }
    
    public void setLastname(String lastname) {
        this. lastname = lastname;
    }
    
    public String getFirstname() {
        return firstname;
    }
    
    public void setFirstname(String firstname) {
        this. firstname = firstname;
    }
    
    public java.util.Date getBirthdate() {
        return birthdate;
    }
    
    public void setBirthdate(java.util.Date birthdate) {
        this. birthdate = birthdate;
    }
    

    public String toString() {
        StringBuffer rc = new StringBuffer("PCPerson: ");
        rc.append(getLastname());
        rc.append(", " + getFirstname());
//        rc.append(", id=" + empid);
        rc.append(", born " + formatter.format(getBirthdate()));
//        rc.append(", hired " + formatter.format(hiredate));
//        rc.append(" $" + salary);
//        String mgrName = "none";
//        if (null != manager) {
//            mgrName = manager.getLastname();
//        }
//        rc.append(" manager: " + mgrName);
//        rc.append(" dept: " + department.getName());
//        int numEmps = 0;
//        if (null != employees) {
//            numEmps = employees.size();
//        }
//        rc.append(" emps: " + numEmps);
//        rc.append(" insurance: " + insurance.getCarrier());
        return rc.toString();
    }
}
