/*******************************************************************************
 * Copyright (c) 1998, 2015 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.jpa.xml.inheritance;

import java.util.ArrayList;
import javax.persistence.EntityListeners;

// These listeners are overridden in XML. BusListener2 callbacks should be
// called before BusListener callbacks. A BusListener3 has also been added
// and should be called after BusListener2 and before BusListener.
@EntityListeners({
    org.eclipse.persistence.testing.models.jpa.xml.inheritance.listeners.BusListener.class,
    org.eclipse.persistence.testing.models.jpa.xml.inheritance.listeners.BusListener2.class
})
public class Bus extends FueledVehicle {
    public int pre_persist_count = 0;
    public int post_persist_count = 0;
    public int pre_remove_count = 0;
    public int post_remove_count = 0;
    public int pre_update_count = 0;
    public int post_update_count = 0;
    public int post_load_count = 0;

    private Person busDriver;
    public ArrayList prePersistCalledListeners = new ArrayList();
    public ArrayList postPersistCalledListeners = new ArrayList();

    public void addPostPersistCalledListener(Class listener) {
        postPersistCalledListeners.add(listener);
    }

    public void addPrePersistCalledListener(Class listener) {
        prePersistCalledListeners.add(listener);
    }

    public Person getBusDriver() {
        return busDriver;
    }

    public int postPersistCalledListenerCount() {
        return postPersistCalledListeners.size();
    }

    public int prePersistCalledListenerCount() {
        return prePersistCalledListeners.size();
    }

    public Class getPostPersistCalledListenerAt(int index) {
        return (Class) postPersistCalledListeners.get(index);
    }

    public Class getPrePersistCalledListenerAt(int index) {
        return (Class) prePersistCalledListeners.get(index);
    }

    public void setBusDriver(Person busDriver) {
        this.busDriver = busDriver;
    }

    // CALLBACK METHODS //
    public void prePersist() {
        pre_persist_count++;
    }

    protected void postPersist() {
        post_persist_count++;
    }

    private void preRemove() {
        pre_remove_count++;
    }

    void postRemove() {
        post_remove_count++;
    }

    public void preUpdate() {
        pre_update_count++;
    }

    public void postUpdate() {
        post_update_count++;
    }

    public void postLoad() {
        post_load_count++;
    }
}
