class CausalClusteringBackupStrategy extends LifecycleAdapter implements BackupStrategy {

    @Override
    public Fallible<BackupStageOutcome> performFullBackup( DatabaseLayout targetDatabaseLayout, Config config,
                                                           OptionalHostnamePort userProvidedAddress )
    {
        AdvertisedSocketAddress fromAddress = addressResolver.resolveCorrectCCAddress( config, userProvidedAddress );
        log.info( "Resolved address for catchup protocol is " + fromAddress );
        StoreId storeId;
        try
        {
            storeId = backupDelegator.fetchStoreId( fromAddress );
            log.info( "Remote store id is " + storeId );
        }
        catch ( StoreIdDownloadFailedException e )
        {
            return new Fallible<>( BackupStageOutcome.WRONG_PROTOCOL, e );
        }

        Optional<StoreId> expectedStoreId = readLocalStoreId( targetDatabaseLayout );
        if ( expectedStoreId.isPresent() )
        {
            return new Fallible<>( BackupStageOutcome.FAILURE, new StoreIdDownloadFailedException(
                    format( "Cannot perform a full backup onto preexisting backup. Remote store id was %s but local is %s", storeId, expectedStoreId ) ) );
        }

        try
        {
            backupDelegator.copy( fromAddress, storeId, targetDatabaseLayout );
            return new Fallible<>( BackupStageOutcome.SUCCESS, null );
        }
        catch ( StoreCopyFailedException e )
        {
            return new Fallible<>( BackupStageOutcome.FAILURE, e );
        }
    }

      CausalClusteringBackupStrategy( BackupDelegator backupDelegator, AddressResolver addressResolver, LogProvider logProvider, StoreFiles storeFiles );

}