blob: 84b2814dbce93d7dd9162b4436a6e1e97f998b78 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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:
// 05/16/2008-1.0M8 Guy Pelletier
// - 218084: Implement metadata merging functionality between mapping files
// 07/15/2010-2.2 Guy Pelletier
// -311395 : Multiple lifecycle callback methods for the same lifecycle event
package org.eclipse.persistence.internal.jpa.metadata.listeners;
import java.lang.reflect.Method;
import java.util.List;
import org.eclipse.persistence.descriptors.DescriptorEvent;
import org.eclipse.persistence.exceptions.ValidationException;
/**
* A callback listener for those entities that define callback methods.
* Callback methods on an entity must be signatureless, hence, this class
* overrides behavior from EntityListener.
*
* @author Guy Pelletier
* @since EclipseLink 1.0
*/
public class EntityClassListener<T> extends EntityListener<T> {
/**
* INTERNAL:
*/
public EntityClassListener(Class<?> entityClass) {
super(entityClass);
}
/**
* INTERNAL:
* For entity classes listener methods, they need to override listeners
* from mapped superclasses for the same method. So we need to override
* this method and make the override check instead of it throwing an
* exception for multiple lifecycle methods for the same event.
*/
@Override
public void addEventMethod(String event, Method method) {
if (! hasOverriddenEventMethod(method, event)) {
super.addEventMethod(event, method);
}
}
/**
* INTERNAL:
*/
@Override
public Class<?> getListenerClass() {
return getEntityClass();
}
/**
* INTERNAL:
*/
@Override
protected void invokeMethod(String event, DescriptorEvent descriptorEvent) {
// We must invoke callback methods in reverse order. They are added
// from the entity first followed by its mapped superclasses.
if (hasEventMethods(event)) {
List<Method> eventMethods = getEventMethods(event);
for (int i = eventMethods.size() - 1; i >= 0; i--) {
Method method = eventMethods.get(i);
Object[] objectList = {};
invokeMethod(method, descriptorEvent.getObject(), objectList);
}
}
}
/**
* INTERNAL:
*/
@Override
protected void validateMethod(Method method) {
if (method.getParameterTypes().length > 0) {
throw ValidationException.invalidEntityCallbackMethodArguments(getEntityClass(), method.getName());
} else {
// So far so good, now check the method modifiers.
validateMethodModifiers(method);
}
}
}