Skip to content

Commit

Permalink
HSEARCH-4132 Map OutboxEvent as entity
Browse files Browse the repository at this point in the history
  • Loading branch information
fax4ever authored and yrodiere committed Mar 8, 2021
1 parent 05d6128 commit eab1ec6
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 64 deletions.
Expand Up @@ -7,15 +7,9 @@
package org.hibernate.search.integrationtest.mapper.orm.outbox;

import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ENTITY_ID_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ENTITY_NAME_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.EVENT_TYPE_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.OUTBOX_ENTITY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ROUTE_PROPERTY_NAME;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.persistence.Entity;
import javax.persistence.Id;
Expand Down Expand Up @@ -106,7 +100,7 @@ public void insertUpdateDelete() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 1 );
verifyOutboxEntry( outboxEntries.get( 0 ), INDEX_NAME, "1", OutboxEvent.Type.ADD, null );
Expand All @@ -118,7 +112,7 @@ public void insertUpdateDelete() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 2 );
verifyOutboxEntry( outboxEntries.get( 1 ), INDEX_NAME, "1", OutboxEvent.Type.ADD_OR_UPDATE, null );
Expand All @@ -130,7 +124,7 @@ public void insertUpdateDelete() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 3 );
verifyOutboxEntry( outboxEntries.get( 2 ), INDEX_NAME, "1", OutboxEvent.Type.DELETE, null );
Expand All @@ -147,7 +141,7 @@ public void multipleInstances() {
}

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 7 );
for ( int i = 0; i < 7; i++ ) {
Expand All @@ -169,7 +163,7 @@ public void multipleTypes() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 2 );
verifyOutboxEntry( outboxEntries.get( 0 ), INDEX_NAME, "1", OutboxEvent.Type.ADD, null );
Expand All @@ -187,7 +181,7 @@ public void routingKeys() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 1 );
verifyOutboxEntry(
Expand All @@ -201,7 +195,7 @@ public void routingKeys() {
} );

OrmUtils.withinTransaction( sessionFactory, session -> {
List<Map> outboxEntries = findOutboxEntries( session );
List<OutboxEvent> outboxEntries = findOutboxEntries( session );

assertThat( outboxEntries ).hasSize( 2 );
verifyOutboxEntry(
Expand All @@ -210,17 +204,17 @@ public void routingKeys() {
} );
}

private List<Map> findOutboxEntries(Session session) {
return session.createQuery( "select e from " + OUTBOX_ENTITY_NAME + " e order by id", Map.class ).list();
private List<OutboxEvent> findOutboxEntries(Session session) {
return session.createQuery( "select e from OutboxEvent e order by id", OutboxEvent.class ).list();
}

private void verifyOutboxEntry(Map<String, Object> outboxEntry, String entityName, String entityId,
private void verifyOutboxEntry(OutboxEvent outboxEvent, String entityName, String serializedId,
OutboxEvent.Type type, String currentRoute, String... previousRoutes) {
assertThat( outboxEntry ).containsEntry( ENTITY_NAME_PROPERTY_NAME, entityName );
assertThat( outboxEntry ).containsEntry( ENTITY_ID_PROPERTY_NAME, entityId );
assertThat( outboxEntry ).containsEntry( EVENT_TYPE_PROPERTY_NAME, type.ordinal() );
assertThat( outboxEvent.getEntityName() ).isEqualTo( entityName );
assertThat( outboxEvent.getSerializedId() ).isEqualTo( serializedId );
assertThat( outboxEvent.getType() ).isEqualTo( type );

byte[] serializedRoutingKeys = (byte[]) outboxEntry.get( ROUTE_PROPERTY_NAME );
byte[] serializedRoutingKeys = outboxEvent.getSerializedRoutes();
DocumentRoutesDescriptor routesDescriptor = SerializationUtils.deserialize(
DocumentRoutesDescriptor.class, serializedRoutingKeys );

Expand Down
Expand Up @@ -33,31 +33,30 @@ public class OutboxAdditionalJaxbMappingProducer implements org.hibernate.boot.s

private static final Log log = LoggerFactory.make( Log.class, MethodHandles.lookup() );

public static final String OUTBOX_ENTITY_NAME = "HibernateSearchOutboxEntity";
public static final String ENTITY_NAME_PROPERTY_NAME = "entityName";
public static final String ENTITY_ID_PROPERTY_NAME = "entityId";
public static final String ROUTE_PROPERTY_NAME = "route";
public static final String EVENT_TYPE_PROPERTY_NAME = "eventType";

private static final String OUTBOX_TABLE_NAME = "HIBERNATE_SEARCH_OUTBOX_TABLE";

private static final String OUTBOX_ENTITY_DEFINITION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"\n" +
"<hibernate-mapping>\n" +
" <class entity-name=\"" + OUTBOX_ENTITY_NAME + "\" table=\"" + OUTBOX_TABLE_NAME + "\">\n" +
" <id name=\"id\" column=\"ID\" type=\"integer\">\n" +
" <generator class=\"org.hibernate.id.enhanced.SequenceStyleGenerator\">\n" +
" <param name=\"sequence_name\">" + OUTBOX_TABLE_NAME + "_GENERATOR</param>\n" +
" <param name=\"table_name\">" + OUTBOX_TABLE_NAME + "_GENERATOR</param>\n" +
" <param name=\"initial_value\">1</param>\n" +
" <param name=\"increment_size\">1</param>\n" +
" </generator>\n\r" +
" </id>\n\r" +
" <property name=\"" + ENTITY_NAME_PROPERTY_NAME + "\" column=\"ENTITY_NAME\" type=\"string\" />\n" +
" <property name=\"" + ENTITY_ID_PROPERTY_NAME + "\" column=\"ENTITY_ID\" type=\"string\" />\n" +
" <property name=\"" + ROUTE_PROPERTY_NAME + "\" column=\"ROUTE\" type=\"binary\" length=\"8192\" />\n" +
" <property name=\"" + EVENT_TYPE_PROPERTY_NAME + "\" column=\"EVENT_TYPE\" type=\"integer\" />\n" +
" </class>\n" +
"</hibernate-mapping>\n";
"\n" +
"<hibernate-mapping>\n" +
" <class name=\"" + OutboxEvent.class.getName() + "\" table=\"" + OUTBOX_TABLE_NAME + "\">\n" +
" <id name=\"id\" column=\"ID\" type=\"integer\">\n" +
" <generator class=\"org.hibernate.id.enhanced.SequenceStyleGenerator\">\n" +
" <param name=\"sequence_name\">" + OUTBOX_TABLE_NAME + "_GENERATOR</param>\n" +
" <param name=\"table_name\">" + OUTBOX_TABLE_NAME + "_GENERATOR</param>\n" +
" <param name=\"initial_value\">1</param>\n" +
" <param name=\"increment_size\">1</param>\n" +
" </generator>\n\r" +
" </id>\n\r" +
" <property name=\"entityName\" type=\"string\" />\n" +
" <property name=\"serializedId\" type=\"string\" />\n" +
" <property name=\"serializedRoutes\" type=\"binary\" length=\"8192\" />\n" +
" <property name=\"type\" >\n" +
" <type name=\"org.hibernate.type.EnumType\">\n" +
" <param name=\"enumClass\">" + OutboxEvent.Type.class.getName() + "</param>\n" +
" </type>\n" +
" </property>\n" +
" </class>\n" +
"</hibernate-mapping>\n";

@Override
public Collection<MappingDocument> produceAdditionalMappings(final MetadataImplementor metadata,
Expand Down
Expand Up @@ -18,34 +18,62 @@ public enum Type {
ADD, ADD_OR_UPDATE, DELETE
}

private final Type type;
private final String entityName;
private final String serializedId;
private final byte[] serializedRoutes;
private Integer id;
private String entityName;
private String serializedId;
private byte[] serializedRoutes;
private Type type;

public OutboxEvent() {
}

public OutboxEvent(Type type, String entityName, String serializedId, DocumentRoutesDescriptor routesDescriptor) {
this.type = type;
this.entityName = entityName;
this.serializedId = serializedId;
this.serializedRoutes = SerializationUtils.serialize( routesDescriptor );
this.type = type;
}

public Type getType() {
return type;
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getEntityName() {
return entityName;
}

public void setEntityName(String entityName) {
this.entityName = entityName;
}

public String getSerializedId() {
return serializedId;
}

public void setSerializedId(String serializedId) {
this.serializedId = serializedId;
}

public byte[] getSerializedRoutes() {
return serializedRoutes;
}

public void setSerializedRoutes(byte[] serializedRoutes) {
this.serializedRoutes = serializedRoutes;
}

public Type getType() {
return type;
}

public void setType(Type type) {
this.type = type;
}

@Override
public boolean equals(Object o) {
if ( this == o ) {
Expand Down
Expand Up @@ -6,14 +6,7 @@
*/
package org.hibernate.search.mapper.orm.outbox.impl;

import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ENTITY_ID_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ENTITY_NAME_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.EVENT_TYPE_PROPERTY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.OUTBOX_ENTITY_NAME;
import static org.hibernate.search.mapper.orm.outbox.impl.OutboxAdditionalJaxbMappingProducer.ROUTE_PROPERTY_NAME;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CompletableFuture;

Expand Down Expand Up @@ -59,13 +52,7 @@ public <R> CompletableFuture<MultiEntityOperationExecutionReport<R>> sendAndRepo
MultiEntityOperationExecutionReport.Builder<R> builder = MultiEntityOperationExecutionReport.builder();
for ( OutboxEvent event : events ) {
try {
HashMap<String, Object> entityData = new HashMap<>();
entityData.put( ENTITY_NAME_PROPERTY_NAME, event.getEntityName() );
entityData.put( ENTITY_ID_PROPERTY_NAME, event.getSerializedId() );
entityData.put( ROUTE_PROPERTY_NAME, event.getSerializedRoutes() );
entityData.put( EVENT_TYPE_PROPERTY_NAME, event.getType().ordinal() );

session.persist( OUTBOX_ENTITY_NAME, entityData );
session.persist( event );
}
catch (RuntimeException e) {
builder.throwable( e );
Expand Down

0 comments on commit eab1ec6

Please sign in to comment.