StorageService.java :  » Client » gs4android » at » theengine » android » botstorage » Android Open Source

Android Open Source » Client » gs4android 
gs4android » at » theengine » android » botstorage » StorageService.java
package at.theengine.android.botstorage;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.HttpClient;   
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.DefaultHttpClient; 
import org.xml.sax.SAXException;

import android.R.xml;
import android.content.Context;
import android.util.Log;
import at.theengine.android.botstorage.gsobjects.Bucket;
import at.theengine.android.botstorage.gsobjects.GsObject;
import at.theengine.android.botstorage.gsobjects.GsObjects;
import at.theengine.android.botstorage.gsobjects.GsObject.ObjectType;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.parsers.ParserConfigurationException;

public class StorageService {
  
  //android specific objects
  private static final String TAG = "BotStorage";
  private Context ctx; //TODO use this

  private static final String HTTP = "http://";
  private static final String HTTPS = "https://";
  public static String ENDPOINT = "commondatastorage.googleapis.com";  
    
  //Google Auth
  private String key;
  private String secret;
  
  //connection objects
  private HttpClient client;
  
  //setting key an secret for auth
  public StorageService(String key,String secret){
    this.key = key;
    this.secret = secret;
  }
  
  public Bucket[] getBuckets() throws BotStorageException{  
        //build request
    client = new DefaultHttpClient();
    
    HttpGet request;
    try { 
      request = buildGetRequest(ENDPOINT, "/","","");
    } catch (Exception e) {
            Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
        }
    
        HttpResponse response; 
        
        String bucketsXML;
        
        //execute Request
        try {  
            response = client.execute(request);
            byte[] b = new byte[(int) response.getEntity().getContentLength()];
            int i = response.getEntity().getContent().read(b,0,(int) response.getEntity().getContentLength());
            bucketsXML = new String(b);
        } catch (Exception e) {  
          bucketsXML = "";
            Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
        }
        
        client.getConnectionManager().shutdown();  
        client = null;
        
        Bucket[] buckets;
        
        //Create Bucket Objects
        try {
      buckets = GsObjectBuilder.buildBucketObjects(bucketsXML);
    } catch (SAXException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    } catch (IOException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    } catch (ParserConfigurationException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    }
        
        return buckets;
    } 
  
  public GsObjects getGsObjects(String bucket,String path) throws BotStorageException{  
        //build request
    client = new DefaultHttpClient();
    
    HttpGet request;
    try { 
      request = buildGetRequest(ENDPOINT, "/" + bucket,"?delimiter=/&prefix=" + path,"");
    } catch (Exception e) {
            Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
        }
    
        HttpResponse response; 
        
        String objectXml;
        
        //execute Request
        try {  
            response = client.execute(request);
            byte[] b = new byte[(int) response.getEntity().getContentLength()];
            int i = response.getEntity().getContent().read(b,0,(int) response.getEntity().getContentLength());
            objectXml = new String(b);
        } catch (Exception e) {  
          objectXml = "";
            Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
        }
        
        client.getConnectionManager().shutdown();  
        client = null;
        
        GsObjects gsObjects;
        
        //Create Bucket Objects
        try {
          gsObjects = GsObjectBuilder.buildGsObjects(objectXml);
    } catch (SAXException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    } catch (IOException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    } catch (ParserConfigurationException e) {
      Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
    }
        
        return gsObjects;
    }
  
  public InputStream downloadGsFile(String bucket,String path) throws BotStorageException{  
        //build request
    client = new DefaultHttpClient();
    
    HttpGet request;
    try { 
      request = buildGetRequest(bucket.substring(0,bucket.length()-1) + "." + ENDPOINT,path,"","/" + bucket.substring(0,bucket.length()-1));
    } catch (Exception e) {
            Log.e(TAG,e.getMessage());
            throw new BotStorageException(e.getMessage());
        }
    
        HttpResponse response; 
        
        InputStream data;
        
        //execute Request
        try {  
            response = client.execute(request);
            data = response.getEntity().getContent();
        } catch (Exception e) {
            throw new BotStorageException(e.getMessage());
        }
        return data;
    }
  
    private HttpGet buildGetRequest(String host,String path,String queryString,String bucket) throws Exception{
      HttpGet request;
      request = new HttpGet(HTTP + host + path + queryString);
      
      try {
      //build date 
      Date d = new Date();
    SimpleDateFormat dateFormatGmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
    dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    String date = dateFormatGmt.format(d);
      
        request.addHeader("Host", host); 
        request.addHeader("Date", date); 
        String auth = "GOOG1 " + key + ":" + getSignature("GET",host,date,"","",bucket + path);
        request.addHeader("Authorization", auth); 
        request.addHeader("Content-Length","0");
        
        Log.i(TAG,"HTTP GET REQUEST:" + host + "," + String.valueOf(date) + "," + auth + "," + "0");

      } catch (Exception e) {
        Log.e(TAG,e.getMessage());
        throw e;
      }
        
      return request;
    }
    
    private String getSignature(String method,String host,String date,String contentType,String extensionHeaders,String path) throws Exception{
      String msg = getMsgTobeSigned(method,host,date,contentType,extensionHeaders,path);
      
      String signed = "";
      try {
        // get an hmac_sha1 key from the raw key bytes
        SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), "HmacSHA1");

        // get an hmac_sha1 Mac instance and initialize with the signing key
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signingKey);

        // compute the hmac on input data bytes
        byte[] rawHmac = mac.doFinal(msg.getBytes());

        // base64-encode the hmac
        signed = Base64.encodeBytes(rawHmac, 0, rawHmac.length);

        } catch (Exception e) {
          Log.e(TAG,e.getMessage());
          throw e;
        }
        
    return signed;
    }
    
    private String getMsgTobeSigned(String method,String host,String date,String contentType,String extensionHeaders,String path){
      StringBuilder sbMsg = new StringBuilder();
      
      //Start with method
      sbMsg.append(method);
      sbMsg.append("\n");
      
      //TODO: check what this empty line is for
      sbMsg.append("\n");
      
      //content type
      sbMsg.append(contentType);
      sbMsg.append("\n");
      
      //content type
      sbMsg.append(date);
      sbMsg.append("\n");
      
      //content type
      sbMsg.append(extensionHeaders);
      
      //path
      sbMsg.append(path);
      
      return sbMsg.toString();
    }
    
    
    
    
    
//    public void Test(String key, String secret){  
//        HttpClient client = new DefaultHttpClient();
//        
//        HttpGet request = new HttpGet(HTTP + ENDPOINT); 
//        Date d = new Date();
//      SimpleDateFormat  sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
//      String date = sdf.format(d);
//        request.addHeader("Host", ENDPOINT); 
//        request.addHeader("Date", date); 
//        String auth = "GOOG1 " + key + ":" + getSignature(date,secret);
//        request.addHeader("Authorization", auth); 
//        request.addHeader("Content-Length","0");
//        
//        HttpResponse response; 
//        try {  
//            response = client.execute(request);  
//            response.toString();
//            byte[] b = new byte[(int) response.getEntity().getContentLength()];
//            int i = response.getEntity().getContent().read(b,0,(int) response.getEntity().getContentLength());
//            String s = new String(b);
//            Log.i("HALLO!",s);
//        } catch (ClientProtocolException e) {  
//            e.printStackTrace();  
//        } catch (IOException e) {  
//            e.printStackTrace();  
//        }  
//        client.getConnectionManager().shutdown();  
//    } 
//    
//    private String getSignature(String date,String secret){
//      
//      String message = "GET\n\n\n" + date + "\n" + "/";
//      String signed = "";
//      
//      try {
//
//        // get an hmac_sha1 key from the raw key bytes
//        SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), "HmacSHA1");
//
//        // get an hmac_sha1 Mac instance and initialize with the signing key
//        Mac mac = Mac.getInstance("HmacSHA1");
//        mac.init(signingKey);
//
//        // compute the hmac on input data bytes
//        byte[] rawHmac = mac.doFinal(message.getBytes());
//
//        // base64-encode the hmac
//        signed = Base64.encodeBytes(rawHmac, 0, rawHmac.length);
//
//        } catch (Exception e) {
//        
//        }
//    
//    return signed;
//    }
  
  

}

java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.