/* * Copyright 2012-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file 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. */ package com.amazonaws.services.workdocs; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import com.amazonaws.SdkClientException; import com.amazonaws.annotation.SdkInternalApi; import com.amazonaws.annotation.ThreadSafe; import com.amazonaws.services.workdocs.model.DocumentSourceType; import com.amazonaws.services.workdocs.model.DocumentVersionStatus; import com.amazonaws.services.workdocs.model.GetDocumentRequest; import com.amazonaws.services.workdocs.model.GetDocumentResult; import com.amazonaws.services.workdocs.model.GetDocumentVersionRequest; import com.amazonaws.services.workdocs.model.GetDocumentVersionResult; import com.amazonaws.services.workdocs.model.InitiateDocumentVersionUploadRequest; import com.amazonaws.services.workdocs.model.InitiateDocumentVersionUploadResult; import com.amazonaws.services.workdocs.model.UpdateDocumentVersionRequest; import com.amazonaws.services.workdocs.model.UpdateDocumentVersionResult; import com.amazonaws.services.workdocs.model.UploadMetadata; import com.amazonaws.util.IOUtils; /** * High level synchronous utility for transferring content from and to Amazon WorkDocs. * ContentManager provides a simple API for uploading and downloading * documents to/from Amazon WorkDocs easily. * ContentManager, like all the client classes in the AWS SDK for Java, is thread safe. * *

* In order to use ContentManager: *

 * AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new AnonymousAWSCredentials());
 * AmazonWorkDocs client = AmazonWorkDocsClient.builder().withCredentials(credentialsProvider).withRegion(Regions.REGION).build();
 * ContentManager contentManager = ContentManagerBuilder.standard().withWorkDocsClient(client).withAuthenticationToken(authenticationToken).build();
 * GetDocumentStreamRequest request = new GetDocumentStreamRequest();
 * request.setDocumentId("doc-id");
 * InputStream inputStream = contentManager.getDocumentStream(request).getStream();
 * 
*/ @ThreadSafe @SdkInternalApi public class ContentManager { private final String authenticationToken; private final AmazonWorkDocs client; @SdkInternalApi ContentManager(final ContentManagerBuilder contentManagerBuilder) { if (contentManagerBuilder == null) { throw new IllegalArgumentException(); } AmazonWorkDocs client = contentManagerBuilder.getWorkDocsClient(); if (client == null) { throw new IllegalArgumentException("AmazonWorkDocs client must be specified."); } this.client = client; this.authenticationToken = contentManagerBuilder.getAuthenticationToken(); } @SdkInternalApi protected AmazonWorkDocs getWorkDocsClient() { return client; } /** * Gets document stream from WorkDocs. * If VersionId of GetDocumentStreamRequest is not specified, * then the latest version of specified document is retrieved. * Clients must close the stream once content is read. * * @param getDocumentStreamRequest Request specifying parameters of the operation. * @return Result containing stream of requested document content. */ public GetDocumentStreamResult getDocumentStream(final GetDocumentStreamRequest getDocumentStreamRequest) { String versionId = getDocumentStreamRequest.getVersionId(); if (versionId == null) { GetDocumentRequest getDocumentRequest = new GetDocumentRequest(); getDocumentRequest.setDocumentId(getDocumentStreamRequest.getDocumentId()); String requestAuthenticationToken = getDocumentStreamRequest.getAuthenticationToken(); if (requestAuthenticationToken != null) { getDocumentRequest.setAuthenticationToken(requestAuthenticationToken); } else { getDocumentRequest.setAuthenticationToken(authenticationToken); } GetDocumentResult result = client.getDocument(getDocumentRequest); versionId = result.getMetadata().getLatestVersionMetadata().getId(); } GetDocumentStreamResult getDocumentStreamResult = new GetDocumentStreamResult(getDocumentStreamRequest); getDocumentStreamResult.setVersionId(versionId); InputStream stream = getDocumentVersionStream(getDocumentStreamRequest.getDocumentId(), versionId); getDocumentStreamResult.setStream(stream); return getDocumentStreamResult; } private InputStream getDocumentVersionStream(String documentId, String versionId) { GetDocumentVersionRequest getDocumentVersionRequest = new GetDocumentVersionRequest(); getDocumentVersionRequest.setDocumentId(documentId); getDocumentVersionRequest.setVersionId(versionId); getDocumentVersionRequest.setFields("SOURCE"); getDocumentVersionRequest.setAuthenticationToken(authenticationToken); GetDocumentVersionResult result = client.getDocumentVersion(getDocumentVersionRequest); String downloadUrl = result.getMetadata().getSource().get(DocumentSourceType.ORIGINAL.name()); try { URL documentUrl = new URL(downloadUrl); return documentUrl.openStream(); } catch (IOException e) { throw new SdkClientException(e); } } /** * Uploads document stream to WorkDocs. * If document ID is specified, then it creates a new version under this document. * If document ID is not specified, then it creates a new document and uploads content to its only version.\ * Client must close the input stream once upload operation is complete. * * @param uploadDocumentStreamRequest Request specifying parameters of the operation. * @return Result containing metadata of the newly created document or version. */ public UploadDocumentStreamResult uploadDocumentStream(UploadDocumentStreamRequest uploadDocumentStreamRequest) { InputStream stream = uploadDocumentStreamRequest.getStream(); if (stream == null) { throw new IllegalArgumentException("InputStream must be specified."); } InitiateDocumentVersionUploadRequest initiateDocumentVersionUploadRequest = new InitiateDocumentVersionUploadRequest(); initiateDocumentVersionUploadRequest.setParentFolderId(uploadDocumentStreamRequest.getParentFolderId()); initiateDocumentVersionUploadRequest.setName(uploadDocumentStreamRequest.getDocumentName()); initiateDocumentVersionUploadRequest.setContentType(uploadDocumentStreamRequest.getContentType()); initiateDocumentVersionUploadRequest.setContentCreatedTimestamp(uploadDocumentStreamRequest.getContentCreatedTimestamp()); initiateDocumentVersionUploadRequest.setContentModifiedTimestamp(uploadDocumentStreamRequest.getContentModifiedTimestamp()); initiateDocumentVersionUploadRequest.setDocumentSizeInBytes(uploadDocumentStreamRequest.getDocumentSizeInBytes()); initiateDocumentVersionUploadRequest.setId(uploadDocumentStreamRequest.getDocumentId()); String requestAuthenticationToken = uploadDocumentStreamRequest.getAuthenticationToken(); if (requestAuthenticationToken != null) { initiateDocumentVersionUploadRequest.setAuthenticationToken(requestAuthenticationToken); } else { initiateDocumentVersionUploadRequest.setAuthenticationToken(authenticationToken); } InitiateDocumentVersionUploadResult result = client.initiateDocumentVersionUpload(initiateDocumentVersionUploadRequest); UploadMetadata uploadMetadata = result.getUploadMetadata(); String documentId = result.getMetadata().getId(); String versionId = result.getMetadata().getLatestVersionMetadata().getId(); String uploadUrl = uploadMetadata.getUploadUrl(); try { URL url = new URL(uploadUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("PUT"); connection.setRequestProperty("Content-Type", uploadDocumentStreamRequest.getContentType()); connection.setRequestProperty("x-amz-server-side-encryption", "AES256"); OutputStream outputStream = connection.getOutputStream(); IOUtils.copy(stream, outputStream); connection.getResponseCode(); } catch (MalformedURLException e) { throw new SdkClientException(e); } catch (IOException e) { throw new SdkClientException(e); } UpdateDocumentVersionRequest updateDocumentVersionRequest = new UpdateDocumentVersionRequest(); updateDocumentVersionRequest.setDocumentId(documentId); updateDocumentVersionRequest.setVersionId(versionId); updateDocumentVersionRequest.setVersionStatus(DocumentVersionStatus.ACTIVE); if (authenticationToken != null) { updateDocumentVersionRequest.setAuthenticationToken(authenticationToken); } UpdateDocumentVersionResult updateDocumentVersionResult = client.updateDocumentVersion(updateDocumentVersionRequest); UploadDocumentStreamResult uploadDocumentStreamResult = new UploadDocumentStreamResult( uploadDocumentStreamRequest); uploadDocumentStreamResult.setDocumentId(documentId); uploadDocumentStreamResult.setVersionId(versionId); return uploadDocumentStreamResult; } }