Skip to content

Commit

Permalink
Refactor MapListenerTest
Browse files Browse the repository at this point in the history
- Refactor out inner classes
- Add logging to events
  • Loading branch information
ghillert committed Oct 28, 2022
1 parent 37f2b9c commit 40c8d57
Show file tree
Hide file tree
Showing 6 changed files with 221 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,22 @@
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event;
package com.oracle.coherence.spring.event.mapevent;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.LocalDate;
import java.util.List;

import javax.inject.Inject;

import com.oracle.bedrock.testsupport.deferred.Eventually;
import com.oracle.coherence.spring.annotation.MapEventTransformerBinding;
import com.oracle.coherence.spring.annotation.MapEventTransformerFactory;
import com.oracle.coherence.spring.annotation.Name;
import com.oracle.coherence.spring.configuration.annotation.EnableCoherence;
import com.oracle.coherence.spring.configuration.session.SessionConfigurationBean;
import com.oracle.coherence.spring.configuration.session.SessionType;
import com.oracle.coherence.spring.event.EventsHelper;
import com.tangosol.net.NamedCache;
import com.tangosol.net.Session;
import com.tangosol.util.InvocableMap;
import com.tangosol.util.MapEvent;
import com.tangosol.util.MapEventTransformer;
import data.Person;
import data.PhoneNumber;
import org.apache.commons.logging.Log;
Expand Down Expand Up @@ -80,8 +73,8 @@ void testMapEvents() {
people.put("lisa", new Person("Lisa", "Simpson", LocalDate.now(), new PhoneNumber(1, "555-123-9999")));
people.put("maggie", new Person("Maggie", "Simpson", LocalDate.now(), new PhoneNumber(1, "555-123-9999")));

people.invoke("homer", new Uppercase());
people.invoke("bart", new Uppercase());
people.invoke("homer", new UppercaseEntryProcessor());
people.invoke("bart", new UppercaseEntryProcessor());

people.remove("bart");
people.remove("marge");
Expand Down Expand Up @@ -124,57 +117,6 @@ void testMapEvents() {
assertThat(transformedEvents.get(4).getNewValue(), is("MAGGIE"));
}

// ---- helper classes --------------------------------------------------

public static class Uppercase
implements InvocableMap.EntryProcessor<String, Person, Object> {
@Override
public Object process(InvocableMap.Entry<String, Person> entry) {
Person p = entry.getValue();
p.setLastName(p.getLastName().toUpperCase());
entry.setValue(p);
return null;
}
}

@Inherited
@MapEventTransformerBinding
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface UppercaseName {
}


@UppercaseName
public static class UppercaseTransformerFactory implements MapEventTransformerFactory<UppercaseName, String, Person, String> {
@Override
public MapEventTransformer<String, Person, String> create(UppercaseName annotation) {
return new UppercaseNameTransformer();
}
}

/**
* A custom implementation of a {@link MapEventTransformer}.
*/
static class UppercaseNameTransformer implements MapEventTransformer<String, Person, String> {

@Override
@SuppressWarnings("unchecked")
public MapEvent<String, String> transform(MapEvent<String, Person> event) {
String sOldName = transform(event.getOldValue());
String sNewName = transform(event.getNewValue());
return new MapEvent<String, String>(event.getMap(), event.getId(), event.getKey(), sOldName, sNewName);
}

String transform(Person person) {
if (person == null) {
return null;
}
String name = person.getFirstName();
return (name != null) ? name.toUpperCase() : null;
}
}

@Configuration
@EnableCoherence
static class Config {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event.mapevent;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import com.oracle.coherence.common.collections.ConcurrentHashMap;
import com.oracle.coherence.spring.annotation.PropertyExtractor;
import com.oracle.coherence.spring.annotation.WhereFilter;
import com.oracle.coherence.spring.annotation.event.CacheName;
import com.oracle.coherence.spring.annotation.event.Deleted;
import com.oracle.coherence.spring.annotation.event.Inserted;
import com.oracle.coherence.spring.annotation.event.MapName;
import com.oracle.coherence.spring.annotation.event.ScopeName;
import com.oracle.coherence.spring.annotation.event.ServiceName;
import com.oracle.coherence.spring.annotation.event.Synchronous;
import com.oracle.coherence.spring.annotation.event.Updated;
import com.oracle.coherence.spring.event.CoherenceEventListener;
import com.tangosol.util.MapEvent;
import data.Person;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

/**
* @author Gunnar Hillert
*/
public class TestListener {

private static final Log logger = LogFactory.getLog(TestListener.class);

private final Map<Integer, Integer> events = new ConcurrentHashMap<>();

private final List<MapEvent<String, Person>> filteredEvents = Collections.synchronizedList(new ArrayList<>());

private final List<MapEvent<String, String>> transformedEvents = Collections.synchronizedList(new ArrayList<>());

private final List<MapEvent<String, String>> transformedWithExtractorEvents = Collections.synchronizedList(new ArrayList<>());

Integer getEvents(int id) {
return this.events.get(id);
}

public List<MapEvent<String, Person>> getFilteredEvents() {
return this.filteredEvents;
}

public List<MapEvent<String, String>> getTransformedEvents() {
return this.transformedEvents;
}

public List<MapEvent<String, String>> getTransformedWithExtractorEvents() {
return this.transformedWithExtractorEvents;
}

@Synchronous
@WhereFilter("firstName = 'Bart' and lastName = 'Simpson'")
@CoherenceEventListener
void onHomer(@CacheName("people") MapEvent<String, Person> event) {
this.filteredEvents.add(event);
}

@Synchronous
@CoherenceEventListener
void onPersonDeleted(@Deleted @CacheName("people") MapEvent<String, Person> event) {
logger.info("onPersonDeleted: " + event.getKey());
record(event);
}

@Synchronous
@CoherenceEventListener
void onPersonInserted(@Inserted @ScopeName("Test") @MapName("people") MapEvent<String, Person> event) {
logger.info("onPersonInserted: " + event.getKey());
record(event);
assertThat(event.getNewValue().getLastName(), is("Simpson"));
}

@Synchronous
@PropertyExtractor("firstName")
@CoherenceEventListener
void onPersonInsertedTransformedWithExtractor(@Inserted @MapName("people") MapEvent<String, String> event) {
this.transformedWithExtractorEvents.add(event);
}

@Synchronous
@UppercaseName
@CoherenceEventListener
void onPersonInsertedTransformed(@Inserted @MapName("people") MapEvent<String, String> event) {
this.transformedEvents.add(event);
}

@Synchronous
@CoherenceEventListener
void onPersonUpdated(@Updated @ServiceName("StorageService") @MapName("people") MapEvent<String, Person> event) {
logger.info("onPersonUpdated: " + event.getKey());
record(event);
assertThat(event.getOldValue().getLastName(), is("Simpson"));
assertThat(event.getNewValue().getLastName(), is("SIMPSON"));
}

private void record(MapEvent<String, Person> event) {
this.events.compute(event.getId(), (k, v) -> (v != null) ? v + 1 : 1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event.mapevent;

import com.tangosol.util.InvocableMap;
import data.Person;

/**
* @author Gunnar Hillert
*/
public class UppercaseEntryProcessor
implements InvocableMap.EntryProcessor<String, Person, Object> {
@Override
public Object process(InvocableMap.Entry<String, Person> entry) {
Person p = entry.getValue();
p.setLastName(p.getLastName().toUpperCase());
entry.setValue(p);
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event.mapevent;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import com.oracle.coherence.spring.annotation.MapEventTransformerBinding;

/**
* @author Gunnar Hillert
*/
@Inherited
@MapEventTransformerBinding
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface UppercaseName {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event.mapevent;

import com.tangosol.util.MapEvent;
import com.tangosol.util.MapEventTransformer;
import data.Person;

/**
* A custom implementation of a {@link MapEventTransformer}.
* @author Gunnar Hillert
*/
class UppercaseNameTransformer implements MapEventTransformer<String, Person, String> {

@Override
@SuppressWarnings("unchecked")
public MapEvent<String, String> transform(MapEvent<String, Person> event) {
String sOldName = transform(event.getOldValue());
String sNewName = transform(event.getNewValue());
return new MapEvent<String, String>(event.getMap(), event.getId(), event.getKey(), sOldName, sNewName);
}

String transform(Person person) {
if (person == null) {
return null;
}
String name = person.getFirstName();
return (name != null) ? name.toUpperCase() : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl.
*/
package com.oracle.coherence.spring.event.mapevent;

import com.oracle.coherence.spring.annotation.MapEventTransformerFactory;
import com.tangosol.util.MapEventTransformer;
import data.Person;

/**
* @author Gunnar Hillert
*/
@UppercaseName
public class UppercaseTransformerFactory implements MapEventTransformerFactory<UppercaseName, String, Person, String> {
@Override
public MapEventTransformer<String, Person, String> create(UppercaseName annotation) {
return new UppercaseNameTransformer();
}
}

0 comments on commit 40c8d57

Please sign in to comment.