
/**
 * AmazonS3CallbackHandler.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.5.1  Built on : Oct 19, 2009 (10:59:00 EDT)
 */

    package com.amazon.s3.client;

    /**
     *  AmazonS3CallbackHandler Callback class, Users can extend this class and implement
     *  their own receiveResult and receiveError methods.
     */
    public abstract class AmazonS3CallbackHandler{



    protected Object clientData;

    /**
    * User can pass in any object that needs to be accessed once the NonBlocking
    * Web service call is finished and appropriate method of this CallBack is called.
    * @param clientData Object mechanism by which the user can pass in user data
    * that will be avilable at the time this callback is called.
    */
    public AmazonS3CallbackHandler(Object clientData){
        this.clientData = clientData;
    }

    /**
    * Please use this constructor if you don't want to set any clientData
    */
    public AmazonS3CallbackHandler(){
        this.clientData = null;
    }

    /**
     * Get the client data
     */

     public Object getClientData() {
        return clientData;
     }

        
           /**
            * auto generated Axis2 call back method for getBucketLoggingStatus method
            * override this method for handling normal response from getBucketLoggingStatus operation
            */
           public void receiveResultgetBucketLoggingStatus(
                    com.amazon.s3.client.AmazonS3Stub.GetBucketLoggingStatusResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from getBucketLoggingStatus operation
           */
            public void receiveErrorgetBucketLoggingStatus(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for copyObject method
            * override this method for handling normal response from copyObject operation
            */
           public void receiveResultcopyObject(
                    com.amazon.s3.client.AmazonS3Stub.CopyObjectResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from copyObject operation
           */
            public void receiveErrorcopyObject(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for getBucketAccessControlPolicy method
            * override this method for handling normal response from getBucketAccessControlPolicy operation
            */
           public void receiveResultgetBucketAccessControlPolicy(
                    com.amazon.s3.client.AmazonS3Stub.GetBucketAccessControlPolicyResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from getBucketAccessControlPolicy operation
           */
            public void receiveErrorgetBucketAccessControlPolicy(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for listBucket method
            * override this method for handling normal response from listBucket operation
            */
           public void receiveResultlistBucket(
                    com.amazon.s3.client.AmazonS3Stub.ListBucketResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from listBucket operation
           */
            public void receiveErrorlistBucket(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for putObject method
            * override this method for handling normal response from putObject operation
            */
           public void receiveResultputObject(
                    com.amazon.s3.client.AmazonS3Stub.PutObjectResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from putObject operation
           */
            public void receiveErrorputObject(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for createBucket method
            * override this method for handling normal response from createBucket operation
            */
           public void receiveResultcreateBucket(
                    com.amazon.s3.client.AmazonS3Stub.CreateBucketResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from createBucket operation
           */
            public void receiveErrorcreateBucket(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for listAllMyBuckets method
            * override this method for handling normal response from listAllMyBuckets operation
            */
           public void receiveResultlistAllMyBuckets(
                    com.amazon.s3.client.AmazonS3Stub.ListAllMyBucketsResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from listAllMyBuckets operation
           */
            public void receiveErrorlistAllMyBuckets(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for getObject method
            * override this method for handling normal response from getObject operation
            */
           public void receiveResultgetObject(
                    com.amazon.s3.client.AmazonS3Stub.GetObjectResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from getObject operation
           */
            public void receiveErrorgetObject(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for deleteBucket method
            * override this method for handling normal response from deleteBucket operation
            */
           public void receiveResultdeleteBucket(
                    com.amazon.s3.client.AmazonS3Stub.DeleteBucketResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from deleteBucket operation
           */
            public void receiveErrordeleteBucket(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for setBucketLoggingStatus method
            * override this method for handling normal response from setBucketLoggingStatus operation
            */
           public void receiveResultsetBucketLoggingStatus(
                    com.amazon.s3.client.AmazonS3Stub.SetBucketLoggingStatusResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from setBucketLoggingStatus operation
           */
            public void receiveErrorsetBucketLoggingStatus(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for getObjectAccessControlPolicy method
            * override this method for handling normal response from getObjectAccessControlPolicy operation
            */
           public void receiveResultgetObjectAccessControlPolicy(
                    com.amazon.s3.client.AmazonS3Stub.GetObjectAccessControlPolicyResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from getObjectAccessControlPolicy operation
           */
            public void receiveErrorgetObjectAccessControlPolicy(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for deleteObject method
            * override this method for handling normal response from deleteObject operation
            */
           public void receiveResultdeleteObject(
                    com.amazon.s3.client.AmazonS3Stub.DeleteObjectResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from deleteObject operation
           */
            public void receiveErrordeleteObject(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for setBucketAccessControlPolicy method
            * override this method for handling normal response from setBucketAccessControlPolicy operation
            */
           public void receiveResultsetBucketAccessControlPolicy(
                    com.amazon.s3.client.AmazonS3Stub.SetBucketAccessControlPolicyResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from setBucketAccessControlPolicy operation
           */
            public void receiveErrorsetBucketAccessControlPolicy(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for setObjectAccessControlPolicy method
            * override this method for handling normal response from setObjectAccessControlPolicy operation
            */
           public void receiveResultsetObjectAccessControlPolicy(
                    com.amazon.s3.client.AmazonS3Stub.SetObjectAccessControlPolicyResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from setObjectAccessControlPolicy operation
           */
            public void receiveErrorsetObjectAccessControlPolicy(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for putObjectInline method
            * override this method for handling normal response from putObjectInline operation
            */
           public void receiveResultputObjectInline(
                    com.amazon.s3.client.AmazonS3Stub.PutObjectInlineResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from putObjectInline operation
           */
            public void receiveErrorputObjectInline(java.lang.Exception e) {
            }
                
           /**
            * auto generated Axis2 call back method for getObjectExtended method
            * override this method for handling normal response from getObjectExtended operation
            */
           public void receiveResultgetObjectExtended(
                    com.amazon.s3.client.AmazonS3Stub.GetObjectExtendedResponse result
                        ) {
           }

          /**
           * auto generated Axis2 Error handler
           * override this method for handling error response from getObjectExtended operation
           */
            public void receiveErrorgetObjectExtended(java.lang.Exception e) {
            }
                


    }
    