/** Perform event filter registration. */
    public void run() {
      if (log.isDebugEnabled()) {
        log.debug("Registering event filter " + this.eventFilter.toString());
        log.debug("Looking up matching past events in registry");
      }
      hibernateEventRegistry = (EventRegistry) getEventRegistry();
      unitOfWork = hibernateEventRegistry.getUnitOfWork();

      List<Event> matchesInRegistry =
          hibernateEventRegistry.findByTemplate(this.eventFilter.getTemplate());

      if (log.isDebugEnabled())
        log.debug("Matching past events found in registry, publishing them");

      List<Event> pastEventNotificationBatch = new ArrayList<Event>();

      for (Event match : matchesInRegistry) {
        if (!this.registrationHasBeenCanceled()) {
          pastEventNotificationBatch.add(match);

          if (pastEventNotificationBatch.size() % getPastEventNotificationBatchSize() == 0) {
            this.eventLoggerService
                .getEventFilterMatchHandler()
                .handleMatches(this.eventFilter, pastEventNotificationBatch);
            pastEventNotificationBatch.clear();
          }
        } else {
          if (log.isDebugEnabled())
            log.debug("Event filter has been deregistered. Stopping processing");

          unitOfWork.rollback();
          return;
        }
      }

      if (!pastEventNotificationBatch.isEmpty())
        this.eventLoggerService
            .getEventFilterMatchHandler()
            .handleMatches(this.eventFilter, pastEventNotificationBatch);

      this.eventLoggerService.getEventRegistry().getUnitOfWork().rollback();

      if (log.isDebugEnabled())
        log.debug("Matching past events published, now registering filter for live events");

      boolean performedLiveEventFilterRegistration = false;

      if (!this.registrationHasBeenCanceled()) {
        this.eventLoggerService.registerFilterForLiveEvents(this.eventFilter);
        performedLiveEventFilterRegistration = true;
      } else {
        if (log.isDebugEnabled())
          log.debug("Event filter has been deregistered. Not registering for live events anymore.");
        unitOfWork.rollback();
        return;
      }

      if (this.registrationHasBeenCanceled() && performedLiveEventFilterRegistration) {
        if (log.isDebugEnabled())
          log.debug(
              "Event filter has been deregistered while registering for live events. Deregistering again for safety reasons.");

        this.eventLoggerService.deregisterEventFilter(this.eventFilter.getUuid());
      }

      this.eventLoggerService.handlerFinishedEventRegistration(this.eventFilter.getUuid());

      if (log.isDebugEnabled()) log.debug("Event filter registered for live events.");
      unitOfWork.rollback();
    }