Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / BackupServerActivity.java @ 6c0d81f1

History | View | Annotate | Download (7.6 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.io.IOException;
4
import java.io.StringReader;
5

    
6
import javax.xml.parsers.FactoryConfigurationError;
7
import javax.xml.parsers.ParserConfigurationException;
8
import javax.xml.parsers.SAXParser;
9
import javax.xml.parsers.SAXParserFactory;
10

    
11
import org.apache.http.HttpResponse;
12
import org.apache.http.client.ClientProtocolException;
13
import org.apache.http.impl.client.BasicResponseHandler;
14
import org.xml.sax.InputSource;
15
import org.xml.sax.SAXException;
16
import org.xml.sax.XMLReader;
17

    
18
import com.rackspace.cloud.servers.api.client.Backup;
19
import com.rackspace.cloud.servers.api.client.CloudServersException;
20
import com.rackspace.cloud.servers.api.client.Server;
21
import com.rackspace.cloud.servers.api.client.ServerManager;
22
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
23
import com.rackspace.cloud.servers.api.client.parsers.CloudServersFaultXMLParser;
24

    
25
import android.app.AlertDialog;
26
import android.content.Context;
27
import android.content.DialogInterface;
28
import android.content.Intent;
29

    
30
import android.os.AsyncTask;
31
import android.os.Bundle;
32
import android.util.Log;
33
import android.view.View;
34
import android.view.View.OnClickListener;
35
import android.widget.AdapterView;
36
import android.widget.AdapterView.OnItemSelectedListener;
37
import android.widget.ArrayAdapter;
38
import android.widget.Button;
39
import android.widget.CheckBox;
40
import android.widget.Spinner;
41
import android.widget.Toast;
42

    
43
public class BackupServerActivity extends GaActivity implements OnItemSelectedListener, OnClickListener {
44
        
45
        private Server server;
46
        private Spinner weeklyBackupSpinner;
47
        private Spinner dailyBackupSpinner;
48
        private CheckBox enableCheckBox;
49
        private String selectedWeeklyBackup;
50
        private String selectedDailyBackup;
51
        
52
        /** Called when the activity is first created. */
53
    @Override
54
    public void onCreate(Bundle savedInstanceState) {
55
        super.onCreate(savedInstanceState);
56
        server = (Server) this.getIntent().getExtras().get("server");
57
        setContentView(R.layout.viewbackup); 
58
        setupSpinners();
59
            setupButtons();
60
            setupCheckBox(); 
61
    }
62

    
63
    private void setupSpinners(){
64
            weeklyBackupSpinner = (Spinner) findViewById(R.id.weekly_backup_spinner);
65
            ArrayAdapter<CharSequence> weeklyAdapter = ArrayAdapter.createFromResource(this, R.array.weeklyBackupValues, android.R.layout.simple_spinner_item);
66
            weeklyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
67
            weeklyBackupSpinner.setAdapter(weeklyAdapter);
68
            weeklyBackupSpinner.setOnItemSelectedListener(this);
69
            
70
            
71
            dailyBackupSpinner = (Spinner) findViewById(R.id.daily_backup_spinner);
72
            ArrayAdapter<CharSequence> dailyAdapter = ArrayAdapter.createFromResource(this, R.array.dailyBackupValues, android.R.layout.simple_spinner_item);
73
            dailyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
74
            dailyBackupSpinner.setAdapter(dailyAdapter);
75
            dailyBackupSpinner.setOnItemSelectedListener(this);
76
    }
77
    
78
        private void setupButtons() {
79
                Button update = (Button) findViewById(R.id.backup_update_button);
80
                update.setOnClickListener(this);
81
        }
82
        
83
        private void setupCheckBox(){
84
                enableCheckBox = (CheckBox) findViewById(R.id.enable_backup_checkbox);
85
        }
86
        
87
        private void showAlert(String title, String message) {
88
            try {
89
                AlertDialog alert = new AlertDialog.Builder(this).create();
90
                alert.setTitle(title);
91
                alert.setMessage(message);
92
                alert.setButton("OK", new DialogInterface.OnClickListener() {
93
              public void onClick(DialogInterface dialog, int which) {
94
                return;
95
            } }); 
96
                alert.show();
97
            } catch (Exception e) {
98
                    e.printStackTrace();
99
            }
100
    }
101

    
102
        public void onClick(View v) {
103
                /*
104
                 * server maybe null if another task is
105
                 * currently processing
106
                 */
107
                if(server == null){
108
                        showAlert("Error", "Server is busy.");
109
                }
110
                else{
111
                        trackEvent(CATEGORY_SERVER, EVENT_BACKUP, "", -1);
112
                        new BackupServerTask().execute((Void[]) null);
113
                }
114
        }
115

    
116
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
117
                if(parent == weeklyBackupSpinner){
118
                        selectedWeeklyBackup = Backup.getWeeklyValue(pos);
119
                }
120
                if(parent == dailyBackupSpinner){
121
                        selectedDailyBackup = Backup.getDailyValue(pos);
122
                }
123
                
124
        }
125

    
126
        public void onNothingSelected(AdapterView<?> parent) {
127
                //do nothing
128
        }
129
        
130
    private void showToast(String message) {
131
                Context context = getApplicationContext();
132
                int duration = Toast.LENGTH_SHORT;
133
                Toast toast = Toast.makeText(context, message, duration);
134
                toast.show();
135
    }
136
        
137
        private CloudServersException parseCloudServersException(HttpResponse response) {
138
                CloudServersException cse = new CloudServersException();
139
                try {
140
                    BasicResponseHandler responseHandler = new BasicResponseHandler();
141
                    String body = responseHandler.handleResponse(response);
142
                    CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
143
                    SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
144
                    XMLReader xmlReader = saxParser.getXMLReader();
145
                    xmlReader.setContentHandler(parser);
146
                    xmlReader.parse(new InputSource(new StringReader(body)));                            
147
                    cse = parser.getException();                            
148
                } catch (ClientProtocolException e) {
149
                        cse = new CloudServersException();
150
                        cse.setMessage(e.getLocalizedMessage());
151
                } catch (IOException e) {
152
                        cse = new CloudServersException();
153
                        cse.setMessage(e.getLocalizedMessage());
154
                } catch (ParserConfigurationException e) {
155
                        cse = new CloudServersException();
156
                        cse.setMessage(e.getLocalizedMessage());
157
                } catch (SAXException e) {
158
                        cse = new CloudServersException();
159
                        cse.setMessage(e.getLocalizedMessage());
160
                } catch (FactoryConfigurationError e) {
161
                        cse = new CloudServersException();
162
                        cse.setMessage(e.getLocalizedMessage());
163
                }
164
                return cse;
165
    }
166
        
167
        private void startServerError(String message, HttpBundle bundle){
168
                Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
169
                viewIntent.putExtra("errorMessage", message);
170
                viewIntent.putExtra("response", bundle.getResponseText());
171
                viewIntent.putExtra("request", bundle.getCurlRequest());
172
                startActivity(viewIntent);
173
        }
174
        
175
        private class BackupServerTask extends AsyncTask<Void, Void, HttpBundle> {
176
            
177
                private CloudServersException exception;
178
                
179
                @Override
180
                //let user know their process has started
181
                protected void onPreExecute(){
182
                        showToast("Changing backup schedule process has begun");
183
                }
184
                
185
                @Override
186
                protected HttpBundle doInBackground(Void... arg0) {
187
                        HttpBundle bundle = null;
188
                        try {
189
                                bundle = (new ServerManager()).backup(server, selectedWeeklyBackup, selectedDailyBackup, enableCheckBox.isChecked(), getApplicationContext());
190
                        } catch (CloudServersException e) {
191
                                exception = e;
192
                        }
193
                        return bundle;
194
                }
195
            
196
                @Override
197
                protected void onPostExecute(HttpBundle bundle) {
198
                        HttpResponse response = bundle.getResponse();
199
                        if (response != null) {
200
                                int statusCode = response.getStatusLine().getStatusCode();        
201
                                Log.d("statuscode", Integer.toString(statusCode));
202
                                if(statusCode == 204 || statusCode == 202){
203
                                        showToast("The server's backup schedule has been change.");
204
                                        finish();
205
                                }
206
                                else if (statusCode != 204 && statusCode != 202) {
207
                                        CloudServersException cse = parseCloudServersException(response);
208
                                        if ("".equals(cse.getMessage())) {
209
                                                startServerError("There was a problem changing the backup schedule.", bundle);
210
                                        } else {
211
                                                Log.d("info", "here");
212
                                                startServerError("There was a problem changing the backup schedule: " + cse.getMessage() + " " + statusCode, bundle);
213
                                        }
214
                                }
215
                        } else if (exception != null) {
216
                                startServerError("There was a problem changing the backup schedule: " + exception.getMessage(), bundle);
217
                                
218
                        }
219
                }
220
    }
221
}