JpaDataManagerDao.java
- /*
- * *********************************************************************************************************************
- *
- * SolidBlue 3: Data safety
- * http://tidalwave.it/projects/solidblue3
- *
- * Copyright (C) 2023 - 2023 by Tidalwave s.a.s. (http://tidalwave.it)
- *
- * *********************************************************************************************************************
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- *
- * *********************************************************************************************************************
- *
- * git clone https://bitbucket.org/tidalwave/solidblue3j-src
- * git clone https://github.com/tidalwave-it/solidblue3j-src
- *
- * *********************************************************************************************************************
- */
- package it.tidalwave.datamanager.dao.impl.jpa;
- import jakarta.annotation.Nonnull;
- import java.util.List;
- import java.util.Optional;
- import java.util.concurrent.atomic.AtomicReference;
- import java.nio.file.Path;
- import org.springframework.stereotype.Component;
- import it.tidalwave.util.Id;
- import it.tidalwave.util.spring.jpa.impl.Fetcher;
- import it.tidalwave.datamanager.model.Backup;
- import it.tidalwave.datamanager.model.BackupFile;
- import it.tidalwave.datamanager.model.DataManager.BackupFinder;
- import it.tidalwave.datamanager.model.DataManager.ManagedFileFinder;
- import it.tidalwave.datamanager.model.Fingerprint;
- import it.tidalwave.datamanager.model.ManagedFile;
- import it.tidalwave.datamanager.dao.DataManagerDao;
- import lombok.AllArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- /***********************************************************************************************************************
- *
- * The DAO for the application.
- *
- * @stereotype DAO
- * @author Fabrizio Giudici
- *
- **********************************************************************************************************************/
- @Component @AllArgsConstructor @Slf4j
- public class JpaDataManagerDao implements DataManagerDao
- {
- @Nonnull
- private final ManagedFileEntityJpaRepository managedFileRepo;
- @Nonnull
- private final BackupEntityJpaRepository backupRepo;
- @Nonnull
- private final Fetcher fetcher;
- /*******************************************************************************************************************
- * {@inheritDoc}
- ******************************************************************************************************************/
- @Override @Nonnull
- public ManagedFileFinder findManagedFiles()
- {
- return new JpaManagedFileFinder(managedFileRepo, this::managedFileEntityToModel);
- }
- /*******************************************************************************************************************
- * {@inheritDoc}
- ******************************************************************************************************************/
- @Override @Nonnull
- public BackupFinder findBackups()
- {
- return new JpaBackupFinder(backupRepo, this::backupEntityToModel);
- }
- /*******************************************************************************************************************
- * {@inheritDoc}
- ******************************************************************************************************************/
- @Nonnull
- public ManagedFile managedFileEntityToModel (@Nonnull final ManagedFileEntity entity)
- {
- return new ManagedFile(Id.of(entity.getId()),
- Path.of(entity.getPath()),
- entity.isInitialized()
- ? () -> fingerprintEntitiesToModel(entity.getFingerprints())
- : () -> fingerprintEntitiesToModel(fetcher.fetch(entity, ManagedFileEntity::getFingerprints)));
- }
- /*******************************************************************************************************************
- *
- ******************************************************************************************************************/
- @Nonnull
- private static List<Fingerprint> fingerprintEntitiesToModel (@Nonnull final List<? extends FingerprintEntity> entities)
- {
- return entities.stream().map(JpaDataManagerDao::fingerprintEntityToModel).toList();
- }
- /*******************************************************************************************************************
- *
- ******************************************************************************************************************/
- @Nonnull
- private static Fingerprint fingerprintEntityToModel (@Nonnull final FingerprintEntity entity)
- {
- return Fingerprint.builder()
- .id(Id.of(entity.getId()))
- .name(entity.getName())
- .algorithm(entity.getAlgorithm())
- .fingerprint(entity.getValue())
- .timestamp(entity.getTimestamp())
- .build();
- }
- /*******************************************************************************************************************
- * {@inheritDoc}
- ******************************************************************************************************************/
- @Nonnull
- public Backup backupEntityToModel (@Nonnull final BackupEntity entity)
- {
- final var ref = new AtomicReference<Backup>();
- final var backup = Backup.builder()
- .id(Id.of(entity.getId()))
- .label(entity.getLabel())
- .volumeId(Id.of(entity.getVolumeId()))
- .encrypted(entity.isEncrypted())
- .basePath(Path.of(entity.getBasePath()))
- .creationDate(entity.getCreationDate())
- .registrationDate(entity.getRegistrationDate())
- .latestCheckDate(Optional.ofNullable(entity.getLatestCheckDate()))
- .backupFiles(entity.isInitialized()
- ? () -> backupFileEntitiesToModel(ref.get(), entity.getBackupFiles())
- : () -> backupFileEntitiesToModel(ref.get(), fetcher.fetch(entity, BackupEntity::getBackupFiles)))
- .build();
- ref.set(backup);
- return backup;
- }
- /*******************************************************************************************************************
- *
- ******************************************************************************************************************/
- @Nonnull
- private List<BackupFile> backupFileEntitiesToModel (@Nonnull final Backup backup,
- @Nonnull final List<? extends BackupFileEntity> entities)
- {
- return entities.stream().map(e -> backupFileEntityToModel(e, backup)).toList();
- }
- /*******************************************************************************************************************
- *
- ******************************************************************************************************************/
- @Nonnull
- private BackupFile backupFileEntityToModel (@Nonnull final BackupFileEntity entity,
- @Nonnull final Backup backup)
- {
- return new BackupFile(Id.of(entity.getId()),
- Path.of(entity.getPath()),
- managedFileEntityToModel(entity.getManagedFile()), // TODO: use flyweight? Needed?
- backup); // TODO: use flyweight? Needed?
- }
- }