/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
****************************************************************/
package org.apache.cayenne.reflect;
import org.apache.cayenne.LifecycleListener;
import org.apache.cayenne.annotation.PostAdd;
import org.apache.cayenne.annotation.PostLoad;
import org.apache.cayenne.annotation.PostPersist;
import org.apache.cayenne.annotation.PostRemove;
import org.apache.cayenne.annotation.PostUpdate;
import org.apache.cayenne.annotation.PrePersist;
import org.apache.cayenne.annotation.PreRemove;
import org.apache.cayenne.annotation.PreUpdate;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.LifecycleEvent;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
/**
* @since 4.0
*/
public class LifecycleCallbackRegistryTest {
LifecycleCallbackRegistry registry;
@Before
public void createRegistry() {
EntityResolver entityResolver = mock(EntityResolver.class);
registry = new LifecycleCallbackRegistry(entityResolver);
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(0, registry.getHandler(event).defaultListenersSize());
assertEquals(0, registry.getHandler(event).listenersSize());
}
}
@Test
public void addDefaultListener() throws Exception {
LifecycleListener listener = mock(LifecycleListener.class);
registry.addDefaultListener(listener);
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(1, registry.getHandler(event).defaultListenersSize());
assertEquals(0, registry.getHandler(event).listenersSize());
}
}
@Test
public void addDefaultListenerSingleType() throws Exception {
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(0, registry.getHandler(event).defaultListenersSize());
LifecycleListener listener = mock(LifecycleListener.class);
registry.addDefaultListener(event, listener, nameToCamelCase(event.name()));
assertEquals(1, registry.getHandler(event).defaultListenersSize());
assertEquals(0, registry.getHandler(event).listenersSize());
}
}
@Test
public void addListenerWithEntityClass() throws Exception {
LifecycleListener listener = mock(LifecycleListener.class);
registry.addListener(Object.class, listener);
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(1, registry.getHandler(event).listenersSize());
assertEquals(0, registry.getHandler(event).defaultListenersSize());
}
}
@Test
public void addListenerWithEntityClassSingleType() throws Exception {
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(0, registry.getHandler(event).listenersSize());
LifecycleListener listener = mock(LifecycleListener.class);
registry.addListener(event, Object.class, listener, nameToCamelCase(event.name()));
assertEquals(1, registry.getHandler(event).listenersSize());
assertEquals(0, registry.getHandler(event).defaultListenersSize());
}
}
@Test
public void addAnnotatedListener() {
registry.addListener(new AnnotatedListener());
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(1, registry.getHandler(event).defaultListenersSize());
assertEquals(0, registry.getHandler(event).listenersSize());
}
}
@Test
public void addAnnotatedListenerWithEntityClass() {
registry.addListener(new AnnotatedListenerWithEntity());
for(LifecycleEvent event : LifecycleEvent.values()) {
assertEquals(0, registry.getHandler(event).defaultListenersSize());
assertEquals(1, registry.getHandler(event).listenersSize());
}
}
private static class AnnotatedListener {
@PostAdd
public void postAdd(Object object) {}
@PostLoad
public void postLoad(Object object) {}
@PostPersist
public void postPersist(Object object) {}
@PostRemove
public void postRemove(Object object) {}
@PostUpdate
public void postUpdate(Object object) {}
@PrePersist
public void prePersist(Object object) {}
@PreRemove
public void preRemove(Object object) {}
@PreUpdate
public void preUpdate(Object object) {}
}
private static class AnnotatedListenerWithEntity {
@PostAdd(Object.class)
public void postAdd(Object object) {}
@PostLoad(Object.class)
public void postLoad(Object object) {}
@PostPersist(Object.class)
public void postPersist(Object object) {}
@PostRemove(Object.class)
public void postRemove(Object object) {}
@PostUpdate(Object.class)
public void postUpdate(Object object) {}
@PrePersist(Object.class)
public void prePersist(Object object) {}
@PreRemove(Object.class)
public void preRemove(Object object) {}
@PreUpdate(Object.class)
public void preUpdate(Object object) {}
}
private static String nameToCamelCase(String functionName) {
String[] parts = functionName.split("_");
StringBuilder sb = new StringBuilder();
boolean first = true;
for(String part : parts) {
if(first) {
sb.append(part.toLowerCase());
first = false;
} else {
char[] chars = part.toLowerCase().toCharArray();
chars[0] = Character.toTitleCase(chars[0]);
sb.append(chars);
}
}
return sb.toString();
}
}