Package com.rackspacecloud.client.cloudfiles.sample

Source Code of com.rackspacecloud.client.cloudfiles.sample.FilesCopy

/*
* See COPYING for license information.
*/

package com.rackspacecloud.client.cloudfiles.sample;

import org.apache.commons.cli.*;
import org.apache.commons.lang.SystemUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.http.HttpException;

import org.apache.log4j.Logger;

import com.rackspacecloud.client.cloudfiles.FilesAuthorizationException;
import com.rackspacecloud.client.cloudfiles.FilesClient;
import com.rackspacecloud.client.cloudfiles.FilesConstants;
import com.rackspacecloud.client.cloudfiles.FilesException;
import com.rackspacecloud.client.cloudfiles.FilesObject;

import java.io.*;
import java.util.zip.*;
import java.util.*;
import java.security.NoSuchAlgorithmException;

public class FilesCopy
{
  private static final Logger logger = Logger.getLogger(FilesCopy.class);

  private static final String ZIPEXTENSION = ".zip";

  private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir();

  public static void main (String args[]) throws NoSuchAlgorithmException, FilesException
  {
    //Build the command line options
    Options options = addCommandLineOptions ();

    if (args.length <= 0)
      printHelp (options);

    CommandLineParser parser = new GnuParser();
    try
    {
      // parse the command line arguments
      CommandLine line = parser.parse( options, args );

      if (line.hasOption("help"))
        printHelp (options);

      if (line.hasOption("file") && line.hasOption("folder"))
      {
        System.err.println ("Can not use both -file and -folder on the command line at the same time.");
        System.exit(-1);
      }//if (line.hasOption("file") && line.hasOption("folder"))

      if (line.hasOption("download"))
      {
        if (line.hasOption("folder") )
        {
          String localFolder = FilenameUtils.normalize( line.getOptionValue("folder") );
          String containerName = null;   
          if (StringUtils.isNotBlank(localFolder))
          {
            File localFolderObj = new File (localFolder);
            if (localFolderObj.exists() && localFolderObj.isDirectory())
            {
              if (line.hasOption("container"))
              {
                containerName = line.getOptionValue("container");
                if (!StringUtils.isNotBlank(containerName))
                {
                  System.err.println ("You must provide a valid value for the  Container to upload to !");
                  System.exit (-1);
                }//if (!StringUtils.isNotBlank(ontainerName))                           
              }
              else
              {
                System.err.println ("You must provide the -container for a copy operation to work as expected.");
                System.exit (-1);
              }

              System.out.println ("Downloading all objects from: "+containerName+ " to local folder: "+ localFolder);

              getContainerObjects (localFolderObj, containerName);

            }
            else
            {
              if ( !localFolderObj.exists() )
              {
                System.err.println ("The local folder: "+ localFolder + " does not exist.  Create it first and then run this command.");
              }

              if ( !localFolderObj.isDirectory() )
              {
                System.err.println ("The local folder name supplied : "+ localFolder + " is not a folder !");
              }

              System.exit (-1);
            }
          }
        }
        System.exit (0);
      }//if (line.hasOption("download"))


      if (line.hasOption("folder"))
      {
        String containerName = null;
        String folderPath = null;

        if (line.hasOption("container"))
        {
          containerName = line.getOptionValue("container");
          if (!StringUtils.isNotBlank(containerName))
          {
            System.err.println ("You must provide a valid value for the  Container to upload to !");
            System.exit (-1);
          }//if (!StringUtils.isNotBlank(containerName))

        }
        else
        {
          System.err.println ("You must provide the -container for a copy operation to work as expected.");
          System.exit (-1);
        }

        folderPath = line.getOptionValue("folder");
        if (StringUtils.isNotBlank(folderPath))
        {
          File folder = new File ( FilenameUtils.normalize (folderPath) );
          if (folder.isDirectory())
          {
            if (line.hasOption("z"))
            {
              System.out.println ("Zipping: "+folderPath);
              System.out.println ("Nested folders are ignored !");

              File zipedFolder = zipFolder(folder);
              String mimeType = FilesConstants.getMimetype(ZIPEXTENSION);   
              copyToCreateContainerIfNeeded (zipedFolder, mimeType, containerName);
            }
            else
            {
              File [] files = folder.listFiles();
              for (File f: files)
              {
                String mimeType = FilesConstants.getMimetype(FilenameUtils.getExtension(f.getName()));
                System.out.println ("Uploading :"+f.getName()+" to "+folder.getName());
                copyToCreateContainerIfNeeded (f, mimeType, containerName);
                System.out.println ("Upload :"+f.getName()+" to "+folder.getName()+" completed.");
              }
            }
          }
          else
          {
            System.err.println ("You must provide a valid folder value for the -folder option !");
            System.err.println ("The value provided is: "+FilenameUtils.normalize (folderPath));
            System.exit (-1);
          }

        }
      }//if (line.hasOption("folder"))

      if (line.hasOption("file"))
      {
        String containerName = null;
        String fileNamePath = null;

        if (line.hasOption("container"))
        {
          containerName = line.getOptionValue("container");
          if (!StringUtils.isNotBlank(containerName) || containerName.indexOf('/') != -1)
          {
            System.err.println ("You must provide a valid value for the  Container to upload to !");
            System.exit (-1);
          }//if (!StringUtils.isNotBlank(containerName))
        }
        else
        {
          System.err.println ("You must provide the -container for a copy operation to work as expected.");
          System.exit (-1);
        }

        fileNamePath = line.getOptionValue("file");
        if (StringUtils.isNotBlank(fileNamePath))
        {
          String fileName = FilenameUtils.normalize (fileNamePath);
          String fileExt = FilenameUtils.getExtension(fileNamePath);
          String mimeType = FilesConstants.getMimetype(fileExt);
          File file = new File (fileName);   

          if (line.hasOption("z"))
          {
            logger.info("Zipping "+fileName);
            if (!file.isDirectory())
            {
              File zippedFile = zipFile(file);
              mimeType = FilesConstants.getMimetype(ZIPEXTENSION);
              copyTo (zippedFile, mimeType, containerName);
              zippedFile.delete();   
            }

          }//if (line.hasOption("z"))
          else
          {

            logger.info("Uploading "+fileName+ ".");
            if (!file.isDirectory())
              copyTo (file, mimeType, containerName);                       
            else
            {
              System.err.println ("The path you provided is a folder.  For uploading folders use the -folder option.");
              System.exit (-1);
            }
          }
        }//if (StringUtils.isNotBlank(file))
        else
        {
          System.err.println ("You must provide a valid value for the file to upload !");
          System.exit (-1);
        }
      }//if (line.hasOption("file"))
    }//end try       
    catch( ParseException err )
    {
      System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() );
      err.printStackTrace(System.err);
    }//catch( ParseException err )
    catch (FilesAuthorizationException err)
    {
      logger.fatal("FilesAuthorizationException : Failed to login to your  account !"+ err);
      System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() );
    }//catch (FilesAuthorizationException err)

    catch ( Exception err)
    {
      logger.fatal("IOException : "+ err);
      System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() );
    }//catch ( IOException err)
  }

  public static void getContainerObjects (File localFolder, String containerName) throws IOException, HttpException, FilesAuthorizationException, NoSuchAlgorithmException, FilesException
  {
    FilesClient client = new FilesClient();
    if ( client.login() )
    {
      if (client.containerExists(containerName))
      {
        List<FilesObject> objects = client.listObjects(containerName);
        for (FilesObject obj: objects)
        {
          System.out.println ("\t"+StringUtils.rightPad(obj.getName (), 35)+ obj.getSizeString());
          File localFile = new File ( FilenameUtils.concat(localFolder.getAbsolutePath(), obj.getName()) );
          obj.writeObjectToFile (localFile);
        }//for (Object obj: objects)
      }
      else
      {
        logger.fatal("The  container: "+containerName+" does not exist.");
        System.out.println ("The  container: "+containerName+" does not exist!");
        System.exit (0);
      }
    }//if ( client.login() )
  }

  /**
   *
   * @param file
   * @param mimeType
   * @param containerName
   * @throws IOException
   * @throws HttpException
   * @throws NoSuchAlgorithmException
   * @throws FilesException
   */
  private static void copyToCreateContainerIfNeeded (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException
  {
    FilesClient client = new FilesClient();
    if ( client.login() )
    {
      if (client.containerExists(containerName))
      {
        logger.info ("Copying files to "+containerName);
        copyTo (file, mimeType, containerName);
      }
      else
      {
        logger.warn("The  container: "+containerName+" does not exist.  Creating it first before placing objects into it.");
        System.out.println ("The  container: "+containerName+" does not exist.  Creating it first before placing objects into it.");
        client.createContainer(containerName);
        copyTo (file, mimeType, containerName);   
      }

    }
  }

  /**
   *
   * @param file
   * @param mimeType
   * @param containerName
   * @throws IOException
   * @throws HttpException
   * @throws NoSuchAlgorithmException
   * @throws FilesException
   */
  private static void copyTo (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException
  {
    FilesClient client = new FilesClient();
    if ( client.login() )
    {
      if (client.containerExists(containerName))
        client.storeObject(containerName, file, mimeType);               
      else
      {
        logger.info("The  container: "+containerName+" does not exist.  Create it first before placing objects into it.");
        System.out.println ("The  container: "+containerName+" does not exist.  Create it first before placing objects into it.");
        System.exit (0);
      }

    }//if ( client.login() )
  }

  /**
   *
   * @param folder
   * @return null if the input is not a folder otherwise a zip file containing all the files in the folder with nested folders skipped.
   * @throws IOException
   */
  public static File zipFolder (File folder) throws IOException
  {
    byte[] buf = new byte[1024];
    int len;

    // Create the ZIP file
    String filenameWithZipExt = folder.getName()+ZIPEXTENSION;
    File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt ));

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile));

    if (folder.isDirectory())
    {
      File [] files = folder.listFiles();

      for (File f: files)
      {
        if (!f.isDirectory())
        {
          FileInputStream in = new FileInputStream(f);

          // Add ZIP entry to output stream.
          out.putNextEntry(new ZipEntry(f.getName()));

          // Transfer bytes from the file to the ZIP file
          while ((len = in.read(buf)) > 0)
          {
            out.write(buf, 0, len);
          }

          // Complete the entry
          out.closeEntry();
          in.close();
        }
        else
          logger.warn ("Skipping nested folder: "+f.getAbsoluteFile());
      }

      out.flush();
      out.close();
    }
    else
    {
      logger.warn ("The folder name supplied is not a folder!");
      System.err.println("The folder name supplied is not a folder!");
      return null;
    }

    return zippedFile;
  }

  public static File zipFile (File f) throws IOException
  {
    byte[] buf = new byte[1024];
    int len;

    // Create the ZIP file
    String filenameWithZipExt = f.getName()+ZIPEXTENSION;
    File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt ));

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile));
    FileInputStream in = new FileInputStream(f);

    // Add ZIP entry to output stream.
    out.putNextEntry(new ZipEntry(f.getName()));

    // Transfer bytes from the file to the ZIP file
    while ((len = in.read(buf)) > 0)
    {
      out.write(buf, 0, len);
    }

    // Complete the entry
    out.closeEntry();
    out.flush();

    in.close();
    out.close();

    return zippedFile;
  }

  private static void printHelp (Options options)
  {
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp( "List -file filename -container ContainerName [-z]", options );
  }//private static void printHelp ()   

  @SuppressWarnings("static-access")
  private static Options addCommandLineOptions ()
  {
    Option help = new Option( "help", "print this message" );

    Option folder = OptionBuilder.withArgName("folder")
    .hasArg (true)
    .withDescription ("Name of folder to upload.  Only top level objects that are not folders will be uploaded.")
    .create ("folder");

    Option file = OptionBuilder.withArgName("file")
    .hasArg (true)
    .withDescription ("Name of file to upload to .")
    .create ("file");

    Option container = OptionBuilder.withArgName("container")
    .hasArg (true)
    .withDescription ("Name of container to place objects into.")
    .create ("container");

    Option zip = new Option ("z","zip", false, "Compress the object being placed into . This option can be used with other options e.g. -tar");
//    Option tar = new Option ("t","tar", false, "Create a tar of the folder. Using this option without a -folder has no effect !");
    Option download = new Option ("d","download", false, "Copy files from  to the local system.  Must be used in conjunction to -folder -file -container");       

    Options options = new Options();

    options.addOption(folder);
    options.addOption(file);
    options.addOption(zip);
    options.addOption(help);
    options.addOption(container);
    //options.addOption(tar);
    options.addOption(download);   

    return options;
  }
}
TOP

Related Classes of com.rackspacecloud.client.cloudfiles.sample.FilesCopy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.