org.jclouds.examples.glacier.MainApp.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.examples.glacier.MainApp.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.jclouds.examples.glacier;

import static com.google.common.net.MediaType.PLAIN_TEXT_UTF_8;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.UUID;

import org.jclouds.ContextBuilder;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.options.PutOptions;
import org.jclouds.glacier.GlacierClient;
import org.jclouds.glacier.blobstore.strategy.internal.BasePollingStrategy;
import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest;
import org.jclouds.glacier.domain.JobRequest;
import org.jclouds.io.ByteSources;
import org.jclouds.io.Payload;
import org.jclouds.io.payloads.ByteSourcePayload;
import org.jclouds.util.Strings2;

import com.google.common.base.Charsets;
import com.google.common.base.Throwables;
import com.google.common.io.ByteSource;
import com.google.common.io.CharStreams;

/**
 * Demonstrates the use of Glacier provider and BlobStore.
 *
 * Usage is: java MainApp "identity" "credential"
 */
public class MainApp {
    private static final long MiB = 1L << 20;

    public static void main(String[] args) throws IOException {
        if (args.length < 2) {
            throw new IllegalArgumentException(
                    "Invalid number of parameters. Syntax is: \"identity\" \"credential\"");
        }

        String identity = args[0];
        String credentials = args[1];

        // Init
        BlobStoreContext context = ContextBuilder.newBuilder("glacier").credentials(identity, credentials)
                .buildView(BlobStoreContext.class);

        try {
            while (chooseOption(context))
                ;
        } finally {
            context.close();
        }
    }

    private static void putAndRetrieveBlobExample(BlobStore blobstore) throws IOException {
        // Create a container
        String containerName = "jclouds_putAndRetrieveBlobExample_" + UUID.randomUUID().toString();
        blobstore.createContainerInLocation(null, containerName); // Create a vault

        // Create a blob
        ByteSource payload = ByteSource.wrap("data".getBytes(Charsets.UTF_8));
        Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier
                .payload(payload).contentLength(payload.size()).build();

        // Put the blob in the container
        String blobId = blobstore.putBlob(containerName, blob);

        // Retrieve the blob
        Blob result = blobstore.getBlob(containerName, blobId);

        // Print the result
        InputStream is = result.getPayload().openStream();
        try {
            String data = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
            System.out.println("The retrieved payload is: " + data);
        } finally {
            is.close();
        }
    }

    private static void multipartUploadExample(BlobStore blobstore) throws IOException {
        // Create a container
        String containerName = "jclouds_multipartUploadExample_" + UUID.randomUUID().toString();
        blobstore.createContainerInLocation(null, containerName); // Create a vault

        // Create a blob
        ByteSource payload = buildData(16 * MiB);
        Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier
                .payload(payload).contentLength(payload.size()).build();

        // Create the PutOptions
        PutOptions options = PutOptions.Builder.multipart(true);

        // Put the blob in the container
        blobstore.putBlob(containerName, blob, options);
        System.out.println("The blob has been uploaded");
    }

    private static void interruptionExample(final BlobStore blobstore) throws IOException {
        // Create a container
        final String containerName = "jclouds_interruptionExample_" + UUID.randomUUID().toString();
        blobstore.createContainerInLocation(null, containerName); // Create a vault

        // Create a blob
        ByteSource payload = ByteSource.wrap("data".getBytes(Charsets.UTF_8));
        Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier
                .payload(payload).contentLength(payload.size()).build();

        // Put the blob in the container
        final String blobId = blobstore.putBlob(containerName, blob);

        // New thread
        Thread thread = new Thread() {
            public void run() {
                try {
                    blobstore.getBlob(containerName, blobId);
                } catch (RuntimeException e) {
                    System.out.println("The request was aborted");
                }
            }
        };

        // Start and interrupt the thread
        thread.start();
        thread.interrupt();
        try {
            thread.join();
        } catch (InterruptedException e) {
            Throwables.propagate(e);
        }
    }

    private static void providerExample(BlobStoreContext context) throws IOException {
        // Get the provider API
        GlacierClient client = context.unwrapApi(GlacierClient.class);

        // Create a vault
        final String vaultName = "jclouds_providerExample_" + UUID.randomUUID().toString();
        client.createVault(vaultName);

        // Upload an archive
        Payload payload = new ByteSourcePayload(buildData(16));
        payload.getContentMetadata().setContentType(PLAIN_TEXT_UTF_8.toString());
        payload.getContentMetadata().setContentLength(16L);
        String archiveId = client.uploadArchive(vaultName, payload);

        // Create an archive retrieval job request
        JobRequest archiveRetrievalJobRequest = ArchiveRetrievalJobRequest.builder().archiveId(archiveId)
                .description("retrieval job").build();

        // Initiate job
        String jobId = client.initiateJob(vaultName, archiveRetrievalJobRequest);
        try {
            // Poll until the job is done
            new BasePollingStrategy(client).waitForSuccess(vaultName, jobId);

            // Get the job output
            Payload result = client.getJobOutput(vaultName, jobId);

            // Print the result
            System.out.println("The retrieved payload is: " + Strings2.toStringAndClose(result.openStream()));
        } catch (InterruptedException e) {
            Throwables.propagate(e);
        }
    }

    public static boolean chooseOption(BlobStoreContext context) throws IOException {
        Scanner scan = new Scanner(System.in);
        System.out.println("");
        System.out.println("Glacier examples");
        System.out.println("1. Put and retrieve blob (~4-5 hours)");
        System.out.println("2. Multipart upload (~1-5 minutes)");
        System.out.println("3. Call interruption (~0-2 minutes)");
        System.out.println("4. Provider API (~4-5 hours)");
        System.out.println("5. Exit");
        System.out.print("Choose an option: ");
        try {
            switch (scan.nextInt()) {
            case 1:
                putAndRetrieveBlobExample(context.getBlobStore());
                break;
            case 2:
                multipartUploadExample(context.getBlobStore());
                break;
            case 3:
                interruptionExample(context.getBlobStore());
                break;
            case 4:
                providerExample(context);
                break;
            case 5:
                return false;
            default:
                System.out.println("Not a valid option");
                break;
            }
        } catch (InputMismatchException e) {
            System.out.println("Not a valid option");
        }
        return true;
    }

    private static ByteSource buildData(long size) {
        byte[] array = new byte[1024];
        Arrays.fill(array, (byte) 'a');
        return ByteSources.repeatingArrayByteSource(array).slice(0, size);
    }
}