Skip to content

Commit

Permalink
Add ExportInformation to PortabilityJob
Browse files Browse the repository at this point in the history
  • Loading branch information
wmorland committed Nov 15, 2018
1 parent 1e31ec8 commit 4452711
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 16 deletions.
Expand Up @@ -17,9 +17,11 @@
import org.datatransferproject.spi.cloud.types.PortabilityJob;
import org.datatransferproject.types.client.transfer.CreateTransferJob;
import org.datatransferproject.types.client.transfer.TransferJob;
import org.datatransferproject.types.common.ExportInformation;

import javax.crypto.SecretKey;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;

import static org.datatransferproject.api.action.ActionUtils.encodeJobId;
Expand Down Expand Up @@ -58,6 +60,7 @@ public TransferJob handle(CreateTransferJob request) {
String dataType = request.getDataType();
String exportService = request.getExportService();
String importService = request.getImportService();
Optional<ExportInformation> exportInformation = Optional.ofNullable(request.getExportInformation());
String exportCallbackUrl = request.getExportCallbackUrl();
String importCallbackUrl = request.getImportCallbackUrl();

Expand All @@ -68,7 +71,7 @@ public TransferJob handle(CreateTransferJob request) {

String encryptionScheme = request.getEncryptionScheme();
PortabilityJob job =
createJob(encodedSessionKey, dataType, exportService, importService, encryptionScheme);
createJob(encodedSessionKey, dataType, exportService, importService, exportInformation, encryptionScheme);

AuthDataGenerator exportGenerator =
registry.getAuthDataGenerator(job.exportService(), job.transferDataType(), EXPORT);
Expand Down Expand Up @@ -166,6 +169,7 @@ private static PortabilityJob createJob(
String dataType,
String exportService,
String importService,
Optional<ExportInformation> exportInformation,
String encryptionScheme) {

// Job auth data
Expand All @@ -176,11 +180,13 @@ private static PortabilityJob createJob(
.setState(JobAuthorization.State.INITIAL)
.build();

return PortabilityJob.builder()
.setTransferDataType(dataType)
.setExportService(exportService)
.setImportService(importService)
.setAndValidateJobAuthorization(jobAuthorization)
.build();
PortabilityJob.Builder builder =
PortabilityJob.builder()
.setTransferDataType(dataType)
.setExportService(exportService)
.setImportService(importService)
.setAndValidateJobAuthorization(jobAuthorization);
exportInformation.ifPresent(builder::setExportInformation);
return builder.build();
}
}
@@ -1,13 +1,16 @@
package org.datatransferproject.spi.cloud.types;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.auto.value.AutoValue;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import org.datatransferproject.types.common.ExportInformation;

import javax.annotation.Nullable;
import java.time.LocalDateTime;
import java.util.Map;

Expand All @@ -24,6 +27,7 @@ public abstract class PortabilityJob {
private static final String DATA_TYPE_KEY = "DATA_TYPE";
private static final String EXPORT_SERVICE_KEY = "EXPORT_SERVICE";
private static final String IMPORT_SERVICE_KEY = "IMPORT_SERVICE";
private static final String EXPORT_INFORMATION_KEY = "EXPORT_INFORMATION";
private static final String ENCRYPTED_CREDS_KEY = "ENCRYPTED_CREDS_KEY";
private static final String ENCRYPTED_SESSION_KEY = "ENCRYPTED_SESSION_KEY";
private static final String ENCRYPTION_SCHEME = "ENCRYPTION_SCHEME";
Expand Down Expand Up @@ -70,6 +74,7 @@ public static PortabilityJob fromMap(Map<String, Object> properties) {
.setExportService((String) properties.get(EXPORT_SERVICE_KEY))
.setImportService((String) properties.get(IMPORT_SERVICE_KEY))
.setTransferDataType((String) properties.get(DATA_TYPE_KEY))
.setExportInformation((ExportInformation) properties.get(EXPORT_INFORMATION_KEY))
.setCreatedTimestamp(now) // TODO: get from DB
.setLastUpdateTimestamp(now)
.setJobAuthorization(
Expand Down Expand Up @@ -112,6 +117,10 @@ private static void isSet(String... strings) {
@JsonProperty("transferDataType")
public abstract String transferDataType();

@Nullable
@JsonProperty(value = "exportInformation")
public abstract ExportInformation exportInformation();

@JsonProperty("createdTimestamp")
public abstract LocalDateTime createdTimestamp(); // ISO 8601 timestamp

Expand All @@ -132,6 +141,10 @@ public Map<String, Object> toMap() {
.put(AUTHORIZATION_STATE, jobAuthorization().state().toString())
.put(ENCRYPTED_SESSION_KEY, jobAuthorization().sessionSecretKey());

if (null != exportInformation()) {
builder.put(EXPORT_INFORMATION_KEY, exportInformation());
}

if (null != jobAuthorization().authPublicKey()) {
builder.put(WORKER_INSTANCE_PUBLIC_KEY, jobAuthorization().authPublicKey());
}
Expand Down Expand Up @@ -186,6 +199,10 @@ private static PortabilityJob.Builder create() {
@JsonProperty("transferDataType")
public abstract Builder setTransferDataType(String transferDataType);

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonProperty("exportInformation")
public abstract Builder setExportInformation(ExportInformation exportInformation);

@JsonProperty("createdTimestamp")
public abstract Builder setCreatedTimestamp(LocalDateTime createdTimestamp);

Expand Down
Expand Up @@ -15,17 +15,19 @@
*/
package org.datatransferproject.transfer;

import org.datatransferproject.types.common.ExportInformation;
import org.datatransferproject.types.transfer.auth.AuthData;

import java.io.IOException;
import java.util.Optional;
import java.util.UUID;

/** In-memory Copier interface */
public interface InMemoryDataCopier {
/* Copies the provided dataType from exportService to importService */
void copy(
AuthData exportAuthData,
AuthData importAuthData,
UUID jobId)
AuthData exportAuthData,
AuthData importAuthData,
UUID jobId, Optional<ExportInformation> exportInfo)
throws IOException;
}
Expand Up @@ -23,6 +23,7 @@
import org.datatransferproject.spi.cloud.types.PortabilityJob;
import org.datatransferproject.spi.transfer.security.AuthDataDecryptService;
import org.datatransferproject.spi.transfer.security.SecurityException;
import org.datatransferproject.types.common.ExportInformation;
import org.datatransferproject.types.transfer.auth.AuthData;
import org.datatransferproject.types.transfer.auth.AuthDataPair;
import org.slf4j.Logger;
Expand All @@ -31,6 +32,7 @@
import javax.annotation.Nullable;
import java.io.IOException;
import java.security.PrivateKey;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;

Expand Down Expand Up @@ -94,8 +96,10 @@ void processJob() {
AuthData exportAuthData = objectMapper.readValue(pair.getExportAuthData(), AuthData.class);
AuthData importAuthData = objectMapper.readValue(pair.getImportAuthData(), AuthData.class);

Optional<ExportInformation> exportInfo = Optional.ofNullable(job.exportInformation());

// Copy the data
copier.copy(exportAuthData, importAuthData, jobId);
copier.copy(exportAuthData, importAuthData, jobId, exportInfo);
logger.debug("Finished copy for jobId: " + jobId);

} catch (IOException | SecurityException e) {
Expand Down
Expand Up @@ -67,12 +67,9 @@ public PortabilityInMemoryDataCopier(Provider<Exporter> exporterProvider,
* Kicks off transfer job {@code jobId} from {@code exporter} to {@code importer}.
*/
@Override
public void copy(AuthData exportAuthData, AuthData importAuthData, UUID jobId)
public void copy(AuthData exportAuthData, AuthData importAuthData, UUID jobId, Optional<ExportInformation> exportInfo)
throws IOException {
// Initial copy, starts off the process with no previous paginationData or containerResource
// information
Optional<ExportInformation> emptyExportInfo = Optional.empty();
copyHelper(jobId, exportAuthData, importAuthData, emptyExportInfo);
copyHelper(jobId, exportAuthData, importAuthData, exportInfo);
}

/**
Expand Down
Expand Up @@ -19,6 +19,9 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.datatransferproject.types.common.ExportInformation;

import javax.annotation.Nullable;

/** Request to create a transfer job. */
@ApiModel(description = "A request to create a data transfer job")
Expand All @@ -28,6 +31,7 @@ public class CreateTransferJob {
private final String exportCallbackUrl;
private final String importCallbackUrl;
private final String dataType;
private final ExportInformation exportInformation;
private final String encryptionScheme;

@JsonCreator
Expand All @@ -37,12 +41,14 @@ public CreateTransferJob(
@JsonProperty(value = "exportCallbackUrl", required = true) String exportCallbackUrl,
@JsonProperty(value = "importCallbackUrl", required = true) String importCallbackUrl,
@JsonProperty(value = "dataType", required = true) String dataType,
@JsonProperty(value = "exportInformation", required = false) ExportInformation exportInformation,
@JsonProperty(value = "encryptionScheme", required = true) String encryptionScheme) {
this.exportService = exportService;
this.importService = importService;
this.exportCallbackUrl = exportCallbackUrl;
this.importCallbackUrl = importCallbackUrl;
this.dataType = dataType;
this.exportInformation = exportInformation;
this.encryptionScheme = encryptionScheme;
}

Expand Down Expand Up @@ -74,6 +80,12 @@ public String getDataType() {
return dataType;
}

@Nullable
@ApiModelProperty(value = "The optional export information")
public ExportInformation getExportInformation() {
return exportInformation;
}

@ApiModelProperty(value = "The encryption scheme to use", dataType = "string", required = true)
public String getEncryptionScheme() {
return encryptionScheme;
Expand Down
Expand Up @@ -35,6 +35,7 @@ public void verifySerializeDeserialize() throws Exception {
"https://localhost:3000/callback/testSource",
"https://localhost:3000/callback/testDestination",
"PHOTOS",
null,
"cleartext"));

CreateTransferJob deserialized = objectMapper.readValue(serialized, CreateTransferJob.class);
Expand Down
@@ -1,9 +1,23 @@
package org.datatransferproject.types.common.models;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.datatransferproject.types.common.models.calendar.CalendarContainerResource;
import org.datatransferproject.types.common.models.mail.MailContainerResource;
import org.datatransferproject.types.common.models.photos.PhotosContainerResource;
import org.datatransferproject.types.common.models.tasks.TaskContainerResource;

/**
* A resource that contains data items such as a photo album or song list.
*
* <p>Concrete subtypes must use {@link com.fasterxml.jackson.annotation.JsonTypeName} to specify a
* type discriminator used for deserialization.
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
@JsonSubTypes.Type(PhotosContainerResource.class),
@JsonSubTypes.Type(MailContainerResource.class),
@JsonSubTypes.Type(CalendarContainerResource.class),
@JsonSubTypes.Type(TaskContainerResource.class)
})
public abstract class ContainerResource extends DataModel {}

0 comments on commit 4452711

Please sign in to comment.