Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ViewServerActivity.java @ 006434d8

History | View | Annotate | Download (25.1 kB)

1
/**
2
 * 
3
 */
4
package com.rackspacecloud.android;
5

    
6
import java.io.IOException;
7
import java.io.StringReader;
8
import java.util.Arrays;
9
import java.util.Iterator;
10

    
11
import javax.xml.parsers.FactoryConfigurationError;
12
import javax.xml.parsers.ParserConfigurationException;
13
import javax.xml.parsers.SAXParser;
14
import javax.xml.parsers.SAXParserFactory;
15

    
16
import org.apache.http.HttpResponse;
17
import org.apache.http.client.ClientProtocolException;
18
import org.apache.http.impl.client.BasicResponseHandler;
19
import org.xml.sax.InputSource;
20
import org.xml.sax.SAXException;
21
import org.xml.sax.XMLReader;
22

    
23
import android.app.Activity;
24
import android.app.AlertDialog;
25
import android.app.Dialog;
26
import android.content.Context;
27
import android.content.DialogInterface;
28
import android.content.Intent;
29
import android.graphics.Color;
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.Button;
36
import android.widget.EditText;
37
import android.widget.LinearLayout;
38
import android.widget.TextView;
39
import android.widget.Toast;
40

    
41
import com.rackspace.cloud.servers.api.client.CloudServersException;
42
import com.rackspace.cloud.servers.api.client.Flavor;
43
import com.rackspace.cloud.servers.api.client.Image;
44
import com.rackspace.cloud.servers.api.client.Server;
45
import com.rackspace.cloud.servers.api.client.ServerManager;
46
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
47
import com.rackspace.cloud.servers.api.client.parsers.CloudServersFaultXMLParser;
48

    
49
/**
50
 * @author Mike Mayo - mike.mayo@rackspace.com - twitter.com/greenisus
51
 *
52
 */
53
public class ViewServerActivity extends Activity {
54

    
55
        private Server server;
56
        private boolean ipAddressesLoaded; // to prevent polling from loading tons of duplicates
57
        private Flavor[] flavors;
58
        private String[] flavorNames;
59
        private String selectedFlavorId;
60
        Context context;
61
        //private boolean imageLoaded;
62
        private String modifiedServerName;
63
        private Image[] images;
64
        private String[] imageNames;
65
        private String selectedImageId;
66
        private boolean isPolling;
67
        private PollServerTask pollServerTask;
68
        private boolean canPoll;
69

    
70
        /** Called when the activity is first created. */
71
        @Override
72
        public void onCreate(Bundle savedInstanceState) {
73
                super.onCreate(savedInstanceState);
74
                server = (Server) this.getIntent().getExtras().get("server");
75
                context = getApplicationContext();
76
                setContentView(R.layout.viewserver);
77
                restoreState(savedInstanceState);
78
        }
79

    
80
        @Override
81
        protected void onSaveInstanceState(Bundle outState) {
82
                super.onSaveInstanceState(outState);
83
                outState.putSerializable("server", server);
84
                if(pollServerTask != null && isPolling){
85
                        pollServerTask.cancel(true);
86
                }
87
                outState.putBoolean("wasPolling", isPolling);
88
        }
89

    
90
        private void restoreState(Bundle state) {
91
                if(state != null && state.containsKey("wasPolling") && state.getBoolean("wasPolling") == true){
92
                        pollServerTask = new PollServerTask();
93
                        pollServerTask.execute((Void[]) null);
94
                }
95
                if (server == null && state != null && state.containsKey("server")) {
96
                        server = (Server) state.getSerializable("server");
97
                        //imageLoaded = state.getBoolean("imageLoaded");
98
                }
99
                canPoll = true;
100
                loadServerData();
101
                setupButtons();
102
                loadFlavors();
103
                loadImages();
104
        }
105
        /*
106
    private void loadImage() {
107
            // hate to do this, but devices run out of memory after a few rotations
108
            // because the background images are so large
109
            if (!imageLoaded) {
110
                    ImageView osLogo = (ImageView) findViewById(R.id.view_server_os_logo);
111
                    osLogo.setAlpha(100);
112
                    osLogo.setImageResource(server.getImage().logoResourceId());
113
                    imageLoaded = true;
114
            }
115

116
    }
117
         */  
118

    
119
        /*
120
         * need to manage the polling task
121
         * if the activity is stopped
122
         */
123
        @Override
124
        public void onStop(){
125
                super.onStop();
126
                if(pollServerTask != null && isPolling){
127
                        pollServerTask.cancel(true);
128
                        isPolling = true;
129
                }
130
                canPoll = false;
131

    
132
        }
133

    
134
        /*
135
         * restart the pollingtask 
136
         * if it was running before
137
         * 
138
         */
139
        @Override
140
        public void onStart(){
141
                super.onStart();
142
                if(isPolling){
143
                        pollServerTask = new PollServerTask();
144
                        pollServerTask.execute((Void[]) null);
145
                }
146
                canPoll = true;
147

    
148
        }
149

    
150
        private void loadServerData() {
151
                TextView name = (TextView) findViewById(R.id.view_server_name);
152
                name.setText(server.getName());
153

    
154
                TextView os = (TextView) findViewById(R.id.view_server_os);
155
                os.setText(server.getImage().getName());
156

    
157
                TextView memory = (TextView) findViewById(R.id.view_server_memory);
158
                memory.setText(server.getFlavor().getRam() + " MB");
159

    
160
                TextView disk = (TextView) findViewById(R.id.view_server_disk);
161
                disk.setText(server.getFlavor().getDisk() + " GB");
162

    
163
                TextView status = (TextView) findViewById(R.id.view_server_status);
164

    
165
                // show status and possibly the progress, with polling
166
                if (!"ACTIVE".equals(server.getStatus())) {
167
                        status.setText(server.getStatus() + " - " + server.getProgress() + "%");
168
                        pollServerTask = new PollServerTask();
169
                        pollServerTask.execute((Void[]) null);
170
                } else {
171
                        status.setText(server.getStatus());
172
                }
173

    
174
                if (!ipAddressesLoaded) {
175
                        // public IPs
176
                        int layoutIndex = 12; // public IPs start here
177
                        LinearLayout layout = (LinearLayout) this.findViewById(R.id.view_server_layout);            
178
                        String publicIps[] = server.getPublicIpAddresses();
179
                        for (int i = 0; i < publicIps.length; i++) {
180
                                TextView tv = new TextView(this.getBaseContext());
181
                                tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
182
                                tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
183
                                tv.setTextSize(os.getTextSize());
184
                                tv.setTextColor(Color.WHITE);
185
                                tv.setText(publicIps[i]);
186
                                layout.addView(tv, layoutIndex++);
187
                        }
188

    
189
                        // private IPs
190
                        layoutIndex++; // skip over the Private IPs label
191
                        String privateIps[] = server.getPrivateIpAddresses();
192
                        for (int i = 0; i < privateIps.length; i++) {
193
                                TextView tv = new TextView(this.getBaseContext());
194
                                tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
195
                                tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
196
                                tv.setTextSize(os.getTextSize());
197
                                tv.setTextColor(Color.WHITE);
198
                                tv.setText(privateIps[i]);
199
                                layout.addView(tv, layoutIndex++);
200
                        }
201
                        ipAddressesLoaded = true;
202
                }
203

    
204
                //loadImage();
205
        }
206

    
207
        private void loadFlavors() {
208
                flavorNames = new String[Flavor.getFlavors().size()]; 
209
                flavors = new Flavor[Flavor.getFlavors().size()];
210

    
211
                Iterator<Flavor> iter = Flavor.getFlavors().values().iterator();
212
                int i = 0;
213
                while (iter.hasNext()) {
214
                        Flavor flavor = iter.next();
215
                        flavors[i] = flavor;
216
                        flavorNames[i] = flavor.getName() + ", " + flavor.getDisk() + " GB disk";
217
                        i++;
218
                }
219
                selectedFlavorId = flavors[0].getId();
220
        }
221

    
222
        private void loadImages() {
223
                imageNames = new String[Image.getImages().size()]; 
224
                images = new Image[Image.getImages().size()];
225

    
226
                Iterator<Image> iter = Image.getImages().values().iterator();
227
                int i = 0;
228
                while (iter.hasNext()) {
229
                        Image image = iter.next();
230
                        images[i] = image;
231
                        imageNames[i] = image.getName(); 
232
                        i++;
233
                }
234
                //sort arrays so they display nicely in the spinner
235
                Arrays.sort(images);
236
                Arrays.sort(imageNames);
237
                selectedImageId = images[0].getId();
238

    
239
        }
240

    
241
        private void setupButton(int resourceId, OnClickListener onClickListener) {
242
                Button button = (Button) findViewById(resourceId);
243
                button.setOnClickListener(onClickListener);
244
        }
245

    
246
        private void setupButtons() {
247
                setupButton(R.id.view_server_soft_reboot_button, new OnClickListener() {
248
                        public void onClick(View v) {
249
                                showDialog(R.id.view_server_soft_reboot_button);
250
                        }
251
                });
252

    
253
                setupButton(R.id.view_server_hard_reboot_button, new OnClickListener() {
254
                        public void onClick(View v) {
255
                                showDialog(R.id.view_server_hard_reboot_button);
256
                        }
257
                });
258

    
259
                setupButton(R.id.view_server_resize_button, new OnClickListener() {
260
                        public void onClick(View v) {
261
                                showDialog(R.id.view_server_resize_button);
262
                        }
263
                });
264

    
265
                setupButton(R.id.view_server_delete_button, new OnClickListener() {
266
                        public void onClick(View v) {
267
                                showDialog(R.id.view_server_delete_button);
268
                        }
269
                });
270

    
271
                setupButton(R.id.view_server_rename_button, new OnClickListener() {
272
                        public void onClick(View v) {
273
                                showDialog(R.id.view_server_rename_button);
274
                        }
275
                });
276

    
277
                setupButton(R.id.view_server_rebuild_button, new OnClickListener() {
278
                        public void onClick(View v) {
279
                                showDialog(R.id.view_server_rebuild_button);
280
                        }
281
                });
282

    
283

    
284
                setupButton(R.id.view_server_backup_button, new OnClickListener() {
285
                        public void onClick(View v) {
286
                                Intent viewIntent = new Intent(v.getContext(), BackupServerActivity.class);
287
                                viewIntent.putExtra("server", server);
288
                                startActivity(viewIntent);
289
                        }
290
                });
291

    
292
                setupButton(R.id.view_server_password_button, new OnClickListener() {
293
                        public void onClick(View v) {
294
                                Intent viewIntent = new Intent(v.getContext(), PasswordServerActivity.class);
295
                                viewIntent.putExtra("server", server);
296
                                startActivity(viewIntent);
297
                        }
298
                });
299

    
300
                setupButton(R.id.view_server_ping_button, new OnClickListener() {
301
                        public void onClick(View v) {
302
                                Intent viewIntent = new Intent(v.getContext(), PingServerActivity.class);
303

    
304
                                //ping the first public ip
305
                                viewIntent.putExtra("ipAddress", server.getPublicIpAddresses()[0]);
306
                                startActivity(viewIntent);
307

    
308

    
309
                        }
310
                });
311

    
312
        }
313

    
314
        private void showToast(String message) {
315
                Context context = getApplicationContext();
316
                int duration = Toast.LENGTH_SHORT;
317
                Toast toast = Toast.makeText(context, message, duration);
318
                toast.show();
319
        }
320

    
321
        /**
322
         * @return the server
323
         */
324
        public Server getServer() {
325
                return server;
326
        }
327

    
328
        /**
329
         * @param server the server to set
330
         */
331
        public void setServer(Server server) {
332
                this.server = server;
333
        }
334

    
335
        private void startServerError(String message, HttpBundle bundle){
336
                Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
337
                viewIntent.putExtra("errorMessage", message);
338
                viewIntent.putExtra("response", bundle.getResponseText());
339
                viewIntent.putExtra("request", bundle.getCurlRequest());
340
                startActivity(viewIntent);
341
        }
342
        
343
        private String prints(Object[] arr){
344
                String result = "";
345
                for(int i = 0; i < arr.length; i++){
346
                        result += arr[i] + " ";
347
                }
348
                return result;
349
        }
350

    
351
        @Override
352
        protected Dialog onCreateDialog(int id) {
353
                if(server == null){
354
                        return new AlertDialog.Builder(ViewServerActivity.this)
355
                        .setIcon(R.drawable.alert_dialog_icon)
356
                        .setTitle("Error")
357
                        .setMessage("Server is Busy")
358
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
359
                                public void onClick(DialogInterface dialog, int whichButton) {
360
                                        // User clicked Cancel so do some stuff
361
                                }
362
                        })
363
                        .create();
364
                }
365
                else{
366
                        switch (id) {
367
                        case R.id.view_server_soft_reboot_button:
368
                                return new AlertDialog.Builder(ViewServerActivity.this)
369
                                .setIcon(R.drawable.alert_dialog_icon)
370
                                .setTitle("Soft Reboot")
371
                                .setMessage("Are you sure you want to perform a soft reboot?")
372
                                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
373
                                        public void onClick(DialogInterface dialog, int whichButton) {
374
                                                // User clicked OK so do some stuff
375
                                                new SoftRebootServerTask().execute((Void[]) null);
376
                                        }
377
                                })
378
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
379
                                        public void onClick(DialogInterface dialog, int whichButton) {
380
                                                // User clicked Cancel so do some stuff
381
                                        }
382
                                })
383
                                .create();
384
                        case R.id.view_server_hard_reboot_button:
385
                                return new AlertDialog.Builder(ViewServerActivity.this)
386
                                .setIcon(R.drawable.alert_dialog_icon)
387
                                .setTitle("Hard Reboot")
388
                                .setMessage("Are you sure you want to perform a hard reboot?")
389
                                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
390
                                        public void onClick(DialogInterface dialog, int whichButton) {
391
                                                // User clicked OK so do some stuff
392
                                                new HardRebootServerTask().execute((Void[]) null);
393
                                        }
394
                                })
395
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
396
                                        public void onClick(DialogInterface dialog, int whichButton) {
397
                                                // User clicked Cancel so do some stuff
398
                                        }
399
                                })
400
                                .create();
401
                        case R.id.view_server_resize_button:
402
                                Log.d("info", "the flavor names are " + prints(flavorNames));
403
                                return new AlertDialog.Builder(ViewServerActivity.this)
404
                                .setItems(flavorNames, new ResizeClickListener())
405
                                .setIcon(R.drawable.alert_dialog_icon)
406
                                .setTitle("Resize Server")
407
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
408
                                        public void onClick(DialogInterface dialog, int whichButton) {
409
                                                // User clicked Cancel so do some stuff
410
                                        }
411
                                })
412
                                .create();
413
                        case R.id.view_server_delete_button:
414
                                return new AlertDialog.Builder(ViewServerActivity.this)
415
                                .setIcon(R.drawable.alert_dialog_icon)
416
                                .setTitle("Delete Server")
417
                                .setMessage("Are you sure you want to delete this server?  This operation cannot be undone and all backups will be deleted.")
418
                                .setPositiveButton("Delete Server", new DialogInterface.OnClickListener() {
419
                                        public void onClick(DialogInterface dialog, int whichButton) {
420
                                                // User clicked OK so do some stuff
421
                                                new DeleteServerTask().execute((Void[]) null);
422
                                        }
423
                                })
424
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
425
                                        public void onClick(DialogInterface dialog, int whichButton) {
426
                                                // User clicked Cancel so do some stuff
427
                                        }
428
                                })
429
                                .create();          
430
                        case R.id.view_server_rename_button:
431
                                final EditText input = new EditText(this);
432
                                input.setText(server.getName());
433
                                return new AlertDialog.Builder(ViewServerActivity.this)
434
                                .setIcon(R.drawable.alert_dialog_icon)
435
                                .setView(input)
436
                                .setTitle("Rename")
437
                                .setMessage("Enter new name for server: ")                         
438
                                .setPositiveButton("Rename", new DialogInterface.OnClickListener() {
439
                                        public void onClick(DialogInterface dialog, int whichButton) {
440
                                                // User clicked OK so do some stuff
441
                                                modifiedServerName = input.getText().toString();
442
                                                new RenameServerTask().execute((Void[]) null);
443
                                        }
444
                                })
445
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
446
                                        public void onClick(DialogInterface dialog, int whichButton) {
447
                                                // User clicked Cancel so do some stuff
448
                                        }
449
                                })
450
                                .create();     
451
                        case R.id.view_server_rebuild_button:
452
                                return new AlertDialog.Builder(ViewServerActivity.this)
453
                                .setItems(imageNames, new RebuildClickListener())
454
                                .setIcon(R.drawable.alert_dialog_icon)
455
                                .setTitle("Rebuild Server")
456
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
457
                                        public void onClick(DialogInterface dialog, int whichButton) {
458
                                                // User clicked Cancel so do some stuff
459
                                        }
460
                                })
461
                                .create();
462
                        }
463
                }
464
                return new AlertDialog.Builder(ViewServerActivity.this)
465
                .setIcon(R.drawable.alert_dialog_icon)
466
                .setTitle("Error")
467
                .setMessage("Server is Busy")
468
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
469
                        public void onClick(DialogInterface dialog, int whichButton) {
470
                                // User clicked Cancel so do some stuff
471
                        }
472
                })
473
                .create();
474
        }
475

    
476
        private class ResizeClickListener implements android.content.DialogInterface.OnClickListener {
477

    
478
                public void onClick(DialogInterface dialog, int which) {
479
                        //need to add one because server flavors state at index 1
480
                        selectedFlavorId = which + 1 + "";
481
                        new ResizeServerTask().execute((Void[]) null);
482
                }
483

    
484
        }
485

    
486
        private class RebuildClickListener implements android.content.DialogInterface.OnClickListener {
487

    
488
                public void onClick(DialogInterface dialog, int which) {
489
                        selectedImageId = images[which].getId() + "";
490
                        new RebuildServerTask().execute((Void[]) null);
491
                }
492

    
493
        }
494

    
495
        private CloudServersException parseCloudServersException(HttpResponse response) {
496
                CloudServersException cse = new CloudServersException();
497
                try {
498
                        BasicResponseHandler responseHandler = new BasicResponseHandler();
499
                        String body = responseHandler.handleResponse(response);
500
                        CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
501
                        SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
502
                        XMLReader xmlReader = saxParser.getXMLReader();
503
                        xmlReader.setContentHandler(parser);
504
                        xmlReader.parse(new InputSource(new StringReader(body)));                            
505
                        cse = parser.getException();                            
506
                } catch (ClientProtocolException e) {
507
                        cse = new CloudServersException();
508
                        cse.setMessage(e.getLocalizedMessage());
509
                } catch (IOException e) {
510
                        cse = new CloudServersException();
511
                        cse.setMessage(e.getLocalizedMessage());
512
                } catch (ParserConfigurationException e) {
513
                        cse = new CloudServersException();
514
                        cse.setMessage(e.getLocalizedMessage());
515
                } catch (SAXException e) {
516
                        cse = new CloudServersException();
517
                        cse.setMessage(e.getLocalizedMessage());
518
                } catch (FactoryConfigurationError e) {
519
                        cse = new CloudServersException();
520
                        cse.setMessage(e.getLocalizedMessage());
521
                }
522
                return cse;
523
        }
524

    
525
        // HTTP request tasks
526

    
527
        private class PollServerTask extends AsyncTask<Void, Void, Server> {
528

    
529
                private Server tempServer;
530

    
531
                @Override 
532
                protected void onPreExecute(){
533
                        isPolling = true;
534
                }
535

    
536
                @Override
537
                protected Server doInBackground(Void... arg0) {
538
                        if(isCancelled() || !canPoll){
539
                                return null;
540
                        }
541
                        try {
542
                                tempServer = (new ServerManager()).find(Integer.parseInt(server.getId()), context);
543
                        } catch (NumberFormatException e) {
544
                                // we're polling, so need to show exceptions
545
                        } catch (CloudServersException e) {
546
                                // we're polling, so need to show exceptions
547
                        }
548
                        return tempServer;
549
                }
550

    
551
                @Override
552
                protected void onPostExecute(Server result) {
553
                        server = result;
554
                        if(server != null){
555
                                loadServerData();
556
                        }
557
                        isPolling = false;
558
                }
559

    
560
                @Override
561
                protected void onCancelled (){
562
                        isPolling = false;
563
                }
564

    
565
        }
566

    
567

    
568
        private class SoftRebootServerTask extends AsyncTask<Void, Void, HttpBundle> {
569

    
570
                private CloudServersException exception;
571

    
572
                @Override
573
                //let user know their process has started
574
                protected void onPreExecute(){
575
                        showToast("Reboot process has begun");
576
                }
577

    
578
                @Override
579
                protected HttpBundle doInBackground(Void... arg0) {
580
                        HttpBundle bundle = null;
581
                        try {
582
                                bundle = (new ServerManager()).reboot(server, ServerManager.SOFT_REBOOT, context);
583
                        } catch (CloudServersException e) {
584
                                exception = e;
585
                        }
586
                        return bundle;
587
                }
588

    
589
                @Override
590
                protected void onPostExecute(HttpBundle bundle) {
591
                        HttpResponse response = bundle.getResponse();
592
                        if (response != null) {
593
                                int statusCode = response.getStatusLine().getStatusCode();        
594
                                if(statusCode == 202){ showToast("Reboot successful"); }
595
                                if (statusCode != 202) {
596
                                        CloudServersException cse = parseCloudServersException(response);
597
                                        if ("".equals(cse.getMessage())) {
598
                                                startServerError("There was a problem rebooting your server.", bundle);
599
                                        } else {
600
                                                startServerError("There was a problem rebooting your server: " + cse.getMessage(), bundle);
601
                                        }
602
                                }
603
                        } else if (exception != null) {
604
                                startServerError("There was a problem rebooting your server: " + exception.getMessage(), bundle);
605

    
606
                        }
607
                }
608
        }
609

    
610
        private class HardRebootServerTask extends AsyncTask<Void, Void, HttpBundle> {
611

    
612
                private CloudServersException exception;
613

    
614
                @Override
615
                //let user know their process has started
616
                protected void onPreExecute(){
617
                        showToast("Reboot process has begun");
618
                }
619

    
620
                @Override
621
                protected HttpBundle doInBackground(Void... arg0) {
622
                        HttpBundle bundle = null;                
623
                        try {
624
                                bundle = (new ServerManager()).reboot(server, ServerManager.HARD_REBOOT, context);
625
                        } catch (CloudServersException e) {
626
                                exception = e;
627
                        }
628
                        return bundle;
629
                }
630

    
631
                @Override
632
                protected void onPostExecute(HttpBundle bundle) {
633
                        HttpResponse response = bundle.getResponse();
634
                        if (response != null) {
635
                                int statusCode = response.getStatusLine().getStatusCode();        
636
                                if(statusCode == 202){ showToast("Reboot successful"); }
637
                                if (statusCode != 202) {
638
                                        CloudServersException cse = parseCloudServersException(response);
639
                                        if ("".equals(cse.getMessage())) {
640
                                                startServerError("There was a problem rebooting your server.", bundle);
641
                                        } else {
642
                                                startServerError("There was a problem rebooting your server: " + cse.getMessage(), bundle);
643
                                        }
644
                                }
645
                        } else if (exception != null) {
646
                                startServerError("There was a problem rebooting your server: " + exception.getMessage(), bundle);
647

    
648
                        }
649
                }
650
        }
651

    
652
        private class ResizeServerTask extends AsyncTask<Void, Void, HttpBundle> {
653

    
654
                private CloudServersException exception;
655

    
656
                @Override
657
                protected void onPreExecute(){
658
                        showToast("Resize process has begun, please confirm your resize after process finishes.");
659
                }
660

    
661
                @Override
662
                protected HttpBundle doInBackground(Void... arg0) {
663
                        HttpBundle bundle = null;        
664
                        try {
665
                                bundle = (new ServerManager()).resize(server, Integer.parseInt(selectedFlavorId), context);
666
                        } catch (CloudServersException e) {
667
                                exception = e;
668
                        }
669
                        return bundle;
670
                }
671

    
672
                @Override
673
                protected void onPostExecute(HttpBundle bundle) {
674
                        HttpResponse response = bundle.getResponse();
675
                        if (response != null) {
676
                                int statusCode = response.getStatusLine().getStatusCode();                        
677
                                if (statusCode == 202) {
678
                                        pollServerTask = new PollServerTask();
679
                                        pollServerTask.execute((Void[]) null);
680
                                } else {                                        
681
                                        CloudServersException cse = parseCloudServersException(response);
682
                                        if ("".equals(cse.getMessage())) {
683
                                                startServerError("There was a problem resizing your server.", bundle);
684
                                        } else {
685
                                                startServerError("There was a problem resizing your server: " + cse.getMessage(), bundle);
686
                                        }                                        
687
                                }
688
                        } else if (exception != null) {
689
                                startServerError("There was a problem resizing your server: " + exception.getMessage(), bundle);
690

    
691
                        }
692

    
693
                }
694
        }
695

    
696

    
697
        public class DeleteServerTask extends AsyncTask<Void, Void, HttpBundle> {
698

    
699
                private CloudServersException exception;
700

    
701
                @Override
702
                //let user know their process has started
703
                protected void onPreExecute(){
704
                        showToast("Delete process has begun");
705
                }
706
                @Override
707
                protected HttpBundle doInBackground(Void... arg0) {
708
                        HttpBundle bundle = null;
709
                        try {
710
                                bundle = (new ServerManager()).delete(server, context);
711
                        } catch (CloudServersException e) {
712
                                exception = e;
713
                        }
714
                        return bundle;
715
                }
716

    
717
                @Override
718
                protected void onPostExecute(HttpBundle bundle) {
719
                        HttpResponse response = bundle.getResponse();
720
                        if (response != null) {
721
                                int statusCode = response.getStatusLine().getStatusCode();
722
                                if (statusCode == 202) {
723
                                        showToast("Delete successful");
724
                                        setResult(Activity.RESULT_OK);
725
                                        finish();
726
                                } else {
727
                                        CloudServersException cse = parseCloudServersException(response);
728
                                        if ("".equals(cse.getMessage())) {
729
                                                startServerError("There was a problem deleting your server.", bundle);
730
                                        } else {
731
                                                startServerError("There was a problem deleting your server: " + cse.getMessage(), bundle);
732
                                        }
733
                                }
734
                        } else if (exception != null) {
735
                                startServerError("There was a problem deleting your server: " + exception.getMessage(), bundle);                                
736
                        }                        
737
                }
738
        }
739

    
740
        private class RenameServerTask extends AsyncTask<Void, Void, HttpBundle> {
741

    
742
                private CloudServersException exception;
743

    
744
                @Override
745
                //let user know their process has started
746
                protected void onPreExecute(){
747
                        showToast("Rename process has begun.");
748
                }
749

    
750
                @Override
751
                protected HttpBundle doInBackground(Void... arg0) {
752
                        HttpBundle bundle = null;
753
                        try {
754
                                bundle = (new ServerManager()).rename(server, modifiedServerName, context);
755
                        } catch (CloudServersException e) {
756
                                exception = e;
757
                        }
758
                        return bundle;
759
                }
760

    
761
                @Override
762
                protected void onPostExecute(HttpBundle bundle) {
763
                        HttpResponse response = bundle.getResponse();
764
                        if (response != null) {
765
                                int statusCode = response.getStatusLine().getStatusCode();        
766
                                if (statusCode == 204) {        
767
                                        showToast("Rename successful");
768
                                        pollServerTask = new PollServerTask();
769
                                        pollServerTask.execute((Void[]) null);
770
                                } else {
771
                                        CloudServersException cse = parseCloudServersException(response);
772
                                        if ("".equals(cse.getMessage())) {
773
                                                startServerError("There was a problem renaming your server.", bundle);
774
                                        } else {
775
                                                startServerError("There was a problem renaming your server: " + cse.getMessage(), bundle);
776
                                        }                                        
777
                                }
778
                        }
779
                        else if (exception != null) {
780
                                startServerError("There was a problem renaming your server: " + exception.getMessage(), bundle);        
781
                        }
782
                }
783

    
784
        }
785

    
786
        private class RebuildServerTask extends AsyncTask<Void, Void, HttpBundle> {
787

    
788
                private CloudServersException exception;
789

    
790
                @Override
791
                protected void onPreExecute(){
792
                        showToast("Rebuild process has begun");
793
                }
794

    
795
                @Override
796
                protected HttpBundle doInBackground(Void... arg0) {
797
                        HttpBundle bundle = null;
798
                        try {
799
                                bundle = (new ServerManager()).rebuild(server, Integer.parseInt(selectedImageId), context);
800
                        } catch (CloudServersException e) {
801
                                exception = e;
802
                        }
803
                        return bundle;
804
                }
805

    
806
                @Override
807
                protected void onPostExecute(HttpBundle bundle) {
808
                        HttpResponse response = bundle.getResponse();
809
                        if (response != null) {
810
                                int statusCode = response.getStatusLine().getStatusCode();                        
811
                                if (statusCode == 202) {
812
                                        pollServerTask = new PollServerTask();
813
                                        pollServerTask.execute((Void[]) null);
814
                                } else {                                        
815
                                        CloudServersException cse = parseCloudServersException(response);
816
                                        if ("".equals(cse.getMessage())) {
817
                                                startServerError("There was a problem rebuilding your server.", bundle);
818
                                        } else {
819
                                                startServerError("There was a problem rebuilding your server: " + cse.getMessage(), bundle);
820
                                        }                                        
821
                                }
822
                        } else if (exception != null) {
823
                                startServerError("There was a problem rebuilding your server: " + exception.getMessage(), bundle);
824
                        }
825

    
826
                }
827
        }
828

    
829

    
830
}