JpaDataManagerDao.java

  1. /*
  2.  * *********************************************************************************************************************
  3.  *
  4.  * SolidBlue 3: Data safety
  5.  * http://tidalwave.it/projects/solidblue3
  6.  *
  7.  * Copyright (C) 2023 - 2023 by Tidalwave s.a.s. (http://tidalwave.it)
  8.  *
  9.  * *********************************************************************************************************************
  10.  *
  11.  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  12.  * the License. You may obtain a copy of the License at
  13.  *
  14.  *     http://www.apache.org/licenses/LICENSE-2.0
  15.  *
  16.  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  17.  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
  18.  * specific language governing permissions and limitations under the License.
  19.  *
  20.  * *********************************************************************************************************************
  21.  *
  22.  * git clone https://bitbucket.org/tidalwave/solidblue3j-src
  23.  * git clone https://github.com/tidalwave-it/solidblue3j-src
  24.  *
  25.  * *********************************************************************************************************************
  26.  */
  27. package it.tidalwave.datamanager.dao.impl.jpa;

  28. import jakarta.annotation.Nonnull;
  29. import java.util.List;
  30. import java.util.Optional;
  31. import java.util.concurrent.atomic.AtomicReference;
  32. import java.nio.file.Path;
  33. import org.springframework.stereotype.Component;
  34. import it.tidalwave.util.Id;
  35. import it.tidalwave.util.spring.jpa.impl.Fetcher;
  36. import it.tidalwave.datamanager.model.Backup;
  37. import it.tidalwave.datamanager.model.BackupFile;
  38. import it.tidalwave.datamanager.model.DataManager.BackupFinder;
  39. import it.tidalwave.datamanager.model.DataManager.ManagedFileFinder;
  40. import it.tidalwave.datamanager.model.Fingerprint;
  41. import it.tidalwave.datamanager.model.ManagedFile;
  42. import it.tidalwave.datamanager.dao.DataManagerDao;
  43. import lombok.AllArgsConstructor;
  44. import lombok.extern.slf4j.Slf4j;

  45. /***********************************************************************************************************************
  46.  *
  47.  * The DAO for the application.
  48.  *
  49.  * @stereotype  DAO
  50.  * @author      Fabrizio Giudici
  51.  *
  52.  **********************************************************************************************************************/
  53. @Component @AllArgsConstructor @Slf4j
  54. public class JpaDataManagerDao implements DataManagerDao
  55.   {
  56.     @Nonnull
  57.     private final ManagedFileEntityJpaRepository managedFileRepo;

  58.     @Nonnull
  59.     private final BackupEntityJpaRepository backupRepo;

  60.     @Nonnull
  61.     private final Fetcher fetcher;

  62.     /*******************************************************************************************************************
  63.      * {@inheritDoc}
  64.      ******************************************************************************************************************/
  65.     @Override @Nonnull
  66.     public ManagedFileFinder findManagedFiles()
  67.       {
  68.         return new JpaManagedFileFinder(managedFileRepo, this::managedFileEntityToModel);
  69.       }

  70.     /*******************************************************************************************************************
  71.      * {@inheritDoc}
  72.      ******************************************************************************************************************/
  73.     @Override @Nonnull
  74.     public BackupFinder findBackups()
  75.       {
  76.         return new JpaBackupFinder(backupRepo, this::backupEntityToModel);
  77.       }

  78.     /*******************************************************************************************************************
  79.      * {@inheritDoc}
  80.      ******************************************************************************************************************/
  81.     @Nonnull
  82.     public ManagedFile managedFileEntityToModel (@Nonnull final ManagedFileEntity entity)
  83.       {
  84.         return new ManagedFile(Id.of(entity.getId()),
  85.              Path.of(entity.getPath()),
  86.              entity.isInitialized()
  87.              ? () -> fingerprintEntitiesToModel(entity.getFingerprints())
  88.              : () -> fingerprintEntitiesToModel(fetcher.fetch(entity, ManagedFileEntity::getFingerprints)));
  89.       }

  90.     /*******************************************************************************************************************
  91.      *
  92.      ******************************************************************************************************************/
  93.     @Nonnull
  94.     private static List<Fingerprint> fingerprintEntitiesToModel (@Nonnull final List<? extends FingerprintEntity> entities)
  95.       {
  96.         return entities.stream().map(JpaDataManagerDao::fingerprintEntityToModel).toList();
  97.       }

  98.     /*******************************************************************************************************************
  99.      *
  100.      ******************************************************************************************************************/
  101.     @Nonnull
  102.     private static Fingerprint fingerprintEntityToModel (@Nonnull final FingerprintEntity entity)
  103.       {
  104.         return Fingerprint.builder()
  105.                           .id(Id.of(entity.getId()))
  106.                           .name(entity.getName())
  107.                           .algorithm(entity.getAlgorithm())
  108.                           .fingerprint(entity.getValue())
  109.                           .timestamp(entity.getTimestamp())
  110.                           .build();
  111.       }

  112.     /*******************************************************************************************************************
  113.      * {@inheritDoc}
  114.      ******************************************************************************************************************/
  115.     @Nonnull
  116.     public Backup backupEntityToModel (@Nonnull final BackupEntity entity)
  117.       {
  118.         final var ref = new AtomicReference<Backup>();
  119.         final var backup = Backup.builder()
  120.                      .id(Id.of(entity.getId()))
  121.                      .label(entity.getLabel())
  122.                      .volumeId(Id.of(entity.getVolumeId()))
  123.                      .encrypted(entity.isEncrypted())
  124.                      .basePath(Path.of(entity.getBasePath()))
  125.                      .creationDate(entity.getCreationDate())
  126.                      .registrationDate(entity.getRegistrationDate())
  127.                      .latestCheckDate(Optional.ofNullable(entity.getLatestCheckDate()))
  128.                      .backupFiles(entity.isInitialized()
  129.                           ? () -> backupFileEntitiesToModel(ref.get(), entity.getBackupFiles())
  130.                           : () -> backupFileEntitiesToModel(ref.get(), fetcher.fetch(entity, BackupEntity::getBackupFiles)))
  131.                      .build();
  132.         ref.set(backup);
  133.         return backup;
  134.       }

  135.     /*******************************************************************************************************************
  136.      *
  137.      ******************************************************************************************************************/
  138.     @Nonnull
  139.     private List<BackupFile> backupFileEntitiesToModel (@Nonnull final Backup backup,
  140.                                                         @Nonnull final List<? extends BackupFileEntity> entities)
  141.       {
  142.         return entities.stream().map(e -> backupFileEntityToModel(e, backup)).toList();
  143.       }

  144.     /*******************************************************************************************************************
  145.      *
  146.      ******************************************************************************************************************/
  147.     @Nonnull
  148.     private BackupFile backupFileEntityToModel (@Nonnull final BackupFileEntity entity,
  149.                                                 @Nonnull final Backup backup)
  150.       {
  151.         return new BackupFile(Id.of(entity.getId()),
  152.                               Path.of(entity.getPath()),
  153.                               managedFileEntityToModel(entity.getManagedFile()), // TODO: use flyweight? Needed?
  154.                               backup); // TODO: use flyweight? Needed?
  155.       }
  156.   }