Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.16 KB | None | 0 0
  1. package com.ewt.i18n.core.localization;
  2.  
  3.  
  4. import java.util.Objects;
  5. import java.util.Optional;
  6. import java.util.UUID;
  7.  
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  14.  
  15. import com.ewt.common.time.TimeSupplier;
  16. import com.ewt.commons.result.Result;
  17. import com.ewt.dictionary.api.DictionaryEntry;
  18. import com.ewt.dictionary.cache.DictionaryCodeCache;
  19. import com.ewt.domain.user.User;
  20. import com.ewt.i18n.api.common.UpdateLocaleError;
  21. import com.ewt.i18n.api.localization.create.CreateLocalizationError;
  22. import com.ewt.i18n.api.localization.create.CreateLocalizationRequest;
  23. import com.ewt.i18n.core.key.dao.KeyDAO;
  24. import com.ewt.i18n.core.locale.dao.LocaleDAO;
  25. import com.ewt.i18n.core.localization.dao.LocalizationDAO;
  26. import com.ewt.i18n.core.localization.dao.LocalizationKey;
  27. import com.ewt.i18n.core.localization.dao.LocalizationKeyDAO;
  28. import com.ewt.i18n.event.api.EventTypes;
  29. import com.ewt.i18n.event.api.LocalizationKeyValueUpdatedEvent;
  30. import com.ewt.i18n.event.exporter.LocalizationKeyValueUpdatedEventExporter;
  31.  
  32.  
  33. /**
  34.  * Менеджер управления локализациями.
  35.  *
  36.  * @author Klyushkin A. <aklyushkin@marathonbet.ru>.
  37.  */
  38. @Component
  39. public class LocalizationManager
  40. {
  41.     private static final Logger logger = LoggerFactory.getLogger(LocalizationManager.class);
  42.  
  43.     private static final Result<Void, CreateLocalizationError> LOCALE_NOT_FOUND =
  44.         Result.failed(CreateLocalizationError.LOCALE_NOT_FOUND);
  45.  
  46.     private static final Result<Void, CreateLocalizationError> LOCALIZATION_ALREADY_EXIST =
  47.         Result.failed(CreateLocalizationError.LOCALIZATION_ALREADY_EXIST);
  48.  
  49.     private final DictionaryCodeCache localeCache;
  50.  
  51.     private final LocaleDAO localeDAO;
  52.  
  53.     private final KeyDAO keyDAO;
  54.  
  55.     private final LocalizationKeyDAO localizationKeyDAO;
  56.  
  57.     private final LocalizationDAO localizationDAO;
  58.  
  59.     private final LocalizationKeyValueUpdatedEventExporter localizationKeyValueUpdatedEventExporter;
  60.  
  61.     private final TimeSupplier timeSupplier;
  62.  
  63.  
  64.     @Autowired
  65.     public LocalizationManager(final DictionaryCodeCache localeCache,
  66.                                final LocaleDAO localeDAO,
  67.                                final KeyDAO keyDAO,
  68.                                final LocalizationKeyDAO localizationKeyDAO,
  69.                                final LocalizationDAO localizationDAO,
  70.                                final LocalizationKeyValueUpdatedEventExporter localizationKeyValueUpdatedEventExporter,
  71.                                final TimeSupplier timeSupplier)
  72.     {
  73.         this.localeCache = localeCache;
  74.         this.localeDAO = localeDAO;
  75.         this.keyDAO = keyDAO;
  76.         this.localizationKeyDAO = localizationKeyDAO;
  77.         this.localizationDAO = localizationDAO;
  78.         this.localizationKeyValueUpdatedEventExporter = localizationKeyValueUpdatedEventExporter;
  79.         this.timeSupplier = timeSupplier;
  80.     }
  81.    
  82.    
  83.     /**
  84.      * Обновление локализации.
  85.      *
  86.      * Перед обновлением локализации сначала выполняется инкремент локали,
  87.      * и новая версия локали используется как новая версия локализации.
  88.      *
  89.      * @param localizationId идентифкатор локализации
  90.      * @param text           новое значение лоаклизации
  91.      * @param user           пользователь, иницировавший изменение
  92.      * @param version        версия локали
  93.      * @return результат обновления локализации
  94.      */
  95.     @Transactional
  96.     public Result<Void, UpdateLocaleError> updateLocalization(final long localizationId,
  97.                                                               final String text,
  98.                                                               final User user,
  99.                                                               final long version)
  100.     {
  101.         logger.debug("updateLocalization(): user={}, localizationId={}, text={}, version={}", user, localizationId, text, version);
  102.  
  103.         localizationKeyValueUpdatedEventExporter.export(
  104.                 LocalizationKeyValueUpdatedEvent.builder()
  105.                         .withEventId(UUID.randomUUID())
  106.                         .withEventDate(timeSupplier.getCurrentTime())
  107.                         .withActor(user)
  108.                         .withI18nKey()                                              //from where
  109.                         .withLocale()                                               //from where
  110.                         .withNewValue()                                             //from where
  111.                         .withOldValue()                                             //from where
  112.                         .withEventType(EventTypes.LOCALIZATION_KEY_UPDATED)
  113.                         .build());
  114.  
  115.         return localizationKeyDAO.getLocalizationKey(localizationId)
  116.                 .map(LocalizationKey::getLocaleId)
  117.                 .map(localeId -> updateLocaleVersion(localeId, localizationId, version, text, user))
  118.                 .orElseGet(() -> {
  119.                     logger.info("Localization not found: localizationId={}, version={}", localizationId, version);
  120.                     return Result.failed(UpdateLocaleError.LOCALIZATION_NOT_FOUND);
  121.                 });
  122.    
  123.     }
  124.  
  125.  
  126.     private Result<Void, UpdateLocaleError> updateLocaleVersion(final Long localeId,
  127.                                                                 final Long localizationId,
  128.                                                                 final Long version,
  129.                                                                 final String text,
  130.                                                                 final User user)
  131.     {
  132.         logger.debug("Update localization version: localizationId={}, version={}, text={}, user={}", localizationId, version, text, user);
  133.  
  134.         final Long newLocaleVersion = localeDAO.updateLocaleVersion(localeId);
  135.  
  136.         final boolean isUpdated = localizationDAO.updateLocalization(localizationId, text, version, newLocaleVersion);
  137.  
  138.         if (!isUpdated)
  139.         {
  140.             logger.info("Localization version conflict: localizationId={}, version={}, text={}, user={}", localizationId, version, text, user);
  141.  
  142.             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  143.  
  144.             return Result.failed(UpdateLocaleError.VERSION_CONFLICT);
  145.         }
  146.  
  147.         localizationDAO.updateLocalizationHistory(localizationId, text, newLocaleVersion, user);
  148.  
  149.         return Result.success();
  150.     }
  151.  
  152.  
  153.     /**
  154.      * Добавление локализации.
  155.      *
  156.      * @param request {@link CreateLocalizationRequest}
  157.      * @return Результат обновления локализации.
  158.      */
  159.     @Transactional
  160.     public Result<Void, CreateLocalizationError> createLocalization(final CreateLocalizationRequest request)
  161.     {
  162.         logger.debug("createLocalization(): request={}", request);
  163.  
  164.         final Optional<Long> localeIdOptional = localeCache.get(request.getLocale().asString()).map(DictionaryEntry::getId);
  165.         if (!localeIdOptional.isPresent())
  166.         {
  167.             logger.info("locale not found: locale = {}", request.getLocale());
  168.             return LOCALE_NOT_FOUND;
  169.         }
  170.  
  171.         final Long localeId = localeIdOptional.get();
  172.  
  173.         final Long keyId = keyDAO.addKey(request.getKey());
  174.  
  175.         final Long newLocaleVersion = localeDAO.updateLocaleVersion(localeIdOptional.get());
  176.  
  177.         final Long localizationKeyId = localizationKeyDAO.addLocalizationKey(keyId, localeId).orElse(null);
  178.         if (Objects.isNull(localizationKeyId))
  179.         {
  180.             logger.info("localization already exist: key = {}, locale={}", request.getKey(), request.getLocale());
  181.             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  182.             return LOCALIZATION_ALREADY_EXIST;
  183.         }
  184.  
  185.         localizationDAO.insertLocalization(localizationKeyId, request.getText(), newLocaleVersion);
  186.         localizationDAO.updateLocalizationHistory(localizationKeyId, request.getText(), newLocaleVersion, request.getUser());
  187.  
  188.         localizationKeyValueUpdatedEventExporter.export(
  189.                 LocalizationKeyValueUpdatedEvent.builder()
  190.                         .withEventId(UUID.randomUUID())
  191.                         .withEventDate(timeSupplier.getCurrentTime())
  192.                         .withActor(request.getUser())
  193.                         .withI18nKey(request.getKey().toString())
  194.                         .withLocale(request.getLocale())
  195.                         .withNewValue()             //from where
  196.                         .withOldValue()             //from where
  197.                         .withEventType(EventTypes.LOCALIZATION_KEY_CREATED)
  198.                         .build());
  199.  
  200.         return Result.success();
  201.     }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement