Serializer.java

  1. package com.github.jonasrutishauser.transactional.event.core;

  2. import java.util.Map;
  3. import java.util.concurrent.ConcurrentHashMap;

  4. import jakarta.enterprise.context.ApplicationScoped;
  5. import jakarta.enterprise.inject.Any;
  6. import jakarta.enterprise.inject.Instance;
  7. import jakarta.inject.Inject;

  8. import com.github.jonasrutishauser.transactional.event.api.serialization.EventSerializer;

  9. @ApplicationScoped
  10. class Serializer {

  11.     private final Map<Class<?>, EventSerializer<?>> serializers = new ConcurrentHashMap<>();

  12.     Serializer() {
  13.         // proxy only
  14.     }

  15.     @Inject
  16.     Serializer(@Any Instance<EventSerializer<?>> serializers) {
  17.         for (EventSerializer<?> serializer : serializers) {
  18.             this.serializers.put(serializer.getType(), serializer);
  19.         }
  20.     }

  21.     String serialize(Object event) {
  22.         return serialize(getSerializer(event), event);
  23.     }

  24.     private <T> String serialize(EventSerializer<T> serializer, Object event) {
  25.         return serializer.serialize(serializer.getType().cast(event));
  26.     }

  27.     private EventSerializer<?> getSerializer(Object event) {
  28.         return serializers.computeIfAbsent(event.getClass(), this::getSerializer);
  29.     }

  30.     private EventSerializer<?> getSerializer(Class<?> eventType) {
  31.         for (Class<?> type = eventType.getSuperclass(); type != null; type = type.getSuperclass()) {
  32.             if (serializers.containsKey(type)) {
  33.                 return serializers.get(type);
  34.             }
  35.         }
  36.         throw new IllegalArgumentException("Serializer not found for " + eventType.getName());
  37.     }

  38. }