All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.org.jets3t.service.multithread.S3ServiceSimpleMulti Maven / Gradle / Ivy

/*
 * jets3t : Java Extra-Tasty S3 Toolkit (for Amazon S3 online storage service)
 * This is a java.net project, see https://jets3t.dev.java.net/
 * 
 * Copyright 2006 James Murty
 * 
 * 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. 
 */
package org.jets3t.service.multithread;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.jets3t.service.S3Service;
import org.jets3t.service.S3ServiceException;
import org.jets3t.service.model.S3Bucket;
import org.jets3t.service.model.S3Object;

/**
 * S3 service wrapper that performs multiple S3 requests at a time using multi-threading and an
 * underlying thread-safe {@link S3Service} implementation. 
 * 

* This class provides a simplified interface to the {@link S3ServiceMulti} service. It will block while * doing its work, return the results of an operation when it is finished, and throw an exception if * anything goes wrong. *

* For a non-blocking multi-threading service that is more powerful, but also more complicated, * see {@link S3ServiceMulti}. * * @author James Murty */ public class S3ServiceSimpleMulti { private S3Service s3Service = null; /** * Construct a multi-threaded service based on an S3Service. * * @param s3Service * an S3Service implementation that will be used to perform S3 requests. This implementation * must be thread-safe. */ public S3ServiceSimpleMulti(S3Service s3Service) { this.s3Service = s3Service; } /** * Utility method to check an {@link S3ServiceEventAdaptor} for the occurrence of an error, and if * one is present to throw it. * * @param adaptor * @throws S3ServiceException */ protected void throwError(S3ServiceEventAdaptor adaptor) throws S3ServiceException { if (adaptor.wasErrorThrown()) { Throwable thrown = adaptor.getErrorThrown(); if (thrown instanceof S3ServiceException) { throw (S3ServiceException) thrown; } else { throw new S3ServiceException(thrown); } } } /** * Creates multiple buckets. * * @param buckets * the buckets to create. * @return * the created buckets. * @throws S3ServiceException */ public S3Bucket[] createBuckets(final S3Bucket[] buckets) throws S3ServiceException { final List bucketList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(CreateBucketsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { bucketList.addAll(Arrays.asList(event.getCreatedBuckets())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).createBuckets(buckets); throwError(adaptor); return (S3Bucket[]) bucketList.toArray(new S3Bucket[bucketList.size()]); } /** * Creates/uploads multiple objects. * * @param bucket * the bucket to create the objects in. * @param objects * the objects to create/upload. * @return * the created/uploaded objects. * @throws S3ServiceException */ public S3Object[] putObjects(final S3Bucket bucket, final S3Object[] objects) throws S3ServiceException { final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(CreateObjectsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getCreatedObjects())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).putObjects(bucket, objects); throwError(adaptor); return (S3Object[]) objectList.toArray(new S3Object[objectList.size()]); } /** * Copies multiple objects within or between buckets. * * @param sourceBucketName * the name of the bucket containing the objects that will be copied. * @param destinationBucketName * the name of the bucket to which the objects will be copied. The destination * bucket may be the same as the source bucket. * @param sourceObjectKeys * the key names of the objects that will be copied. * @param destinationObjects * objects that will be created by the copy operation. The AccessControlList * setting of each object will determine the access permissions of the * resultant object, and if the replaceMetadata flag is true the metadata * items in each object will also be applied to the resultant object. * @param replaceMetadata * if true, the metadata items in the destination objects will be stored * in S3 by using the REPLACE metadata copying option. If false, the metadata * items will be copied unchanged from the original objects using the COPY * metadata copying option.s */ public Map[] copyObjects(final String sourceBucketName, final String destinationBucketName, final String[] sourceObjectKeys, final S3Object[] destinationObjects, boolean replaceMetadata) throws S3ServiceException { final List resultsList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(CopyObjectsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { resultsList.addAll(Arrays.asList(event.getCopyResults())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).copyObjects(sourceBucketName, destinationBucketName, sourceObjectKeys, destinationObjects, replaceMetadata); throwError(adaptor); return (Map[]) resultsList.toArray(new Map[resultsList.size()]); } /** * Deletes multiple objects * * @param bucket * the bucket containing the objects to delete. * @param objects * the objects to delete. * @throws S3ServiceException */ public void deleteObjects(final S3Bucket bucket, final S3Object[] objects) throws S3ServiceException { final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(DeleteObjectsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getDeletedObjects())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).deleteObjects(bucket, objects); throwError(adaptor); } /** * Retrieves multiple objects (including details and data). * The objects' data will be stored in temporary files, and can be retrieved using * {@link S3Object#getDataInputStream()}. * * @param bucket * the bucket containing the objects. * @param objects * the objects to retrieve. * @return * the retrieved objects. * @throws S3ServiceException */ public S3Object[] getObjects(S3Bucket bucket, S3Object[] objects) throws S3ServiceException { DownloadPackage[] downloadPackages = new DownloadPackage[objects.length]; try { for (int i = 0; i < downloadPackages.length; i++) { // Create a temporary file for data, file will auto-delete on JVM exit. File tempFile = File.createTempFile("jets3t-", ".tmp"); tempFile.deleteOnExit(); downloadPackages[i] = new DownloadPackage(objects[i], tempFile); } } catch (IOException e) { throw new S3ServiceException("Unable to create temporary file to store object data", e); } final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(DownloadObjectsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getDownloadedObjects())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).downloadObjects(bucket, downloadPackages); throwError(adaptor); return (S3Object[]) objectList.toArray(new S3Object[objectList.size()]); } /** * Retrieves multiple objects (including details and data). * The objects' data will be stored in temporary files, and can be retrieved using * {@link S3Object#getDataInputStream()}. * * @param bucket * the bucket containing the objects. * @param objectKeys * the key names of the objects to retrieve. * @return * the retrieved objects. * * @throws S3ServiceException */ public S3Object[] getObjects(final S3Bucket bucket, final String[] objectKeys) throws S3ServiceException { S3Object[] objects = new S3Object[objectKeys.length]; for (int i = 0; i < objectKeys.length; i++) { objects[i] = new S3Object(objectKeys[i]); } return getObjects(bucket, objects); } /** * Retrieves details of multiple objects (details only, no data) * * @param bucket * the bucket containing the objects. * @param objects * the objects to retrieve. * @return * objects populated with the details retrieved. * @throws S3ServiceException */ public S3Object[] getObjectsHeads(S3Bucket bucket, S3Object[] objects) throws S3ServiceException { String[] objectKeys = new String[objects.length]; for (int i = 0; i < objects.length; i++) { objectKeys[i] = objects[i].getKey(); } return getObjectsHeads(bucket, objectKeys); } /** * Retrieves details of multiple objects (details only, no data) * * @param bucket * the bucket containing the objects. * @param objectKeys * the key names of the objects to retrieve. * @return * objects populated with the details retrieved. * @throws S3ServiceException */ public S3Object[] getObjectsHeads(final S3Bucket bucket, final String[] objectKeys) throws S3ServiceException { final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(GetObjectHeadsEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getCompletedObjects())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).getObjectsHeads(bucket, objectKeys); throwError(adaptor); return (S3Object[]) objectList.toArray(new S3Object[objectList.size()]); } /** * Retrieves Access Control List (ACL) settings for multiple objects. * * @param bucket * the bucket containing the objects. * @param objects * the objects whose ACLs will be retrieved. * @return * objects including the ACL information retrieved. * @throws S3ServiceException */ public S3Object[] getObjectACLs(final S3Bucket bucket, final S3Object[] objects) throws S3ServiceException { final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(LookupACLEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getObjectsWithACL())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).getObjectACLs(bucket, objects); throwError(adaptor); return (S3Object[]) objectList.toArray(new S3Object[objectList.size()]); } /** * Updates/sets Access Control List (ACL) settings for multiple objects. * * @param bucket * the bucket containing the objects. * @param objects * objects containing ACL settings that will be updated/set. * @return * objects whose ACL settings were updated/set. * @throws S3ServiceException */ public S3Object[] putACLs(final S3Bucket bucket, final S3Object[] objects) throws S3ServiceException { final List objectList = new ArrayList(); S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor() { public void s3ServiceEventPerformed(UpdateACLEvent event) { super.s3ServiceEventPerformed(event); if (ServiceEvent.EVENT_IN_PROGRESS == event.getEventCode()) { objectList.addAll(Arrays.asList(event.getObjectsWithUpdatedACL())); } }; }; (new S3ServiceMulti(s3Service, adaptor)).putACLs(bucket, objects); throwError(adaptor); return (S3Object[]) objectList.toArray(new S3Object[objectList.size()]); } /** * A convenience method to download multiple objects from S3 to pre-existing output streams, which * is particularly useful for downloading objects to files. * * @param bucket * the bucket containing the objects * @param downloadPackages * an array of download package objects that manage the output of data for an S3Object. * * @throws S3ServiceException */ public void downloadObjects(final S3Bucket bucket, final DownloadPackage[] downloadPackages) throws S3ServiceException { S3ServiceEventAdaptor adaptor = new S3ServiceEventAdaptor(); (new S3ServiceMulti(s3Service, adaptor)).downloadObjects(bucket, downloadPackages); throwError(adaptor); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy