class PushNotificationProcessorImpl implements PushNotificationProcessor {

    @Override
    public void processNotification(@Nonnull final Long notificationId, @Nonnull final Map<String, String> secureProperties) {
        Assert.notNull(notificationId, "Push notification id should not be null");
        Assert.notNull(secureProperties, "Secure properties map should not be null");
        logger.debug("Processing push notification for id - {}", notificationId);
        final PushNotification pushNotification = pushNotificationService.getPushNotificationForProcessing(notificationId);
        assertPushNotificationState(pushNotification);
        // Update state to processing
        updatePushNotificationState(notificationId, NotificationState.PROCESSING);
        try {
            // Process push notification
            final String pushNotificationProviderExternalUuid = send(pushNotification, secureProperties);
            // Check if provider uuid is provided
            if (StringUtils.isNotBlank(pushNotificationProviderExternalUuid)) {
                logger.debug("Updating provider uuid for push notification with id - {}, uuid - {}", notificationId, pushNotificationProviderExternalUuid);
                updatePushNotificationExternalUuId(notificationId, pushNotificationProviderExternalUuid);
            }
            // Mark push notification as processed
            updatePushNotificationState(notificationId, NotificationState.SENT);
        } catch (final Exception ex) {
            final String message = "Error occurred while processing push notification with id - " + notificationId;
            updatePushNotificationState(notificationId, NotificationState.FAILED);
            throw new ServicesRuntimeException(message, ex);
        }
    }

      PushNotificationProcessorImpl();

}