public static PortabilityJob fromMap(Map<String, Object> properties) {
    Instant now = Instant.now();
    String encryptedAuthData =
        properties.containsKey(ENCRYPTED_CREDS_KEY)
            ? (String) properties.get(ENCRYPTED_CREDS_KEY)
            : null;
    String encodedPublicKey =
        properties.containsKey(WORKER_INSTANCE_PUBLIC_KEY)
            ? (String) properties.get(WORKER_INSTANCE_PUBLIC_KEY)
            : null;

    String instanceId =
        properties.containsKey(WORKER_INSTANCE_ID)
            ? (String) properties.get(WORKER_INSTANCE_ID)
            : null;

    String encryptedExportInitialAuthData =
        properties.containsKey(EXPORT_ENCRYPTED_INITIAL_AUTH_DATA)
            ? (String) properties.get(EXPORT_ENCRYPTED_INITIAL_AUTH_DATA)
            : null;

    String encryptedImportInitialAuthData =
        properties.containsKey(IMPORT_ENCRYPTED_INITIAL_AUTH_DATA)
            ? (String) properties.get(IMPORT_ENCRYPTED_INITIAL_AUTH_DATA)
            : null;

    State state =
        properties.containsKey(JOB_STATE)
            ? State.valueOf((String) properties.get(JOB_STATE))
            : State.NEW;

    String failureReason =
        properties.containsKey(FAILURE_REASON) ? (String) properties.get(FAILURE_REASON) : null;

    TimeZone userTimeZone =
        properties.containsKey(USER_TIMEZONE) ? (TimeZone) properties.get(USER_TIMEZONE) : null;

    String userLocale =
        properties.containsKey(USER_LOCALE) ? (String) properties.get(USER_LOCALE) : null;

    String userAlias =
        properties.containsKey(USER_ALIAS) ? (String) properties.get(USER_ALIAS) : null;

    TransferMode transferMode =
        properties.containsKey(TRANSFER_MODE)
            ? TransferMode.valueOf((String) properties.get(TRANSFER_MODE))
            : TransferMode.DATA_TRANSFER;

    DataVertical dataType =
        properties.containsKey(DATA_TYPE_KEY)
            ? DataVertical.fromDataType((String) properties.get(DATA_TYPE_KEY))
            : null;

    return PortabilityJob.builder()
        .setState(state)
        .setExportService((String) properties.get(EXPORT_SERVICE_KEY))
        .setImportService((String) properties.get(IMPORT_SERVICE_KEY))
        .setTransferDataType(dataType)
        .setExportInformation((String) properties.get(EXPORT_INFORMATION_KEY))
        .setCreatedTimestamp(now) // TODO: get from DB
        .setLastUpdateTimestamp(now)
        .setFailureReason(failureReason)
        .setJobAuthorization(
            JobAuthorization.builder()
                .setState(
                    JobAuthorization.State.valueOf((String) properties.get(AUTHORIZATION_STATE)))
                .setEncryptionScheme((String) properties.get(ENCRYPTION_SCHEME))
                .setEncryptedAuthData(encryptedAuthData)
                .setInstanceId(instanceId)
                .setSessionSecretKey((String) properties.get(ENCRYPTED_SESSION_KEY))
                .setAuthPublicKey(encodedPublicKey)
                .setEncryptedInitialExportAuthData(encryptedExportInitialAuthData)
                .setEncryptedInitialImportAuthData(encryptedImportInitialAuthData)
                .build())
        .setUserTimeZone(userTimeZone)
        .setUserLocale(userLocale)
        .setUserAlias(userAlias)
        .setTransferMode(transferMode)
        .build();
  }
A job that will fulfill a transfer request.

<p>TODO: Consider having the concepts of a data "owner".
portability-spi-cloud/src/main/java/org/datatransferproject/spi/cloud/types/PortabilityJob.java